Hallo, ich Versuche zur Zeit eine sinusförmige Gleichspannung mittels PWM zu erzeugen. Dafür habe ich die letzten Tage etliche Foren und Websites besucht und glaube nun eine Idee für die Umsetzung zu haben. Es wäre schön, wenn Ihr euch diese Idee mal durchlesen und mir ein Feedback geben könntet. Na, dann mal los: Das Ziel ist es eine Sinuswelle alle 60ms zu erzeugen. Die Welle soll mit 60 verschiedenen Punkten gebildet werden, so dass Vout jede Millisekunde verändert wird. Daher benötige ich erstmal einen Timer, der jede Millisekunde den PWM-Duty-Cycle-Wert ändert (Timer A). Die einzelnen Duty-Cycle-Werte sind in einem Array gespeichert. Mit jedem Overflow-Interrupt wird der nächste Wert dieses Arrays ausgelesen um damit OCR0 zu laden. Das ist sozusagen die Formgebung der Welle. Die Werte habe ich am Schluss der Beschreibung angehängt. Timer B läuft 10x schneller als Timer A und ist für die Erzeugung des PWM-Zuständig. Zu Beginn wird OCR0 mit dem Duty-Cycle-Wert von 127 geladen. Das würde eine Spannung (Vout) von 50%, also 2,5V, erzeugen (8 Bit Timer >> 256 Schritte : 2 = 127). Angenommen zuerst wird Timer B gestartet, dann habe ich erstmal ein Vout von 2,5V anstehen; eine schöne, konstante Gleichspannung. Mit dem Start von Timer A wird dieser Spannungswert jede Millisekunde geändert. Nämlich entsprechend der Werte, die in meinem Array stehen. Ist das soweit OK? Wenn ich nun aber Timer A auf 60Hz stelle, dann müsste ich eine Sinuswelle von 1Hz herausbekommen, oder nicht (OK, 60 Werte sind für eine saubere Ausformung der Welle wohl zuwenig)? Wenn ich jetzt noch einen Tiefpass und dahinter noch eine LED anschließe, dann müsste diese doch innerhalb einer Sekunde "sinusförmig" aufleuchten und erlöschen, richtig? Ich hab leider kein Oszi um mir Vout anzuzeigen. Das muss ich in nächster Zeit nachholen. Aber ich hab zu Hause einfach keinen Platz ;) An diesem Thema sitze ich jetzt schon ein paar Tage und ich würde mich echt freuen, wenn das im Grundsatz passt. LG, Timo EDIT: Ich sehe gerade, dass der Timer B auch als 8-Bit Timer ausgeführt werden kann. Dann mit einem Prescaler von 64 und einem Reload von 6. Wenn ich es mal programmiere, dann werde ich das berücksichtigen! Hier noch das Array: 140,153,166,179,191,202,212,221,230,237,243,248,251,253,254,253,251,248, 243,237,230,221,212,202,191,179,166,153,140,127,114,101,88,75,64,52,42,3 3,24,17,11,6,3,1,0,1,3,6,11,17,24,33,42,52,64,75,88,101,114,127
@Timo Gruß (timogruss) Benutzerseite >Ist das soweit OK? Ja. >Wenn ich nun aber Timer A auf 60Hz stelle, dann müsste ich eine >Sinuswelle von 1Hz herausbekommen, Ja. > oder nicht (OK, 60 Werte sind für >eine saubere Ausformung der Welle wohl zuwenig)? Das ist eine andere Frage. >Wenn ich jetzt noch >einen Tiefpass und dahinter noch eine LED anschließe, dann müsste diese >doch innerhalb einer Sekunde "sinusförmig" aufleuchten und erlöschen, >richtig? Jain. Das sinusförmige erkennst du an der LED nicht, weil dein Auge das Licht nichtlinear registriert. Siehe LED-Fading. > Ich hab leider kein Oszi um mir Vout anzuzeigen. Das muss ich >in nächster Zeit nachholen. Aber ich hab zu Hause einfach keinen Platz >;) Ohne Oszi wirst du aber nichts sehen, geschweige denn messen. Mittels Auge kann man das kaum schätzen. >EDIT: Ich sehe gerade, dass der Timer B auch als 8-Bit Timer ausgeführt >werden kann. Dann mit einem Prescaler von 64 und einem Reload von 6. >Wenn ich es mal programmiere, dann werde ich das berücksichtigen! Viel besser, er kann CTC.
Das Prinzip stimmt. 60 Stützwerte sollten übrigens bereits für einen einigermaßen sauberen Sinus reichen. Gruß Jonathan
Hey, das geht ja fix hier im Forum! Danke fürs Feedback! Dann bin ich froh nicht auf dem Holzweg zu sein. Falk Brunner schrieb: > Ohne Oszi wirst du aber nichts sehen, geschweige denn messen. Mittels > Auge kann man das kaum schätzen. Damit steht das nächste Weihnachtsgeschenk wohl schon fest :)
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.