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);
}
}