Hallo
Die Funktion ist schnell erklärt. Das Servo reagiert auf die Impulslänge. Eine Impulslänge von ca. 1 Millisekunde stellt das Servo in die Mitte, 0,5ms ist Anschlag auf der einen Seite, 1,5ms auf der anderen Seite. Der Impuls wird alle 20ms wiederholt. Das wars schon.
Die Werte variieren bei den Servos, Die Wiederholung kann bei digitalen Servos oder Brushless-Reglern deutlich häufiger sein. Der Impuls ist fast immer positiv. Da das Puls-Pause-Verhältnis verändert wird, nennt man es PWM.
Ein Servo mit einem Timer anzusteuern ist nicht so sehr kompliziert. Man nimmt einen Mode mit einstellbarem TOP. Dieses TOP wählt man so, dass das Zählregister 20ms braucht um es beim verwendeten Kontrollertakt und gewähltem Vorteiler zu erreichen. Dann schreibt man in das Vergleichsregister den Wert, der der gewünschten Impulsdauer entspricht:
Code:
// Timer1 für 16MHz-ATMega256
# define OC1A PB5
# define OC1B PB6
TCCR1A = 0;
TCCR1B = (0<<CS12)|(1<<CS11)|(0<<CS10); // prescaler /8
TCCR1A |= (1<<WGM11)|(0<<WGM10); // Mode 14: FastPWM mit ICR1 als Top
TCCR1B |= (1<<WGM13)|(1<<WGM12);
TCCR1A |= (1<<COM1A1)|(0<<COM1A0); // OCR1A set on Botton, reset on Match
TCCR1A |= (1<<COM1B1)|(0<<COM1B0); // OCR1B set on Botton, reset on Match
TCNT1 = 0; // Timer1 zurücksetzen;
ICR1 = 40000; // 16MHz/8/20mS für 20ms-Zyklus
OCR1A = 3000; // Match und OC1A auf Low nach 1,5ms
OCR1B = 3000; // Match und OC1B auf Low nach 1,5ms
DDRB |= (1<<OC1A) | (1<<OC1B); // PWM-Pins sind Ausgang...
PORTB &= ~((1<<OC1A) | (1<<OC1B)); // ...und low
(Code für zwei Servos an einem Mega256 mit 16MHz)
Natürlich gibt es noch unzählige andere Möglichkeiten ein Servo anzusteuern.
Gruß
mic
Lesezeichen