Servosignal in atmega2560 erzeugen

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

Geben Sie hier die Bildbeschreibung ein

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

Es gibt Sicherungseinstellungen, die Sie "flashen" können und die bestimmen, welche Taktquelle Ihr Mikrocontroller verwendet (Sie haben Recht, wenn Sie vermuten, dass es einen internen Oszillator gibt, der anstelle des 16-MHz-Quarz verwendet werden kann). Für den Anfang können Sie die Arduino-IDE herunterladen und dann die Quelldateien für die Servobibliothek öffnen.
Sicherungen auf Arduino werden selten berührt. Es kann den Bootloader töten. Wie @NickHalden erwähnt, warum nicht die Standard-Servobibliotheken verwenden?
@NickHalden ja, ich habe Arduino IDE verwendet und bin damit einverstanden. Ich muss zu AtmelStudio wechseln, damit Sie richtig programmieren können. Aber ich versuche alles nur mit Hilfe des Atmega2560-Datenblatts. Ich wäre wirklich nett, wenn ich ein gutes Tutorial mit einigen funktionierenden und vollständigen Beispielen finden könnte, zumindest nur zum Ansteuern eines Servos.
@jippie bitte beziehen Sie sich auf den obigen Kommentar. (Es ist nicht erlaubt, zwei Personen in einem einzigen Kommentar zu verweisen: D)

Antworten (2)

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