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
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?
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
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?
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
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
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.
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.
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...
@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
>Noch mehr Vorsicht: Es ist schon spät, keine Garantie auf Richtigkeit.
Hast natürlich absolut Recht.
> ==> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.