Cześć, ostatnimi czasy zmagam się z nauką C, oraz ogólnie mówiąc AVRami.
I tak się męczę z obsługą serwa. Serwo to SG92R.
Pod arduino wszystko działa jak powinno, natomiast w czystym C napotykam gdzieś problem.
Z obliczeń wynika (chyba że źle liczę), że przy taktowaniu procesora 1mHz, najrozsądniej skorzystać z 16bitowego timera, bez prescalera, który będzie liczył do 20000.
Ze zdobytych w internecie informacji wynika że serwo przy okresie sygnału 20ms jest sterowane impulsem od 2ms do 1ms.
Policzyłem sobie i wyszło mi że 1ms to 1000 impulsów timera. Jednak korzystając z tych wartości serwo nie porusza się w pełnym zakresie. Pełen zakres 180 uzyskuję przy ICR - 2300 min i max ICR - 500.
Z czego wynika taka rozbieżność? Może tkwi w tym jakiś banalny błąd?
Tutaj kod jakim testuje (po prostu zmieniam wartość w OCR1A)
#include <avr/io.h>
int main (void)
{
//***IO CONFIG***
DDRB |= (1<<PB1);
//***TIMER1 (PWM)***
TCCR1A |= (1<<COM1A1) | (1<<COM1A0) //OC1A - inverting
| (1<<WGM11); //MODE 14, FAST PWM TOP = ICR1
TCCR1B |= (1<<WGM13) | (1<<WGM12) //MODE 14, FAST PWM ...
| (1<<CS10); //PRESCALER = 1
ICR1 = 20000; //TOP
OCR1A = ICR1-2300;
while(1)
{
//loop
}
}//main