Hallo,
ich sehe da auch ein Problem. Es wird nichts anderes übrig bleiben als
OCR1A für die Periodendauer (TOP) zu nehmen
OCR1B als Compare Register zu nehmen und dann
OC1B als Output Pin (nicht OC1A) zu nehmen.
Oder Du nimmst bzw. wagst(!) WGM13:0 = 14 und stellst TOP mittels ICR1 ein. Ist ein Wagnis da ICRn kein double buffering hat.
Ich habe es da mit meiner PWM einfacher weil ich ICR1 nur einmal auf die von mir gewünschte Periodendauer einstellen muss. Und dann für die Pulsweiten mit OCR1A und OCR1B arbeiten kann:
Code:
const unsigned long fosc=F_CPU/8; // Arduino 16 MHz -> 8-Prescaler -> 2 MHz damit ~32.7ms Periodendauer bei 65535
const unsigned int UpperLimit= (unsigned int) (fosc*0.0025);
const unsigned int LowerLimit= (unsigned int) (fosc*0.0005);
const unsigned int Middle= (unsigned int) (fosc*0.0015);
const unsigned int Period= (unsigned int) (fosc*0.020);
void initServos(void) {
cli();
DDRB = (1<<DDB1)|(1<<DDB2);
// Init Timer1 for ICP and FastPWM Mode 14
ICR1=Period;
// fast PWM mode 14
TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<WGM11) | (0<<WGM10); // non-inverting OC-Mode
TCCR1B = (1<<CS11) | (1<<WGM13) | (1<<WGM12); // 8-Prescaler
OCR1A = Middle;
OCR1B = Middle;
sei();
}
Lesezeichen