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