Control de posición de servomotor con potenciometro con un pic16f877a

Control de posición de servomotor con potenciometro con un pic16f877a

Escrito Por: admin Publicado En: Proyectos de microcontroladores PIC Fecha de Creación: 2017-12-01 visitas: 2282

Control de posición de servomotor con potenciometro con un pic16f877a

Control de posición de servomotor con potenciometro con un pic16f877a

 

 

 

Codigo 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
}

 

}