Pages Menu
TwitterFacebook



BANNER2_ALT

Posted by on Abr 15, 2014 in AVR, Uncategorized | 1 comment

Servomotor

Servomotor

Servomotor

 Descripción

 Existen varias maneras de generar un PWM capaz de controlar un servomotor, pero esta vez, se hará a través de un PWM por software, esto es, se generara la rutina para activar y desactivar un pin del puerto es cual controlara el servomotor, que a su vez, estará siendo controlado con un potenciómetro conectado al ADC.

 

Diagrama Esquemático

Servo

 

 Materiales

  • 1 Servomotor
  • 1 Resistencia de 220 Ohms
  • 1 Potenciómetro de 10Kohms
  • 1 Microcontrolador ATmega8
  • Programador USBasp V3.0

 

 Introducción

Servomotor

Un servomotor es un dispositivo actuador que tiene la capacidad de ubicarse en cualquier posición dentro de su rango de operación, y de mantenerse estable en dicha posición. Está formado por un motor de corriente continua, una caja reductora y un circuito de control, y su margen de funcionamiento generalmente es de menos de una vuelta completa.

El servomotor usado para el ejemplo es un Hitec HS475HB.

Servomotor  Hitec 475

Servomotor Hitec HS475HB

 

 Los servomotores trabajan con PWM, estos tienen tres cables, uno para alimentar el motor, otro de tierra y el tercero es el de la señal, el cual se conectara al microcontrolador al pin de salida del PWM.

Servomotor

PWM Servomotor

 

 

Como se puede ver en la imagen, a mayor ancho de pulso, es mayor el ángulo de trabajo del servomotor. Este al posicionarse en determinado ángulo, permanecerá en el mismo con torque siempre y cuando se siga generando la señal.

Programa en C

#include<avr/io.h>
#include<util/delay.h>

int servo(int SH){                   //Función para generar la señal PWM por software
int i,k;
PORTB|=_BV(PB0);                     //Se activa el bit 0 del PORTB
for (i = 0; i <= SH; i++)            //Ciclo for de 0 hasta el valor introducido por la entrada
{_delay_us(1);}                      //de la función, con la variable SH, SH veces
PORTB&=~(_BV(PB0));                  //Desactiva el bit 0 del PORTB
for (k = 0; k <= (10000-SH); k++)    //Ciclo de 0 hasta 10000-SH
{_delay_us(1);}                      //Se repetirá 10000-SH veces
}
return 0;                            //Como la función no es void se regresa un 0
}
int main (void)                      //Inicio del programa
{
int ADC_val;
DDRB = 0xFF;
ADCSRA = 0xC0;                       //Se  configura el ADC
ADMUX  = 0x22;
while(1) {                           //Ciclo infinito
ADCSRA|=_BV(ADSC);                   //Iniciar conversión
ADC_val=((ADCH*200)/254)+50;         //Tomar valor y ajustarlo para el servo
servo(ADC_val);                      //Llamar la función servo, con la entrada ADC_va, la cual
}                                    //Dentro de la función, será SH
}

 

Detalles del programa

int servo(int SH){

Esta función es la que nos servirá para generar los pulsos necesarios para hacer funcionar el servomotor, nótese que en este caso, a diferencia del ejemplo anterior, se está generando PWM a través de la programación y no del modulo que el microcontrolador ya trae integrado. Esto con la finalidad de no depender de el miso.

PORTB|=_BV(PB0);
for (i = 0; i <= SH; i++)
{_delay_us(1);}

Después de activar el primer bit del puerto B, va a mandar un nivel de voltaje alto a través del pin correspondiente. El ciclo for como se puede ver, va desde 0 hasta que  sea mayor o igual a SH, y dentro del ciclo se está repitiendo la instrucción de retardo de 1 micro segundo, por lo tanto, se puede interpretar como que se activa el pin de puerto con un tiempo de SH micro segundos.

1logic

1 Logic

 

 

 

PORTB&=~(_BV(PB0));
for (k = 0; k <= (10000-SH); k++)
{_delay_us(1);}

 En este caso, ocurre algo similar que en el paso anterior, con la principal diferencia de que la señal va de un nivel alto a un nivel bajo, y espera una cantidad de 10000-SH micro segundos. La resta es necesaria, ya que no se puede suponer un valor fijo para el tiempo en bajo, ya que si el tiempo fuera fijo, en caso de que el tiempo en alto variase, también variaría la frecuencia, por lo tanto, se ajusta restando el valor de SH para que la proporción que SH varia, también lo haga el tiempo en bajo, y así se logra que la frecuencia sea fija.

tiempo en bajo pwm

Tiempo en bajo pwm

 

 

ADCSRA = 0xC0;
ADMUX  = 0x22;

 El ADC se configura de la misma manera que se configuro para el ejemplo del ADC

ADCSRA|=_BV(ADSC);

Se le indica al ADC que inicie la conversión.

ADC_val=((ADCH*200)/254)+50;

 

Al igual que en el ejemplo del ADC se ajustan los valores, pero en este caso se le añade un offset (+50) ya que el servo no inicia con una modulación del 0%.

 

recta

RECTA

 

 

servo(ADC_val);

Se manda a llamar la función servo, con el valor del ADC_val como entrada, el cual será el tiempo en alto de la señal, proporcional al ciclo de trabajo.

 

servo pwm

Servo pwm

 

pwm servo

Servo pwm

 

servo pwm

Servo pwm

 

 

Como se puede ver en las imágenes, aunque el SH se modifique, el tiempo en bajo siempre se ajusta para no modificar la frecuencia, ya que el periodo de la señal es constante.

1 Comment

Post a Reply

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *