Forum: Mikrocontroller und Digitale Elektronik Digitalverstärker


von Christian K. (christiankarle)


Lesenswert?

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 :)

von Max H. (hartl192)


Lesenswert?

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
von Christian K. (christiankarle)


Lesenswert?

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 ?

von Max H. (hartl192)


Lesenswert?

Mit dem ADC kannst du keine Spannungen kleiner Vss des µCs messen.

von Christian K. (christiankarle)


Lesenswert?

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 ?

von Max H. (hartl192)


Lesenswert?

Ich würde das Audiosignal massebezogen messen und den gemessenen Wert 
direkt mit PWM ausgeben.

: Bearbeitet durch User
von Christian K. (christiankarle)


Lesenswert?

Wie meinst Du das ?

Der ADC-Wert soll dann die Differenz zwischen GND und dem 
Eingangssingnal sein?

: Bearbeitet durch User
von Jürgen S. (engineer) Benutzerseite


Lesenswert?

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.

von Christian K. (christiankarle)


Lesenswert?

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
von Christian Karle (Gast)


Lesenswert?

Kann mir Jemand sagen in welchem Spannungsbereich ich mich bei einem 
Audiosignal aus einer Kopfhörerbuchse bewege? Ich habe leider kein 
Oszilloskop...

von Martin S. (sirnails)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Helge A. (besupreme)


Lesenswert?

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?

von Christian K. (christiankarle)


Angehängte Dateien:

Lesenswert?

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
von Christian K. (christiankarle)


Lesenswert?

Manche Kommentare im Programmtext entsprechen nicht mehr dem 
Programmtext.
Ich habe leider vergessen diese zu löschen.

von короткое троль (Gast)


Lesenswert?

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.

von Christian K. (christiankarle)


Lesenswert?

Ich weis aber, das Andere schon Class D Verstärker mit einem ATtiny 
umgesetzt haben und ich möchte das auch schaffen :D

von Christian K. (christiankarle)


Lesenswert?

Könnte mir bitte jemand helfen ? ;)

von Magic S. (magic_smoke)


Lesenswert?

Machs doch einfach genauso wie die anderen!

von Max H. (hartl192)


Lesenswert?

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
von Christian K. (christiankarle)


Angehängte Dateien:

Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

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
von Christian K. (christiankarle)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von короткое троль (Gast)


Lesenswert?

Die Ausgangsstufe ist eh eine Halb oder Vollbruecke, und die 
Verstaerkung macht man dann mit der Speisung.

von Christian K. (christiankarle)


Lesenswert?

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 ?

von Jobst Q. (joquis)


Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

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
von Axel S. (a-za-z0-9)


Lesenswert?

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

von Christian K. (christiankarle)


Lesenswert?

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

von Christian K. (christiankarle)


Lesenswert?

Was meint Ihr dazu ? :)

von Max H. (hartl192)


Lesenswert?

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
von Helge A. (besupreme)


Lesenswert?

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.

von Max H. (hartl192)


Angehängte Dateien:

Lesenswert?

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.

von Helge A. (besupreme)


Lesenswert?

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
Noch kein Account? Hier anmelden.