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