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
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.
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
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!
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
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.
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.
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.
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.
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.
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. ;)
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.
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.
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang