Forum: Mikrocontroller und Digitale Elektronik 50Hz PWM mit ATmega328P


von Armin Nestler (Gast)


Lesenswert?

Hallo Leute,

ich möchte mit einem ATmega328 am Pin 4 der TQFP Variante ein PWM Signal 
für ein Servo mit 50Hz und 1-2ms Impulszeit ausgeben.

Ich möchte theoretisch zeigen, dass das funktioniert. Im Datenblatt 
(http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_datasheet.pdf) 
habe ich zur Frequenzberechnung des genannten Pins zwei Formeln auf S. 
133 und 135 gefunden, eine für Fast PWM Mode und eine für Phase Correct 
PWM Mode. Mit beiden Formeln ist es nicht möglich auf 50Hz zu kommen. 
Verstehe ich das falsch, dass diese Formeln für die PWM Funktion von Pin 
14 sind? Wie zeigt man das 50Hz mit 1bis2ms Impulszeit möglich sind? 
Oder sind Sie es einfach nicht?

Weiß auch jemand unter euch, wie genau ich die Impulszeiten auflösen 
kann, also wie viele Schritte zwischen 1ms und 2ms möglich sind und wie 
ich das theoretisch erklären kann?

Ich danke für eure Hilfe!

Gruß
Armin

von chris (Gast)


Lesenswert?

Stichwort CTC-Mode

von Wolfgang (Gast)


Lesenswert?

Armin Nestler schrieb:
> Mit beiden Formeln ist es nicht möglich auf 50Hz zu kommen.

Die Frequenz von 50Hz sind absolut unkritisch. Die Servo-Position wird 
durch die Pulsdauer, also durch die 1..2 ms bestimmt.

von spess53 (Gast)


Lesenswert?

Hi

>ich möchte mit einem ATmega328 am Pin 4 der TQFP Variante ein PWM Signal
>für ein Servo mit 50Hz und 1-2ms Impulszeit ausgeben.

Pin4 ist VCC.

MfG Spess

von Armin Nestler (Gast)


Lesenswert?

ich meinte natürlich Pin 14, sorry für den tipfehler!

ok, dass das möglich ist habe ich auch schon in anderen forenbeiträgen 
gelesen. aber wie findet man anhand des datenblatts raus, dass 50Hz 
möglich sind. und mit welcher auflösug ich zwischen 1ms und 2ms die 
impulszeit ändern kann?

aber danke schonmal für eure schnellen ersten antworten!

von spess53 (Gast)


Lesenswert?

Hi

>ich meinte natürlich Pin 14, sorry für den tipfehler!

Da wäre OC1B. Da kann man bei Fast PWM die 50Hz mit OCR1A oder ICR1 
(PWM-Mode 15 bzw. 14) einstellen. Wert auf ca. 0x9C00 bei Prozessortakt 
von 16MHz.

MfG Spess

von H.Joachim S. (crazyhorse)


Lesenswert?

Wie schon gesagt, auf die 20ms kommt es nicht an, auch Jitter spielen da 
keine Rolle.
Auflösung der Impulsdauer (1-2ms) ist natürlich der Takt, mit dem der 
Timer betrieben wird. Und da kommt dann auch die Schwäche zutage, wenn 
man es mit PWM macht/machen will - effektiv bleiben 5% (1ms) der 
PWM-Periode (20ms) als Stellbereich. Vorteil: es läuft komplett in 
Hardware. Also je nach gegebenem Takt (welcher?) den Vorteiler so 
einstellen, dass der OCR1A-Wert möglichst hoch wird.
Um bei deinen 20ms zu bleiben: im Idealfall wäre der Timertakt rund 
3,3MHz (50Hz*65536), praktisch eher 2MHz (der obige Wert für OCR1A 
40.000), Auflösung damit also 0,5µs bzw. 2000 verschiedene Sollwerte für 
das Servo, mehr als genug, das können die eh nicht in Positionen 
umsetzen.
Also: mit einem 16bit-Timer kein Problem.

Anders sieht es aus, wenn man einen 8bit-Timer verwenden will oder muss, 
da wird das nichts mehr mit einem PWM-Mode.

von M. K. (sylaina)


Lesenswert?

Armin Nestler schrieb:
> Verstehe ich das falsch, dass diese Formeln für die PWM Funktion von Pin
> 14 sind?

Ja, verstehst du falsch. Diese Formeln gelten für alle Pins.

Armin Nestler schrieb:
> Wie zeigt man das 50Hz mit 1bis2ms Impulszeit möglich sind?

Formeln nehmen, z.B. nach TOP umstellen, 50 Hz einsetzen, Prescaler 
wählen und schaun welchen Wert TOP dann haben muss. Ist eigentlich 
Schulmathematik, d.h. richtig einfach. Wahrscheinlich siehst du nur grad 
den Wald vor lauter Bäumen nicht, ist ja nicht schlimm. Jeder von uns 
hat mal ein Brett vorm Kopf. ;)

Armin Nestler schrieb:
> Oder sind Sie es einfach nicht?

Doch, ist es. Sogar recht einfach wenn mal der Groschen gefallen ist.

von M. K. (sylaina)


Lesenswert?

H.Joachim S. schrieb:
> Anders sieht es aus, wenn man einen 8bit-Timer verwenden will oder muss,
> da wird das nichts mehr mit einem PWM-Mode.

Warum soll das mit einem 8 bit Timer nix werden? Weil eine Auflösung von 
ca 78 us nicht gut genug sein soll? Das sehe ich aus den bisherigen 
Angaben aber nicht, dass das dem TE nicht genügen soll.

von Axel S. (a-za-z0-9)


Lesenswert?

M. K. schrieb:
> H.Joachim S. schrieb:
>> Anders sieht es aus, wenn man einen 8bit-Timer verwenden will oder muss,
>> da wird das nichts mehr mit einem PWM-Mode.
>
> Warum soll das mit einem 8 bit Timer nix werden? Weil eine Auflösung von
> ca 78 us nicht gut genug sein soll?

Rechne doch mal weiter. Der Servo-Impuls ist zwischen 1ms und 2ms lang. 
Für 1ms braucht der Timer knapp 13 Ticks. Für 2ms knapp 26 Ticks. Man 
kann dann also nur 14 verschiedene Impulslängen einstellen, entsprechend 
14 verschiedenen Positionen des Servos. Etwas wenig.

von H.Joachim S. (crazyhorse)


Lesenswert?

Naja, macht dann neben der 0-Position 6 Winkel in jede Richtung.
Aber stimmt schon, es gibt ja auch Anwendungen, wo so ein Servo eher 
digital eingesetzt wird. Oder mit entkoppeltem Poti als einfacher 
Antrieb.

von M. K. (sylaina)


Lesenswert?

Axel S. schrieb:
> Rechne doch mal weiter. Der Servo-Impuls ist zwischen 1ms und 2ms lang.
> Für 1ms braucht der Timer knapp 13 Ticks. Für 2ms knapp 26 Ticks. Man
> kann dann also nur 14 verschiedene Impulslängen einstellen, entsprechend
> 14 verschiedenen Positionen des Servos. Etwas wenig.

Ja, aber woher weist du, dass das auch für den TE zu wenig ist? 
Vielleicht braucht der TE ja nur 5 verschiedene Positionen, dann wären 
14 mehr als ausreichend. Da wir das nicht wissen können wir auch nicht 
sagen ob es genügt oder nicht. ;)

von Armin Nestler (Gast)


Lesenswert?

Guten Morgen Leute,

ich danke vielmals für die schnellen und guten Antworten von euch!

Da habe ich wohl eindeutig an falscher Stelle im Datenblatt nach der 
richtigen Formel gesucht. Ich habe nun die richtige(n) dank euch 
gefunden.

Übrigens habe ich an den Mega ein Baudratenquerz mit 18,432Mhz 
vorgesehen, da ich eine Kommunikation über USART plane.

Nehme ich nun die Formel

f_OCnxPWM= f_clk_I/O / [N*((1+TOP)]

für Fast-PWM des 16Bit Timers (S. 164 --> 
http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_datasheet.pdf) 
und stelle diese nach TOP um und setze meine die Frequenz meines Quarzes 
sowie einen möglichst kleinen Prescaler (8) ein so komme ich auf 
TOP=46079. Mit einem Prescaler von 1 wäre ja der Wert über 65536 und 
somit nicht möglich.

Dieser Top-Wert entspricht ja dann - sowie ich das verstanden habe - 
meinen 20ms Periodendauer. Da ich ja nun die Impulsdauer zwischen 1ms 
und 2 ms verstellen möchte, muss ich das Compareregister TCNT1 zwischen 
den Werten 2304 (1/20 *46079) und 4608 (2/20 *46079) verstellen. Ich 
kann also den An-Impuls mit 2304 Schritten auflösen.
Ist das so korrekt?


P.S. Ich möchte mit dem Servosignal gar kein Servo sondern einen 
Modellbauwechselrichter ansteuern und das soll gefühlt stufenlos 
erfolgen können. Mit den 2304 Schritten sollte das ja passen wenn meine 
Rechnung stimmt.

von Dennis K. (scarfaceno1)


Lesenswert?

Armin Nestler schrieb:
> Dieser Top-Wert entspricht ja dann - sowie ich das verstanden habe -
> meinen 20ms Periodendauer. Da ich ja nun die Impulsdauer zwischen 1ms
> und 2 ms verstellen möchte, muss ich das Compareregister TCNT1 zwischen
> den Werten 2304 (1/20 *46079) und 4608 (2/20 *46079) verstellen. Ich
> kann also den An-Impuls mit 2304 Schritten auflösen.
> Ist das so korrekt?

Rechnung sieht gut aus. Prescaler 8 passt auch. Nur das Compareregister 
ist nicht TCNT1 sondern der Wert muss in OC1A oder OC1B eingetragen 
werden. Das sind die Compareregister. TCNT1 ist das Zählregister, 
welches hochläuft.

Dein Wert für Top muss dann übrigens in ICR1.

Viel Glück.

von Armin Nestler (Gast)


Lesenswert?

Hallo Dennis,

vielen Dank für deine Antwort! Das checke ich nochmal.

Gruß
Armin

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.