Control de posición de servomotor con potenciometro con un pic16f877a
Control de posición de servomotor con potenciometro con un pic16f877a
Objetivo:
Control de posición de servomotor con potenciometro con un pic16f877a
Diagrama Proteus:

Código en pic C:
// autor Christian A. Vazquez
// http://microcontroladores.com.mx
#INCLUDE <16F877a.H>
#DEVICE ADC=10 // resolucion del ADC de 8bits
#USE DELAY(CLOCK=8000000)
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOWRT //Program memory not write protected
#define SERVO PIN_C1
void main(){
float m;
float b;
INT16 ld; //Variables para lectura de ADC y señal de Control a modulo CCP
int16 pulso;
int16 bajo; // tiemp0 que esta en cero
int16 periodo; // periodo de la senal PWM
int i; // generar cliclo for para generar un tren de pulsa
setup_adc(adc_clock_internal); //Configurar ADC
setup_adc_ports(AN0); // AN0 como entrada analogica
while(true){
set_adc_channel(0); //Seleccionar Canal 0
delay_ms(1);
ld=read_adc(); //Leer ADC
delay_ms(1);
m=(2000.0-1000.0)/1024.0;
b=1000.0;
pulso=m*ld+b;
periodo=20000; // 20 ms
bajo=periodo-(pulso); // 20ms – pulso =19 ms
for (i = 0; i < 50; i++)
{
output_high(SERVO); // PIN_C1=1
delay_us(pulso); // retardo pulso
output_low (SERVO); // PIN_C1=0
delay_us(bajo); // retardo bajo
}
}
}
