Guten Morgen liebe Community, Ich möchte einen Class D Verstärker selbst bauen, mit Hilfe eines ATtiny85. An die Audioqualität sind keine hohen Ansprüche gestellt. Der Verstärker soll lediglich für den Baggersee zum Einsatz kommen. Meine Idee: Das Audiosignal wird an den ADC (10-Bit) des ATtiny85 angelegt. ADC2 wird als differenzieller Eingang betrieben. Der ADC ließt dauerhaft im Free-Running-Mode aus und der µC generiert daraufhin die passende PWM, per Fast PWM. Das Signal wird dann durch 2 MOSFET's verstärkt und anschließend über den Low-Pass-Filter gejagt. Theoretisch sollte ich dann am Ausgang mein verstärktes Audiosignal vorfinden... Meine Frage also: Sind meine Überlegungen richtig? Reicht eine Sampling Rate von 125kHz aus? Kann mit dem 10-Bit ADC ein einigermaßen gutes Ergebnis erreicht werden? Beinhaltet ein Audiosignal z.B. von einem Handy, noch einen Gleichspannungsanteil ? Ich weiß das es hierzu fertige Schaltungen + Software im Internet zu finden gibt. Im Vordergrund sollte jedoch hier der Lerneffekt stehen und nicht Copy & Paste :D Vielen Dank im Voraus Christian Karle :)
Christian Karle schrieb: > Reicht eine Sampling Rate von 125kHz > aus? Auf jeden Fall. Viele Soundkarten haben eine Sampling Rate von 44.1kHz. Christian Karle schrieb: > Kann mit dem 10-Bit ADC ein einigermaßen gutes Ergebnis erreicht werden? Hier wird die Ausgabe mit 8 bit PWM gemacht: http://elm-chan.org/works/sd8p/report.html Christian Karle schrieb: > Beinhaltet ein Audiosignal z.B. von einem Handy, noch einen > Gleichspannungsanteil ? Höchstwahrscheinlich nicht. Und die Spannung mit dem ADC zu messen musst du aber eine DC Anteil von Ub/2 addieren.
:
Bearbeitet durch User
Max H. schrieb: > Höchstwahrscheinlich nicht. Und die Spannung mit dem ADC zu messen musst > du aber eine DC Anteil von Ub/2 addieren. Hmm... Wieso? Kann der Offset nicht einfach auf 0V also GND festgelegt werden ? Dann könnte ich mir das doch sparen oder sehe ich das falsch ?
Ok, habe gerade im Datenblatt nachgelesen... Also würde mein Offset 2,5V betragen. Alles was also kleiner als 2,5V ist gilt dann als negativ differential Input und alles über 2,5V als positive differenzial Input. Der ADC-Wert ist dann also die Differenz zwischen 2,5V und dem Audiosignal... richtig ?
Ich würde das Audiosignal massebezogen messen und den gemessenen Wert direkt mit PWM ausgeben.
:
Bearbeitet durch User
Wie meinst Du das ? Der ADC-Wert soll dann die Differenz zwischen GND und dem Eingangssingnal sein?
:
Bearbeitet durch User
Was genau soll hier verstärkt werden? Das Signal ist doch schon analog, warum nicht einfach einen AMP dran? Wenn das wirklich ein ->Digitalverstärker werden soll, also ein PWM /PDM - Ausgang auf eine digitale Treiberstufe, muss das ganz anders aussehen.
Also das Audiosignal soll verstärkt werden. Ich möchte keinen normalen Amp nehmen, da der Wirkungsgrad zu gering ist und ich meinen Batterie dann nur verheize. Außerdem möchte ich die Grundzüge des Digitalverstärkers verstehen.
:
Bearbeitet durch User
Kann mir Jemand sagen in welchem Spannungsbereich ich mich bei einem Audiosignal aus einer Kopfhörerbuchse bewege? Ich habe leider kein Oszilloskop...
Christian Karle schrieb: > Also das Audiosignal soll verstärkt werden. Ich möchte keinen > normalen > Amp nehmen, da der Wirkungsgrad zu gering ist und ich meinen Batterie > dann nur verheize. Außerdem möchte ich die Grundzüge des > Digitalverstärkers verstehen. Also bei meiner Basemachine war ein 12V Bleisammler, der Conrad 70W Monoblock Verstärker und ein 100W Doppelschwingspulen Subwoofer + 6W Mittel-Hochtöner verbaut. Das Ding hat den halben See zugeblasen und das in etwa 7-8h lang. Unterschätze die Lautstärke von 30-40W nicht. Außerdem arbeitet eine B-Endstufe mit irgendwas zwischen 60-70% (Autoendstufen erzeugen sich ihre Betriebsspannung aus Schaltreglern). Der Verstärker hatte zwar einen Kühlkörper größe Pentium 4 Boxed Lüfter mit 125W TDP aber wurde nicht einmal lauwarm. Ich würde daher an Deiner stelle erst einmal experimentieren, in wie weit diese Konstruktion überhaupt Sinn macht.
Das wird so etwa bei 0,5Vss bis 2Vss liegen. Messen kannst du es mittels Sinuston und Wechselspannungsmessgerät. Denke daran, die PWM mit komplementären Ausgängen zu benutzen, am besten den im Datenblatt erwähnten Non-overlapping Mode. Dann kannst du die Endstufe als Brücke ausführen und mehr Leistung rausholen aus der Versorgungsspannung.
Kommt auf das Gerät an. Ohne Kopfhörer dran können das 2Vpp werden. Bei einfachen MP3-Spielern mit 2 Mignonzellen eher ca. 1Vpp. Miß mit deinem uC.. ;) Was für eine Stromquelle nimmst du mit zum Baggersee?
Also... Ich habe jetzt folgendes getan. Ich habe den ADC mit einem Spannungsteiler auf 1/2 Ub gelegt (2,5V). Über einen Koppelkondensator wird dann, das Audiosignal mit auf den Spannungsteiler geleitet. Als Referenzspannung wird Vcc genutzt. An PB0 und PB1 ist jeweils eine LED angeschlossen. Wird nun ein Audiosignal angelegt fangen die LED's fröhlich an zu Blinken ;) Nun meine Frage: Ich habe bisher noch keine Ahnung von Hardware PWM, da ich bisher nur Software PWM genutzt habe. Allerdings bin ich der Meinung das hier nun Schluss ist mit Software PWM da diese zu langsam ist. Sehe ich das richtig ? Da ich mit ca. 62,5kHz Sample müsste die PWM also in 8-Bit Auflösung eine Frequenz von 62,5kHz haben. Stimmt das? Im Anhang mein Programmtext ;) Vielen Dank im Voraus Christian Karle :)
:
Bearbeitet durch User
Manche Kommentare im Programmtext entsprechen nicht mehr dem Programmtext. Ich habe leider vergessen diese zu löschen.
Ich wuerd einfach einen Class-D Amp Chip nehmen und den verbauen. Vergiss den Tiny. Der waere allenfalls genuegend fuer die Baesse. Das kann der Ampchip aber schon alleine.
Ich weis aber, das Andere schon Class D Verstärker mit einem ATtiny umgesetzt haben und ich möchte das auch schaffen :D
Um ehrlich zu sein, habe ich keine Ahnung wie dein Code funktionieren sollte. Ich würde dir ehrlich empfehlen, dich mit dem Hardware PWM auseinanderzusetzen. Ich würde das Ganze (in Pseudocode) so realisieren:
1 | while(1) |
2 | {
|
3 | HW_PWM_DutyCycle=ADC_Read(); |
4 | }
|
:
Bearbeitet durch User
Also ich habe mich jetzt mit der Hardware PWM auseinander gesetzt. Nur leider funktioniert sie nicht... Könnte sich mal einer anschauen ob vielleicht in meiner Initialisierung ein Fehler steckt, oder ob ich etwas vergessen habe? Fast PWM: Modus:3 No Prescaling Set OC0A/OC0B at Bottom Clear OC0A/OC0B at Compare Match
Zur Initialisierung kann ich dir nichts sagen, da ich nicht mit Atmel arbeite. Wieso machst du in deinem Code Unterscheidung zwischen positiver und negativer Halbwelle und gibst sie an Verschiedenen Pins aus?
:
Bearbeitet durch User
Wenn das Signal später verstärkt wird muss sich der eine MOSFET um die positive Halbwelle und der andere MOSFET um die negative Halbwelle kümmern. Das war zumindest mein Plan :D
Hi > TCCR0A = ( ( 1 << COM0A1 ) | ( 1 << COM0B1 ) ); > TCCR0A = ( ( 1 << WGM01 ) | ( 1 << WGM00 ) ); Mit der zweiten Anweisung überschreibst du das, was die erste eingestellt hat. >Ich weis aber, das Andere schon Class D Verstärker mit einem ATtiny >umgesetzt haben und ich möchte das auch schaffen :D Wenn die auch einen ATTiny85 benutzt haben, dann mit Sicherheit mit dem Timer1 und 64MHz PLL-Takt. MfG Spess
Die Ausgangsstufe ist eh eine Halb oder Vollbruecke, und die Verstaerkung macht man dann mit der Speisung.
Also: Das Programm so wie es jetzt ist, funktioniert einwandfrei :) Ich habe mal meine Kopfhörer an den Ausgang gehängt :D Extrem verzerrt aber man kann schon gut was hören. Nun werde ich wahrscheinlich auf deine Idee mit dem Timer 1 zurückgreifen und das Programm noch weiter verbessern. Die Idee positive und negative Halbwelle zu trennen ist aber grundsätzlich richtig oder ?
Nichts gegen dein ehrgeiziges Projekt, aber für den Fall, dass du den Verstärker noch in diesem Sommer brauchst, ein Tip : http://www.pollin.de/shop/dt/ODk1OTYzOTk-/HiFi_Car_HiFi_Video_TV/HiFi/Verstaerker/Stereo_Verstaerkermodul_mit_MP3_Wiedergabe_PVM_MP3_2x10.html
Christian Karle schrieb: > Die Idee positive und negative Halbwelle zu trennen ist aber > grundsätzlich richtig oder ? Meiner Meinung nach nicht. Wie hast du die Kopfhörer an die beiden Pins angeschlossen? Ich würde einfach das ADC Signal direkt mit PWM ausgeben. Wenn's zu leise ist, würde ich das Signal in Software verstärken. Das könnte z.B. so aussehen:
1 | adc_wert=Read_ADC(); |
2 | adc_wert-=512; |
3 | adc_wert*=2; |
4 | adc_wert+=512; |
5 | set_pwm(adc_wert); |
:
Bearbeitet durch User
Christian Karle schrieb: > Ich möchte keinen normalen > Amp nehmen, da der Wirkungsgrad zu gering ist und ich meinen Batterie > dann nur verheize. Der Lautsprecher und die Box drum herum haben deutlich mehr Einfluß auf den Gesamtwirkungsgrad ("laut" pro "Strom") als die Topologie der Endstufe. > Außerdem möchte ich die Grundzüge des Digitalverstärkers verstehen. Dann hättest du dir vielleicht mal die Schaltung eines solchen ansehen sollen. Typisch ist da nämlich weder ein µC noch ein ADC drin. XL
PLLCSR = 1<<PLLE; //PLL einschalten while(!(PLLCSR & (1<< PLOCK))); // warten bis PLOCK ==1 PLLCSR |= 1<<PCKE; // pll als timer1 source TCCR1 = 1<<CS10; //no prescaler TCCR1 = 1<<COM1A1 | 1<<PWM1A ; OCR1C =255; OCR1A= Hier kann ich dann meinen Wert eintragen ? Stimmt das alles so? Mein Englisch ist noch nicht so gut, :D Bin noch Schüler :D
Ich habe einen Versuch (mit PIC18) gemacht. Ich habe das PWM auf 8bit, 250kHz eingestellt und die 8 höherwertigen bits des ADCs direkt mit dem PWM Modul ausgegeben. Ich habe 44100 Mal pro Sekunde gemessen und die Werte an das PWM weitergegeben. Das Ergebnis war bis auch ein bisschen Rauschen relativ gut. Am Eingang habe ich mit 470nF Kondensator + 2*100kOhm einen 2.5V Offset zum Audiosignal addiert. An PWM Ausgang hatte ich einen 220µF Elko: PWM_Pin--> Elko* --> Kopfhörer --> GND Der Code (Achtung ist für PIC18) sah so aus: Diese Routine würde von einem Timer Interrupt mit 44.1kHz aufgerufen:
1 | void interrupt high_isr(void) |
2 | {
|
3 | if( INTCONbits.TMR0IF) |
4 | {
|
5 | TMR0H=0xFE; |
6 | TMR0L=0xC1; |
7 | INTCONbits.TMR0IF=0; // Clear Timer 0 Interrupt Flag |
8 | PWM1_Set_DC(ADRESH); |
9 | ADC_Sampel_8bit(0); // AN0/RA0 |
10 | }
|
11 | }
|
Kurze Erklärung des Codes: "TMR0H=0xFE;" und "TMR0L=0xC1;" laden dem Timer so vor, dass er nach 22.67µs überläuft. "INTCONbits.TMR0IF=0;" löscht das Interrupt Flag. "PWM1_Set_DC(ADRESH);" schreibt das Ergebnis des AD-Wandlung (ADRESH) in das Dutycycle Register. "ADC_Sampel_8bit(0);" startet die Messung, die bis nächsten Interrupt fertig ist. Der Wert wird dann in der nächsten ISR verwendet. Die Audioqualität konnte ich noch erhöhen, indem ich die Interne 2,048V Referenz verwendet habe und des Audiosignal nur einen Offset von 1V addierte. [*] Plus des Elkos an den µC Pin, Minus des Elkos an den Kopfhörer. P.S. Meiner Meinung nach ist das nur eine nette Spielerein. Mit der Audio Qualität, wäre ich vor allem bei geringer Lautstärke nicht zufrieden. Ich denke die 8 bit des PWMs waren zu wenig für eine brauchbare Qualität...
:
Bearbeitet durch User
cool :) Eine Frage dazu - startet der pwm im PIC nach neu beschreiben nicht immer bei 0? Das könnte die Audioqualität doch beeinflussen..?? - Mir fällt nur grad keine Möglichkeit ein, um das zu vermeiden.
Helge A. schrieb: > Eine Frage dazu - startet der pwm im PIC nach neu beschreiben nicht > immer bei 0? Nein, der PWM Wert wird in das CCPRxL + CCPxCON<5:4> geschrieben und am Ende der PWM Periode ins Register kopiert, das dann wirklich mit dem Timer verglichen wird. Falls meine Beschreibung nicht verständlich ist, im Anhang ein Blockdiagramm.
Stimmt. Habs grad nachgelesen. Hatte sich das Denkgerät aufm Hals doch was falsches gemerkt ;)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.