Ich bin neu bei AtmelStudio. Ich muss wissen, wie man mit Timer-Modulen von atmega2560 ein Servosteuersignal erzeugt. Ich benutze ein Arduino Mega Board . ( Weitere Informationen zu Servosteuerungssignalen finden Sie in den letzten Absätzen dieser Seite .)
Ich bin mir nicht sicher, wie ich das genaue Timing machen soll. Der Teil zur Auswahl der Uhr ist für mich immer etwas verwirrend.
Wie soll ich das Timer-Modul (TCCR-Register) konfigurieren und wie wird das Timing durchgeführt? Es ist besser, wenn es ein funktionierendes Codebeispiel gibt.
(Ich habe versucht, Timer 0 im schnellen PWM-Modus zu verwenden. Er gibt dementsprechend Impulse aus, aber ich kann nicht die richtigen Timing-Vorskalierer berechnen. Ich habe Zweifel an dem verwendeten Primärtakt. Ist es der 16-MHz-Kristall auf der Arduino-Platine? oder gibt es eine andere eingebaute uhrquelle im atmega2560, so dass wir explizit angeben müssen, welche uhr verwendet werden soll ??)
Antworten:
Da in der Frage nach einem funktionierenden AVR-Code für die Servosteuerung gefragt wird, wäre dieser Artikel , obwohl er für den ATmega32-Mikrocontroller geschrieben wurde, eine hervorragende Ressource.
Auf einer Arduino-Karte ist der primäre Takt, der typischerweise für die Timer / Zähler 0..n verwendet wird, der Kristall auf der Karte, typischerweise 16 MHz, obwohl einige Arduinos / Klon-Karten auch 8 MHz- oder 20 MHz-Kristalle verwenden. Abschnitt 18 des Datenblattes befasst sich mit der Auswahl der Taktquelle / des Vorteilers aus externen oder internen Takten.
Sie haben die Möglichkeit, den "kalibrierten internen Oszillator" 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 kann. Um den internen Oszillator zu verwenden, setzen Sie CKSEL3: 0 auf 0010. In Abschnitt 10.3.1 des Datenblattes :
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äzise Servosteuerung gewünscht wird, ist anstelle von Timer0, einem 8-Bit-Timer / Zähler, einer der 16-Bit-Timer-Zähler (1, 3, 4 und 5) eine bevorzugte Option .
quelle
Vor einigen Jahren habe ich einen PWM-Servocode für ATMega168 und ATTiny2313 geschrieben, die 64 Kanäle (Servos) verarbeiten. Code und Schaltpläne finden Sie auf www.lhexapod.com
quelle