Servosignal in atmega2560 erzeugen

7

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 .)

Geben Sie hier die Bildbeschreibung ein

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 ??)

Anubis
quelle
2
Es gibt Sicherungseinstellungen, die Sie "blinken" können, um zu bestimmen, welche Taktquelle Ihr Mikrocontroller verwendet (Sie vermuten zu Recht, dass es einen internen Oszillator gibt, der anstelle des 16-MHz-Kristalls verwendet werden kann). Für den Anfang können Sie die Arduino-IDE herunterladen und dann die Quelldateien für die Servobibliothek öffnen.
NickHalden
2
Sicherungen auf Arduino werden selten berührt. Es kann den Bootloader töten. Wie @NickHalden erwähnt, warum nicht die Standard-Servobibliotheken verwenden?
Jippie
@ NickHalden Ja, ich habe Arduino IDE verwendet und bin damit einverstanden. Ich muss zu AtmelStudio wechseln, damit Sie eine echte Codierung durchführen können. Aber ich versuche alles nur mit Hilfe des atmega2560-Datenblattes. Ich werde wirklich nett sein, wenn ich ein gutes Tutorial mit einigen funktionierenden und vollständigen Beispielen finden kann, zumindest nur zum Fahren eines Servos.
Anubis
@ Jippie bitte oben Kommentar kommentieren .. (nicht erlaubt, zwei Personen in einem einzigen Kommentar zu verweisen: D)
Anubis

Antworten:

3

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 .

Anindo Ghosh
quelle
1

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

Len Holgate
quelle