Servoansteuerung über Timer 1 als objektorientiertes Programm
(EN google-translate)
(PL google-translate)
Der nachfolgende Quelltext ist ein Beispiel dafür, wie die Ansteuerung zweier Servos mittels des Timers 1 erfolgen kann.
Im Verlauf der Vorlesung soll der Antrieb als Klasse definiert werden, um zu zeigen, wie sich Mikrocontrollerprojekte modularisieren lassen.
#define WMIN 1000
#define WMITTE 1500
#define WMAX 2000
#define SCHRITTE 1000
//Mode 8
//Phasen- und Frequenz-korrekt
//WGM1 3 2 1 0
// 1 0 0 0
//ICR1=..... TOP
//fpwm = fclk/(2*N*TOP)
//Vorteilung
//N=8
//80Hz = 16000000/(2*8*TOP)
//TOP = 16000000/(2*8*80Hz)=12500
//dt==1000ms*(1/80Hz)/12500 == 0,001ms (1 Schritt == 0,001ms)
//=>
//1ms == 1000 Schritte
//1,5ms == 1500 Schritte
//2ms == 2000 Schritte
void setup()
{
TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<COM1C1) | (0<<COM1C0) | (0<<WGM11) | (0<<WGM10);
TCCR1B = (0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10); //Vort. 256, s.S. 125
ICR1=12500;
DDRB |= (1<<PB5); //OCR1A
DDRB |= (1<<PB6); //OCR1B
OCR1A = WMITTE; //PWM-Breite auf Mitte setzen.
OCR1B = WMITTE; //PWM-Breite auf Mitte setzen.
}
void loop()
{
OCR1A = WMAX; //PWM-Breite auf Null setzen.
OCR1B = WMAX; //PWM-Breite auf Null setzen.
delay(3000);
OCR1A = WMITTE; //PWM-Breite auf Null setzen.
OCR1B = WMITTE; //PWM-Breite auf Null setzen.
delay(3000);
OCR1A = WMIN; //PWM-Breite auf Null setzen.
OCR1B = WMIN; //PWM-Breite auf Null setzen.
delay(3000);
}
Code 0-1: Datei servofein.ino