[AVRcomC] Micro Servo

#define F_CPU 16000000UL //define freq do microcont 16MHz#include <avr/io.h> //definições componente especificado#include <util/delay.h> //biblioteca das rotinas de delay#define TOP 39999 //valor para a máxima contagem
unsigned int angulo = 0; // variavel angulo do servo
// converte valor do angulo para o contador fazer o pulso unsigned int converte(unsigned int angulo){ OCR1A = (200/9)*angulo+1000; return(OCR1A); } // fim converte
int main(){ DDRB = 0b00000010; // habilita pino OC1A (PB1) como saída PORTB = 0b11111101; // desliga saida PB1 pino 9 //TOP = (F_CPU/(N*F_PWM))-1, com N = 8 e F_PWM = 50 Hz ICR1 = TOP; //configura o período do PWM (20 ms) // Configura o TC1 PWM rápido via ICR1, prescaler = 8 TCCR1A = (1 << COM1A1) | (1 << COM1B1) |(1 << WGM11); TCCR1B = (1 << WGM13) | (1<<WGM12) | (1 << CS11); while(true){ angulo=0; // movimento crescente do eixo do{ converte(angulo); _delay_ms(100); angulo+=10; }while(angulo<180);
angulo=180; // movimento decrescente do eixo do{ converte(angulo); _delay_ms(100); angulo-=10; }while(angulo>=1);
}//programa principal }//--------------------------