Forum: Mikrocontroller und Digitale Elektronik ATmega8 PWM 50Hz erzeugen


von Manuel B. (modellbahner)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@  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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Manuel B. (modellbahner)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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?

von Manuel B. (modellbahner)


Lesenswert?

Ich habe ein 16Mhz Quarz mit 2 22pF Kondensatoren angeschlossen und das 
Fusebit CKOPT gesetzt. Es sollte eigentlich funktionieren.

von Steffen H. (avrsteffen)


Lesenswert?

Und auch auf ext. crystal Oscillator >12Mhz umgestellt???

von Manuel B. (modellbahner)


Lesenswert?

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
Noch kein Account? Hier anmelden.