Control de Servomotor con PIC

Un servomotor es un gran aliado para controlar la posición de elementos mecánicos, se caracteriza por contar con un engranaje interno que le da torque, un potenciómetro para medir el ángulo y su electrónca interna para recibir los pulsos predefinidos y convertirlos en el ángulo que ocupa el usuario.

En el siguiente ejercicio nuestro servo se controla con pulsos de 1 ms para 0 grados y 2 ms para 180 grados.

Objetivo:Controlar la posición de un servomotor con un potenciómetro generando pulsos PWM.
Material:

Equipo: Software:

Diagrama:

Funcionamiento del Servomor

Para que un servomotor funcione se ocupa una frecuencia constante de 50 hertz con pulsos entre 1 y 2 milisegundos

Cuando trabajamos con servomotores el consumo de corriente puede ser alto, si la misma fuente está conectada al PIC se puede bajar el voltaje y provocar un reset, debe considerar poner dos fuentes si el servomotor es grande y las tierras en común.

Código del microcontrolador

#include <12F510.h>
#device adc=8
#FUSES NOWDT, INTRC, IOSC4                    
#use delay(int=4000000)
void main()
{  int16 adcValue, servoDelay;
   servoDelay=1500;
   setup_adc_ports(AN0_AN1_AN2);           //Configuramos el ADC
   setup_adc(ADC_CLOCK_INTERNAL); 
   set_adc_channel(0);                     //Selecionamos el canal 0 del adc
   while(TRUE)
    { delay_us(20);
      adcValue=read_adc();                 //Leemos el adc
      servoDelay=adcValue*4 + 1000;        //El rango del servo esta entre 1000us y 2000us
      output_high(PIN_B1);                 //Generamos el pulso en base a la lectura del adc
      delay_us(servoDelay);
      output_low(PIN_B1);
      delay_us(2000-servoDelay);           //Compensamos el dato para que quede a la misma frecuencia
      delay_ms(18);
    }
 }

¿Cómo funciona el código?

Al configurar el canal de entrada análoga se esperan 20 us para darle tiempo para que la lectura sea válida, en base al dato se generan pulsos entre 1 y 2 ms, el valor del adc (0-255) se multiplica por 4 para tener un número cercano a 1,000 y sumarlo a los 1,000 en código duro, se pone el PIN_B1 en alto y se mantiene el pulso calculado, al terminar cambia a cero y dura un tiempo complementario (2,000 - servoDelay), para mantener la frecuencia constante a 50 hertz se le suman 18 ms.