So, ich hab mir jetzt diesen Code zusammengebaut.
Ich hab mir gedacht die Zeit für eine Periode ist [1/(16.000.000/256/512)*2]=16,384ms. In der zeit zählt der Counter 1mal hoch und runter. Also ist diese zeit auf 1024 (2mal 512) schritte aufgeteilt.Code:#include <avr/io.h> #include <stdint.h> #include <avr/interrupt.h> //#include "servo.h" //da meckert der irgendwie rum #include <util/delay.h> #ifndef F_CPU #define F_CPU 16000000 #endif #define Scheinwerfer 0 #define Rueckleuchten 1 #define PWM_ServoPort 7 int main(void) { cli(); uint8_t i; TCCR1A |= (1<<WGM11)|(1<<COM1A1)|(1<<COM1A0); //9-Bit PWM, Inverted Mode TCCR1B = (1<<CS12); //Prescaler 256 DDRD |= (1<<PD5); PORTD |= ( 1 << PD5 ); //OC1A = 480; sei(); while(1) { OCR1A = 480; for (i=0; i<=100; i++) { _delay_ms(10); } OCR1A =450; for (i=0; i<=100; i++) { _delay_ms(10); } } }
und dann hab ich mit 3-Satz ausgerechnet, wieviele schritte 0,5 ms sind, da der impuls dann durch invertmode beim hochzählen 0,5ms von compare bis Top und beim runterzählen wieder 0,5ms von Top bis Compare dauert also 1ms.
Die rechnung sieht so aus:
512 - 8,192ms
1 - 0,016ms ... 0,5ms/0,016 = 31,25
31,25 - 0,5ms
32 -0,512ms
512-32=480 also OCR1A auf 480 stellen für Tein=1ms bei einer Periodendauer von 16,384.
Wenn man das für Tein = 2ms ausrechnet kommt 450 raus.
Hab ich da einen Denkfehler? Mein Servo macht nicht das was ich will.
Hoffe es hat jemand lust sich damit auseinanderzusetzen. Würde mich auch jeden Fall freuen!!!
Ach ja. Wegen #include "servo.h" meckert der irgendwie rum. Hab das erstmal kommentiert.
MfG Jan
Lesezeichen