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

El pic tiene un modulo para generar un señal pwm a la cual se le puede modular el ancho de pulso con un valor de 8 bits  
0 seria una acho de pulso cero, una potencia cero 
255 seria un acho de pulso completo, la maxima potencia entregada
Funcionamiento
El microcontrolador lee el voltaje de salida del potenciometro usando el modulo ADC lo convierte en un valor digital, y en función de ese valor, el PIC genera una señal PWM  con un ancho de pulso determinado,  esta señal se conecta al ENABLE de un driver puente H ( LD293D)  el cual a su vez se conecta con el motor DC.

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *