Forum: Compiler & IDEs Modifikation einer 8Bit-PWM zu einer 10Bit-PWM


von David P. (david_)


Lesenswert?

Hallo zusammen!

Ich arbeite mit einem ATMEGA128 mit 16MHz Taktfrequenz und programmieren 
mit dem AVR-Studio und in Beginner.

Neben einer AD-Wandlung muss ich in meiner Schaltung eine Gleichspannung 
vorgeben, die möglichst fein gestuft sein soll. Am liebsten Würde ich 
1024 Stufen (10 Bit) haben. Das PWM-Signal soll dann durch einen 
passenden Tiefpass gefiltert werden, damit nacher eine glatte 
Gleichspannung rauskommt. Dahinter habe ich einen Op geschaltet, der das 
Signal puffert, damit es lastunabhängig ist. Meine erste Frege ist dann 
schon: Wie wähle ich den Tiefpass aus, damit der mein Signal so glass 
macht, dass ich es mit dem internen ADC der Atmel messen könnte, ohne 
dass die Werte wegen noch vorhandener Taktung anfangen zu springen? Wie 
dimensioniert man sowas? Es gibt ja eine Formel für die Grenzfrequenz, 
aber wie tief soll ich diese legen, damit ich eine gute gleichspannung 
habe?

Nun habe ich mir folgendn Programmcode zusammengereimt, der auch 
funktioniert, womit ich 256 Stufen (8Bit) einstellen kann. In dem 
Beispiel habe ich einfach mal einen Zähler gemacht, der die PWM 
stückchenweise verändert:

void port_init()
{
// PWM init
TCCR1A = (1<<WGM10)|(1<<COM1B1); // PWM, phase correct, 8 bit.
TCCR1B =  (1<<CS11) |(1<<CS10);  // set clock/prescaler 1/64 -> enable 
counter
OCR1B = 0;

DDRB |= (1<<6);
}




void PWMAufsteigendErzeugen_Endwert(uint8_t Endwert)
{

OCR1B=0;
warte_ms(20);
while(OCR1B<Endwert+1)
  {

  OCR1B+=1;
  warte_ms(20); //wartet einfach 20 Millisekunden

  }

}

int main ()
{
PWMAufsteigendErzeugen_Endwert(230);
return (0);
}

Folgendes habe ich auch gelesen, aber ich verstehe es noch nicht so 
ganz:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_PWM-Betriebsart


Wie muss ich mein Progrämmchen abändern, damit ich Statt bis 255 bis 
1024 zählen kann, also damit ich meine Gleichspannung feiner einstellen 
kann? Und wie wählt man dann die passende RC-Kombination? Oder ist ein 
aktives Filter oder ein Filter mit Spule und Kondensator besser?



Viele Grüße,

David

von Karl H. (kbuchegg)


Lesenswert?

David P. wrote:

> Wie muss ich mein Progrämmchen abändern, damit ich Statt bis 255 bis
> 1024 zählen kann,

du willst also eine 10 Bit PWM.

Dann verweise ich dich mal auf eine Zeile in deinem Programm

TCCR1A = (1<<WGM10)|(1<<COM1B1); // PWM, phase correct, 8 bit.

LAut Kommentar ist das die Einstellung für eine 8 Bit PWM.
Ich würde mal vermuten, dass du im Datenblatt, bei der
Beschreibung des TCCR1A Registers fündig wirst, welche Bits
in diesem Register gesetzt werden müssen, damit der Timer nicht
mehr eine 8 Bit PWM sondern eine 10 Bit PWM macht.

Hat doch gar nicht weh getan, oder?

von David P. (david_)


Lesenswert?

Hallo!
Du hast mir bei einer anderen Sache schonmal weiter geholfen.
Werde ich mal tun. Leider kann ich das erst morgen oder übermorgen 
testen, da ich viel zu tun habe.
Aber meinst du wirklich, dass man nur so wenig abändern muss?
Und welches Register muss ich dann erhöhen?
Bisher war es ja OCR1B+=1; um die Spannung einen Schritt zu erhöhen. Der 
schritt war dann 5Volt/256 groß.
Gruß,
David

von David P. (david_)


Lesenswert?

Hab gehört, dass es komplizierter sein soll, wenn man eine 10Bit PWM 
haben will. Kann es sein, dass man mit zwei Timern arbeiten muss?

von Karl H. (kbuchegg)


Lesenswert?

David P. wrote:
> Hab gehört, dass es komplizierter sein soll, wenn man eine 10Bit PWM
> haben will. Kann es sein, dass man mit zwei Timern arbeiten muss?

Nein, musst du nicht.
Du konfigurierst den Timer für eine 10 Bit PWM und dann macht
der auch eine 10 Bit PWM.
Manchmal kann das Leben so einfach sein.


> Bisher war es ja OCR1B+=1; um die Spannung einen Schritt zu erhöhen
Ja.
Das machst du auch weiterhin in deinem Testprogramm so.
Nur der Endwert ist dann logischerweise ein anderer.
Bei einer 8 Bit PWM ist der Endwert 255, weil ja 2 hoch 8 gleich
256 ist.
Bei einer 10 Bit PWM ist der Endwert daher: 2 hoch 10 gleich 1024
Davon noch 1 abgezogen, macht als Endwert 1023

von David P. (david_)


Lesenswert?

Danke !

Das klingt gut. Endlich mal was einfaches hier ;-)
Das werde ich dann übermorgen testen. Werde hier berichten.

In einem anderen Thread berate ich über mein ADC-Problem. Denn mein ADC 
misst zwischendurch Spannungspeaks am Eingang, die nicht sein sollen. 
Grund ist wohl eine vorgeschaltete OP-Schaltung 
(Strom-Spannungswandler). Wenn ich an dem Wandler eine Solarzelle 
dranschalte, dann fängt er an irgendwelche Peaks zu erzeugen, die mein 
Oszilloskop nicht darstellen kann. Und ich weiß nicht wie ich sie 
wegbekomme. RC-Tiefpass am ADC-Eingang? Aber das verfälscht ja den 
Messwert, wegen des Widerstandes.

Aber das ist ja auch nicht Thema von dem Thread hier.

Ist OCR1B also ein 16-Bit-Register?

Wie groß sollte man eigentlich die Frequenz wählen von der PWM, wenn man 
damit nur eine Gleichspannung einstellen will?
Das hängt ja davon ab, die schnell man die Spannung einstellen können 
will, oder? Wie berechnet man das?
Ich weiß noch, dass ein Kondensator nach Tau=5*RC annähernd voll ist und 
dass die Grenzfrequenz f=1/(2*PI*f) ist. Aber wie ist die Grenzfrequenz 
des RC-Teifpasses dann zu wählen ? Wie gesagt, der Tiefpass wird niocht 
belastet.

Grüße

von Karl H. (kbuchegg)


Lesenswert?

David P. wrote:
>
> Ist OCR1B also ein 16-Bit-Register?

Tu dir selbst einen Gefallen und schau ins Datenblatt
deines Prozessors. Das steht da alles drinnen.

> Wie groß sollte man eigentlich die Frequenz wählen von der PWM, wenn man
> damit nur eine Gleichspannung einstellen will?

So gross wie es nur irgendwie geht. Macht ja sowieso alles
die Hardware und belastet dein restliches Programm nicht.

> Das hängt ja davon ab, die schnell man die Spannung einstellen können
> will, oder?

Ja und Nein.
Ja, wenn du die PWM in ganz kurzen Zeiträumen verstellen willst.
Um das zurechtzurücken: Ganz kurz sind Zeiten von ein paar
Zig-Nanosekunden bis hin zu ein paar Millisekunden.

> Wie berechnet man das?

Gar nicht. Du rechnest dir umgekehrt aus, welche PWM Frequenz
du erreichen kannst:

Du kennst den Systemtakt, du kennst den eingestellten
Vorteiler also kannst du auch ausrechnen mit welcher Frequenz
der Timer hochzählt. Du weist weiterhin wie hoch der Timer zählt
bis er auf 0 zurückgesetzt wird, also kannst du dir auch ausrechnen
wie lange der Timer dafür braucht. Jedesmal wenn der Timer
wieder bei 0 ist beginnt ein neuer PWM Zyklus. Und da du jetzt
weist wie lange so ein Zyklus dauert, kannst du auch ausrechnen
welcher Frequenz das entspricht.

> Ich weiß noch, dass ein Kondensator nach Tau=5*RC annähernd voll ist und
> dass die Grenzfrequenz f=1/(2*PI*f) ist. Aber wie ist die Grenzfrequenz
> des RC-Teifpasses dann zu wählen ? Wie gesagt, der Tiefpass wird niocht
> belastet.

Auf jeden Fall niedriger als die Frequenz die du oben ausgerechnet
hast. Nimm mal einen Faktor 3 oder 4 und dann schau dir am Oszi
an, ob an der Ausgangsspannung noch Artefakte von der PWM
Frequenz zu sehen sind. Wenn ja: Grenzfrequenz runter.
An dieser Stelle kann man durchaus ein wenig experimentieren.

von Frank (Gast)


Lesenswert?

Oder man rechnet ganz einfach. Ein TP erster Ordnung fällt nach der 
Grenzfrequenz mit 20 dB pro Frequenzdekade. Die PWM-Frequenz soll nicht 
mehr gemessen werden, muss also wirklich im Rauschen untergehen. 
Folglich darf sie nur mit weniger als
 vorkommen. Bei 10 bit Auflösung sind das ca. 60 dB. Die Grenzfrequenz 
muss also ca. 1/3 der PWM-Frequenz sein. Vorsicht:
Mit steileren Filtern (höherer Ordnung) kann man die nutzbare Bandbreite 
erhöhen.
Noch mehr Vorsicht: Es ist schon spät, keine Garantie auf Richtigkeit.

von David P. (david_)


Lesenswert?

Lieber Frank und lieber Karl Heinz!

Ihr helft mir wirklich sehr weiter. Und ich möchte hier sowieso nochmal 
das Forum loben. Die Leute hier sind wirklich fit und im Gegensatz zu 
anderen Foren bekommt man mit den hier gegebenen Tipps wirklich was hin.

ICh habe das verstanden was ihr mir erklärt habt und werde es mir in 
einem Merkblatt notieren. Dieses Nachschlagewerk wächst durch dieses 
Forum stetig.

Dennoch werde ich sicher immer wieder die eine oder andere Frage posten.

Besten Gruß und gute Nacht...

von Fred (Gast)


Lesenswert?

@Frank: kleine Korrektur:

"Ein TP erster Ordnung fällt nach der Grenzfrequenz mit 20 dB pro 
Frequenzdekade. "
Yep, stimmt.

"Bei 10 bit Auflösung sind das ca. 60 dB. Die Grenzfrequenz
muss also ca. 1/3 der PWM-Frequenz sein"
STOP! Dekade = 10x

==> 3 Dekaden = 10*10*10 = 1000

von Frank (Gast)


Lesenswert?

>Noch mehr Vorsicht: Es ist schon spät, keine Garantie auf Richtigkeit.

Hast natürlich absolut Recht.

von David P. (david_)


Lesenswert?

> ==> 3 Dekaden = 10*10*10 = 1000

Also muss FG 1/1000 der PWM-Frequenz sein?

Gruß & Gute N8

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.