Ich bin neu bei AtmelStudio. Ich muss wissen, wie man mit Zeitgebermodulen von atmega2560 ein Servosteuersignal erzeugt. Ich verwende ein Arduino Mega Board . ( Weitere Informationen zu Servosteuersignalen finden Sie in den letzten Abschnitten dieser Seite ).
Ich bin mir nicht sicher, wie ich das genaue Timing machen soll. Der Uhrenauswahlteil ist für mich immer etwas verwirrend.
Wie sollte ich das Timer-Modul (TCCR-Register) konfigurieren und wie das Timing durchführen? Es ist besser, wenn es ein funktionierendes Codebeispiel gibt.
(Ich habe versucht, Timer 0 im schnellen PWM-Modus zu verwenden. Er gibt entsprechende Impulse, aber ich weiß nicht, wie man die richtigen Timing-Prescaler berechnet. Ich habe Zweifel an der verwendeten primären Uhr. Ist es der 16-MHz-Kristall auf der Arduino-Platine? oder gibt es eine andere eingebaute Taktquelle im atmega2560, so dass wir explizit angeben müssen, welche Uhr verwendet werden soll??)
Da die Frage nach funktionierendem AVR-Code für die Servosteuerung fragt, wäre dieser Artikel , obwohl er für den ATmega32-Mikrocontroller geschrieben wurde, eine hervorragende Ressource.
Auf einem Arduino-Board ist der primäre Takt, der normalerweise für die Timer/Zähler 0..n verwendet wird, der Quarz auf dem Board, typischerweise 16 MHz, obwohl einige Arduinos / Clone-Boards auch 8-MHz- oder 20-MHz-Quarze verwenden. Abschnitt 18 des Datenblatts befasst sich mit der Auswahl der Taktquelle/Vorteiler von entweder externen oder internen Taktgebern.
Sie haben die Möglichkeit, den "kalibrierten internen Oszillator" des ATmega2560 zu verwenden, im Wesentlichen einen eingebauten RC-Timer, dem jedoch die Präzision / Stabilität fehlt, die je nach Anwendung für das Servosignal erforderlich sein könnte. Um den internen Oszillator zu verwenden, setzen Sie CKSEL3:0 auf 0010. Aus Abschnitt 10.3.1 des Datenblatts :
The device is shipped with internal RC oscillator at 8.0MHz and with the fuse CKDIV8 programmed, resulting in 1.0MHz system clock. The startup time is set to maximum and time-out period enabled. (CKSEL = "0010", SUT = "10", CKDIV8 = "0").
Ein zusätzlicher Vorschlag:
Wenn eine Präzision der Servosteuerung erwünscht ist, dann wäre anstelle der Verwendung von Timer0, der ein 8-Bit-Timer/Zähler ist, einer der 16-Bit-Timer-Zähler (1, 3, 4 und 5) eine bevorzugte Option .
Vor ein paar Jahren habe ich einen PWM-Servocode für ATMega168 und ATTiny2313 geschrieben, die 64 Kanäle (Servos) handhabten. Code und Schemata finden Sie auf www.lhexapod.com
NickHalden
Jippie
Anubis
Anubis