Hallo Forenmitglieder, ich bin Anfänger was Timer und PWM bei Mikrocontroller angeht. Vergeblich habe ich mehrere Stunden am ATmega8 und dem Code rumprobiert, aber nichts funktioniert. Ich möchte ein 50Hz Signal mit PWM an einem ATmega8 erzeugen um einen Servo damit anzusteuern. Um ein Servo anzusteuern benötigt man eine 20ms lange Periode, in welcher es eine Highzeit von 1-2ms gibt. Dazu habe ich mir Gedanken dazu gemacht: Controllertakt: 16Mhz Timertakt: Controllertakt(16Mhz) / 8(ist Vorteiler) ICRn: 20000 OCRxn: 1000 - 2000 Wenn man 16Mhz und ein Vorteiler von 8 verwenden würde, könnte man die Positionen sehr genau einstellen. Doch bei mir ergeben sich immer andere Freqenzen. Ich hoffe ihr könnt mir Helfen, besonders bei dem Setzen der Bits in den Registern. Bevor ich es vergesse: Ich programmiere in C/C++ (AVR-GCC). Gruß Manuel
@ Manuel Bentele (modellbahner) >Ich möchte ein 50Hz Signal mit PWM an einem ATmega8 erzeugen um einen >Servo damit anzusteuern. Da bist du nicht der erste. Siehe Suchfuntion. >Controllertakt: 16Mhz >Timertakt: Controllertakt(16Mhz) / 8(ist Vorteiler) >ICRn: 20000 >OCRxn: 1000 - 2000 Jo, so macht man das. >Doch bei mir ergeben sich immer andere Freqenzen. Dann ist was falsch eingestellt. Wahrscheinlich die AVR Fuses für den Takt. >Ich hoffe ihr könnt mir Helfen, besonders bei dem Setzen der Bits in den >Registern. Bevor ich es vergesse: Ich programmiere in C/C++ (AVR-GCC). Dann lies mal das AVR-GCC Tutorial. Oben links. MFG Falk
Manuel Bentele schrieb: > Dazu habe ich mir Gedanken dazu gemacht: > > Controllertakt: 16Mhz Hast du den kontrolliert? Wärst nicht der erste, der meint sein µC läuft mit einer bestimmten Frequenz und in Wirklichkeit wars dann eine ganz andere > Timertakt: Controllertakt(16Mhz) / 8(ist Vorteiler) ALso haben wir Timertakt 2Mhz (2000000) > ICRn: 20000 Ich nehme an, dass soll dann der Top-Wert der PWM sein. Wenn dein Timer in 1 Sekunde 2 Mio Zählschritte macht, dann braucht er wie lange um einmal von 0 bis 19999 (also 20-tausend Zählschritte) zu zählen? 1 ...... 2 Mio x ...... 20000 ----------------------- 1 * 20000 x = ------------------ = 0.01 = 10 Millisekunden 2 Mio Das stimmt schon mal nicht mit deinen geforderten 20 Millisekunden überein. > OCRxn: 1000 - 2000 Womit dann auch diese Zeiten nicht stimmen. > Doch bei mir ergeben sich immer andere Freqenzen. Was heißt immer andere? Wenn, dann sollten sie schon auch konstant falsch sein.
Vielen Dank für Eure Antworten, aber ich hab immer gedacht, dass es eine sichere Lösung sei, denn im folgendem Link macht man es auch so: http://www.mil.ufl.edu/5666/handouts/ATMPWM.pdf
Das kommt auf den PWM Modus an, den du uns nicht genannt hast. Ich muss allerdings gestehen, dass ich nicht gedacht hatte, dass jemand für eine Servo Ansteuerung eine Phase Correct PWM benutzen würde :-) Für eine Phase Correct PWM ist die Berechnung in Ordnung. Damit kann das Problem eigentlich nur mehr noch an deinen 16Mhz liegen, die dann eben nicht 16 Mhz sein werden. Daher die Frage: Hast du die 16Mhz kontrolliert?
Ich habe ein 16Mhz Quarz mit 2 22pF Kondensatoren angeschlossen und das Fusebit CKOPT gesetzt. Es sollte eigentlich funktionieren.
Ja hab ich, aber ich hab das Problem anders gelöst: Ich hab den Code im Beitrag "Servo Ansteuerung mit interner PWM vom ATmega8" ausprobiert und es funktioniert.
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.