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:
Diagrama:
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.
#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);
}
}
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.