jueves, 25 de junio de 2015

Servomotor con PWM de 16 bits (ATmega328p)

Servomotor con PWM de 16 bits (ATmega328p)

Hola que tal amigos de Don Chipesín, hoy vamos a compartir un código para controlar un servomotor Tower Pro MG995 con el microcontrolador ATmega328P usando su módulo de PWM de 16 bits. Aquí les dejo el código comentado, para la realización del mismo nos basamos en la siguiente página con muy buena información AVR-guide. Si tienen dudas o mejoras no duden en compartirlas con nosotros. Y no se olviden de compartir el blog.

#define F_CPU 1000000
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/io.h>

void inicioServos(){
//Timer1
TCCR1B = 0x00;
//inhabilitar PWM para la configuración

ICR1 = 19999;
//Poner TOP a 20 ms

TCCR1A |= (1 << COM1A1)|(1 << COM1B1);
//Uso del modo no invertido

TCCR1A |= (1 << WGM11);
TCCR1B |= (1 << WGM12)|(1 << WGM13);
//Uso del modo Fast PWM usando ICR1 como TOP

TCCR1B |= (1 << CS10);
//Inicio del PWM sin prescaler
}


void moveGradosA(double grados){//Función para colocar según los grados
double x = (1800) * (grados / 200);//Regla de 3 para encontrar el valor
x = x + 600;                       //para OCR1A
OCR1A = x;
}

void moveGradosB(double grados){
double x = (1800) * (grados / 200);
x = x + 600;
OCR1B = x;
}

int main(void)
{
DDRB = 0xFF;//Puerto B de salida
inicioServos();//inicialización del PWM
sei();         //habilitación de interrupciones
moveGradosA(75);//Mover servo del pin PB1 a 75 grados
moveGradosB(20);//Mover servo del pin PB2 a 20 grados
while (1){

}

}