Control de velocidad pwm de un motor dc usando PIC16f877a
Control de velocidad pwm de un motor dc usando PIC16f877a
Objetivo:
Usar un pic16f877a para controlar en lazo abierto la velocidad un motor dc mediante una señal pwm controlada por un potenciometro.
Material:
Motor DC
LCD
Potenciometro
pic16f877a
ld293 ( Driver puente H )
Teoría:
Control PWM
Es una tecnica para modular la potencia que se entrega a un motor modulando el voltaje de alimentación. El voltaje que se aplica al motor es una señal PWM, la cual es una señal periodica a la cual se cambia el ancho de pulso, entre mas ancho el pulso mayor la potencia entregada.

Modulo convertidor ADC de un pic
Un pic de gama media como el pic16f877a incorporan un convertidor analogico digital que se puede configurar de 8 o 10 bits.
Modulo PWM de un pic

Codigo en PIC C
#INCLUDE <16F877a.H>
#DEVICE ADC=8 // 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
#include «lcd.c» // libreria para el control de LCD
void main(){
FLOAT pwmanalogica;
INT16 pwmdigital; //Variables para lectura de ADC y señal de Control a modulo CCP
lcd_init(); // Turn LCD ON, along with other initialization commands
lcd_gotoxy(1,1);
lcd_putc(«PWM:»);
// periodo reloj = 1/f ; periodo de ciclo maquina = 4/f ; preescaler 2,4, 8, 16 4/f / prescaler;
// F_pwm = F_osc / [4 x PRE x (PR2+1)]
setup_timer_2(t2_div_by_4,249,1); // Configuracion de Timer 2 para establecer frec. PWM a F_pwm = 8M/4*4*(255) = 1960. 8=2khz T=1/2kHz =0.5ms
setup_ccp1(ccp_pwm); //Configurar modulo CCP1 en modo PWM
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);
pwmdigital=read_adc(); //Leer ADC
delay_ms(1);
pwmanalogica=pwmdigital*(100.0/255.0);
lcd_gotoxy(5,1); // point LCD cursor to col5 row1
printf(lcd_putc,»%2.1f»,pwmanalogica);
set_pwm1_duty(pwmanalogica); //
}
}
