- Labornetzteil AliExpress         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 25

Thema: Töne/Musik durch D/A-Wandler?

  1. #11
    Erfahrener Benutzer Fleißiges Mitglied Avatar von wawa
    Registriert seit
    18.12.2007
    Ort
    Berlin
    Alter
    73
    Beiträge
    164
    Anzeige

    Praxistest und DIY Projekte
    @killer

    zurueck zur ersten Frage: natuerlich
    ein sehr einfacher Weg ist die Toene selbst als Noten abzulegen und den Takt dazu. Das ist sehr sparsam. Du must dann aber jeden Ton erzeugen, mit genuegend Abtaststellen, das verringert das Rauschen. Wichtig bei all diesen Vorgaengen ist die Mathematik. Du brauchst mindestens die doppelte Wiedergabefrequenz deiner hoechsten wiederzugebenden Frequenz. In diesem hatten einige Vorgaenger recht, wenn man digital ausgibt, muss man sich an das vorliegende Format halten. Wenn sehr hoch abgetastet wird - must du auch mit dieser Rate die Werte ausgeben. Macht aber das Filter dahinter sehr viel kleiner und einfacher.
    Ich hoffe das hilft. Probier einfach mal einen Ton auszugeben mit 4 und dann mit 8 Stuetzstellen, ohne Filter. Du wirst es hoeren.
    Du brauchst NUR den Sinus zu rechnen. Vorsicht aber bei dem DAC, wenn er nur positive Spannung erzeugt, musst du einen Offset dazurechnen und mit einem genuegend grossen C auskoppeln.
    mfg

    wawa

  2. #12
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.01.2007
    Beiträge
    209
    Angenommen ich würde mit dem AVR eine winzige Liedstelle aufnehmen und dann per PWM wiedergeben (alles 8Bit und andere Hürden aussen vor), klänge das Wiedergegebene noch nach dem eingespeistem Lied oder nach "rumgepipse"?

    MfG Killer

  3. #13
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Bild hier  
    http://www.youtube.com/watch?v=Yw3iHIym58k

    Die Hardware:

    - Aktivlautsprecherboxen mit PC oder MP3-Player
    - PC-Speaker aus einem alten PC (8Ohm)
    - Chinch-Servo-Adapter
    - Servo-XBus-Adapter
    - ein RP6 mit 8MHz-ATMega32

    Die Software:

    Code:
    // RP6 als Tonband 1.Versuch                                      30.12.2007 mic
    
    #include "RP6RobotBaseLib.h"
    
    int main(void)
    {
    	initRobotBase();
    	extIntOFF();
    	DDRC |= 1;
    
    	cli();
    
    	while(1)
    	{
    	   if (PINA & E_INT1)
    		{
    			setLEDs(1);
    			PORTC |= 1;
    		}
    		else
    		{
    			setLEDs(0);
    			PORTC &= ~1;
    		}
    	}
    	
    	return(0);
    }
    Das analoge Lautsprechersignal liegt an PortA.4, der Speaker an PortC.0. Was an PA4 erkannt wird, wird direkt an PC0 wieder ausgegeben und zur Kontrolle an der LED angezeigt. Lautstärke wird langsam aufgedreht bis die LED flackert und der Speaker piept. Fehlt noch das Speichern und die Wiedergabe.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #14
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.652
    Also ich wollte immer schon mal ein lustiges Pfeiffen aus dem µC bringen. Ok, ok, der Tiefpass war noch nie richtig ausgelegt und der Piezo ist auch nicht wirklich geeignet. Aber was denkt Ihr - hab ich da überhaupt ne Chance. Ich denk an Töne wie beim R2D2 - oder beim Wasserkocher mit Pfeiffe
    Ciao sagt der JoeamBerg

  5. #15
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.01.2007
    Beiträge
    209
    Für solche kleinen Töne gibt es ja beispielsweise unter Bascom einen Befehl wie "Sound" wodurch man an jedem beliebigen I/O Pin einen Ton bzw. Piepsen erzeugen kann.

    MfG Killer

  6. #16
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Solange die Töne ungefähr gleich laut sind macht das mit den 8 Bit keine Probleme. Ein piepsiger Ton kommt eher durch einen kleinen Lautprecher, nicht durch 8 Bit daten. Es könnten eventuell die Höhen fehlen, weil man die Abtastrate nicht so hoch wählen will. Das wird am ehesten mit dem Telefon vergleichbar. Zum Ausprobieren kann man ja man am PC mit den Datenformaten (8 Bit Wav) spielen. Das wird vom AVR auch nicht schlechter klingen, wenn die Lautsprecher stimmen.

  7. #17
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.652
    Zitat Zitat von Killer
    Für solche kleinen Töne ... Bascom einen Befehl ...
    Ach je, schade, ich spreche nur Assembler und C (und C noch dazu recht schlecht [-o< )
    Ciao sagt der JoeamBerg

  8. #18
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.01.2007
    Beiträge
    209
    Dann teste ih es demnächst mal.
    Habe ich es bezüglich dem PWM Signal richtig verstanden, dass beide Signalleitungen (in diesem Fall für den Lautsprecher + und - ) vom µC ausgehen?

    MfG Killer

  9. #19
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Auch wenn das Interesse eher gering ist, habe es noch weiter versucht. Hier nun eine Lösung ohne ADC und ohne PWM. Es ist blechern und kurz, aber mit etwas Phantasie kann man es erkennen:
    Bild hier  
    http://www.youtube.com/watch?v=-XpAL3PlMAw

    Das unkomfortable Progamm (888Bytes) löscht nach dem Start den Speicher, liest die Daten ein bis der Speicher voll ist und spielt dann endlos:
    Code:
    // RP6 als Tonband mit Aufnehmen und Abspielen                    30.12.2007 mic
    
    #include "rblib.h" 											// bindet u.a io.h und stdlib.h ein
    #include "rblib.c" 											// und dient vorrangig dem Debuggen
    #define speichergroesse 1536                       // der Mega32 hat nur 2kb sram
    
    int main(void)
    {
    uint8_t speicher[speichergroesse], temp, bit_nr;   // Speicherplatz bereitstellen
    uint16_t byte_nr, i, dummy;                        // und ein paar Hilfsvariablen
    
    	rblib_init();                                   // ein paar Initialisierungen
    	setMotorPWM(0,0);                               // PWM=0 sperrt den Interrupt
    	PORTA &= ~(1 << PINA4);                         // PINA4 liest die Daten ein
    	DDRA &= ~(1 << PINA4);
    	DDRC |= (1 << PINC0);                           // an PINC0 hängt der Speaker
    	byte_nr=0;                                      // Zähler für die Bytes
    	bit_nr=8;                                       // Zähler für die Bits
       for(i=0;i<speichergroesse;i++) speicher[i]=0;   // Speicher löschen
    	while(0)                                        // Zum Einstellen des Pegels
    	{                                               // wird nicht verwendet
    		if (PINA & (1 << PINA4))
    		{
    		   setLEDs(1);
    			PORTC |= (1 << PINC0);
    		}
    		else
    		{
    		   setLEDs(0);
    			PORTC &= ~(1 << PINC0);
    		}
    		for(i=0;i<150;i++) dummy+=i;
    	}
    
    	cli();                                 // Keine Störung zulassen, wir lesen ein
    	do                                     // Schleife der Datenbytes
    	{
    		do                                  // Schleife der Bits
    		{
    			if (PINA & (1 << PINA4))         // Pegel als High erkannt?
    			{
    				setLEDs(1);                   // Ja, LED an
    				PORTC |= (1 << PINC0);        // Speaker an
    				speicher[byte_nr] += 1;       // und Bit0 im Datenbyte setzen
    			}
    			else
    			{
    				setLEDs(0);                   // Nein, LED aus
    				PORTC &= ~(1 << PINC0);       // Speaker aus
    				speicher[byte_nr] += 0;       // für's Timing Bit0 nicht setzen
    			}
    			speicher[byte_nr] *= 2;          // Speicherbyte nach links shiften
    			for(i=0;i<300;i++) dummy+=i;     // kurze Verzögerung, wir samplen mit 8MHz!
    		}
    		while(--bit_nr);                    // nächstes Bit einlesen
    		bit_nr=8;                           // acht Bit komplett
    	}
    	while(byte_nr++ < speichergroesse);    // nächstes Byte bis Speicher voll
    	sei();                                 // eigentlich nicht nötig
    	
    while(1)                                  // und nun endlos abspielen
    {
    	byte_nr=0;                             // erstes Byte
    	bit_nr=8;                              // jeweils 8 Bits
    	cli();                                 // wieder keine Störungen zulassen
    	do                                     // Schleife der Bytes
    	{
    		temp = speicher[byte_nr];           // Byte zwischenspeichern
    		do                                  // Schleife der Bits
    		{
    			if (temp > 127)                  // Bit 7 gesetzt?
    			{
    				setLEDs(1);                   // Ja, LED an
    				PORTC |= (1 << PINC0);        // Speaker an
    			}
    			else
    			{
    				setLEDs(0);                   // Nein, LED aus
    				PORTC &= ~(1 << PINC0);       // Speaker aus
    			}
    			temp *= 2;                       // Byte nach links shiften
    			for(i=0;i<300;i++) dummy+=i;     // wieder kurz warten (speichern fehlt!)
    		}
    		while(--bit_nr);                    // nächstes Bit
    		bit_nr=8;                           // acht Bits fertig
    	}
    	while(byte_nr++ < speichergroesse);    // nächstes Byte bis Speicherende
    	sei();                                 
    }
    	return(0);                             // das war's. Einfach und blechern
    }
    Leider hat der Mega32 nur 2kb SRam, vielleicht geht's auch mit dem Flash...

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  10. #20
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    hi radbruch,
    da hast du mal wieder was umgesetzt, während noch diskutiert wird, ob es umsetzbar ist
    ich bin sicher, deine grundlagenforschung wird noch gewürdigt werden, und dein code verwendung finden. könntest du mal ein bisschen sprache "samplen"? wäre sicher interessant, wie das klingt.

    gruesse

    EDIT:
    an shaun hätte ich noch fragen: beeinflusst der lautsprecher den gewichteten DAC nicht? und fliesst der strom nicht teilweise über den 12ohm widerstand wieder über den µC, wenn dessen pin low ist?

    EDIT2 @ oberallgeier: wie ein teekessel oder so wie r2d2 wird es anfangs nicht pfeifen können, aber wenn du ein rechtecksignal mit verschiedenen frequenzen über einen vorwiderstand (oder ideal mit einem transistor als verstärker.. oder noch idealer mit einem kleinen audio verstärker wie dem tba820) an einen lautsprecher gibst, sollte immerhin schon etwas zu hören sein. das hier http://www.elby-designs.com/avrsynth/8535-3.wav klingt ja schon ganz ordentlich für einen avr.

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad