Servomotor «control PWM», Pic C Compiler

En esta sección aprenderás a programar una señal PWM para controlar un servomotor. El objetivo es genera la señal PWM que controla el servomotor y modular el ancho de pulso de la señal con un potenciómetro.

Servomotor

El servomotor  es un dispositivo que contiene un motor de corriente continua, tiene la capacidad de controlar el movimiento rotacional dentro de un rango de grados de libertad manteniendo su posición a través de una señal PWM controlada por un microcontrolador. Existe una gran cantidad de tamaños, grados de libertar y el peso que pueden soportar normalmente se necesitan servomotores industriales para soportar un gran peso.

Características:

  • Pin cable rojo Alimentación (+5V).
  • Pin cable cafe o marrón negativo ( – ).
  • Pin cable naranja señal (PWM).

Circuito de conexión

Calcular PR2 para establecer la frecuencia de 60Hz

Código archivo .h

En el archivo .h se define el oscilador interno de 500Khz, este es necesario para que la frecuencia de la señal PWM sea la correcta.

#use delay(internal=500000)

Código archivo .c

Se habilita el timer2 y se define la frecuencia de la señal PWM de salida.

setup_timer_2(T2_DIV_BY_16,155,1);// señal de 50Hz o  20 ms

Se habilita el pin CCP1, por el cual saldrá la señal PWM. 

setup_ccp1(CCP_PWM);//habilita el pin ccp1 

Como se utilizara un potenciómetro para modificar el ciclo de trabajo se habilita el pin analógico 0 donde se conectara el potenciómetro.

setup_adc(ADC_CLOCK_INTERNAL);//conversion analogico digital
set_adc_channel(0);//lectura Vout del potenciometro en pin AN0

La siguiente instrucción guarda el valor del potenciómetro. 

x=read_adc();//lectura del potenciometro

Se realiza una conversión de 0 a 1023 del potenciómetro por 0 a 62.4 del ciclo de trabajo. 

dutyclicle=(x*31.2)/1023;//conversion de 0 a 1023 por 0 a 31.2
dutyclicle=dutyclicle+31.2;// de 31.2 a 62.4 de 1ms a 2ms

Finalmente se define la instrucción que modifica el ciclo de trabajo de la señal PWM girando el potenciómetro.

 set_pwm1_duty((int16)dutyclicle); 

Código completo

#FUSES NOMCLR

void main()
{

   setup_timer_2(T2_DIV_BY_16,155,1);// señal de 50Hz o  20 ms
   
   setup_ccp1(CCP_PWM);//habilita el pin ccp1 

   setup_adc(ADC_CLOCK_INTERNAL);//conversion analogico digital
   set_adc_channel(0);//lectura Vout del potenciometro en pin AN0
   
   float dutyclicle=0;
   int16 x=0;
   while(TRUE)
   {
      x=read_adc();//lectura del potenciometro
      
      dutyclicle=(x*31.2)/1023;//conversion de 0 a 1023 por 0 a 31.2
      
      dutyclicle=dutyclicle+31.2;// de 31.2 a 62.4 de 1ms a 2ms 
            
      set_pwm1_duty((int16)dutyclicle); 
   }

}
Scroll al inicio