Control de velocidad pwm de dos motores dc usando un PIC16f887, control motor usando dos potenciometros
Control de velocidad pwm de dos motores dc usando un PIC16f887, control motor usando dos potenciometros
Objetivos:
- Usar un pic16f887 para controlar en lazo abierto la velocidad de dos motores dc mediante dos señal pwm controladas por dos potenciómetros
- Mostrar en una Lcd (16×2) un valor que indique la potencia que se le entrega al los dos motores DC
Material:
- Motor DC de 12 V
- LCD 16 x2
- 2 Potenciómetros
- PIC16f887
- L293D ( Driver puente H ) o L298D
- pickit 3
Software:
PIC C Compilar
Proteus
Teoría:
Control PWM
Es una técnica para modular la potencia que se entrega a un motor DC, que consiste en modular el voltaje de alimentación por medio de una señal PWM generada por un microcontrolador o un circuito 555
La señal PWM no se aplica directamente al motor DC, se necesita un driver ya que este suministra el voltaje y la corriente necesaria para el motor DC.
Driver L293D
El driver L293D tiene 2 puentes H, nos puede para servir para controlar el giro y la velocidad de dos motores.

|
ENABLE (PWM ) 5V |
IN1 |
IN2 |
Function |
|
H |
H |
L |
Turn right |
|
H |
L |
H |
Turn left |
|
H |
L/H |
L/H |
Fast stop |
|
L |
either |
either |
Slow stop |
Señal PWM
La señal PWM es una señal periódica a la cual se cambia el ancho de pulso, entre mayor sea el ancho el pulso, mayor es la potencia entregada al driver L293D

Frecuencia de la señal PWM
La frecuencia de la señal PWM debe estar en un rango de 500 – 20K Hz, se recomienda una frecuencia alta para que la dinámica del motor la vea como si fuera una señal constante. Lo ideal es que se una frecuencia de 20k para que no produzca un ruido audible al ser humano.
Como calcular la frecuencia de una señal PWM generada por microcontrolador PIC ( pic16f887)
Por ejemplo si queremos que nuestra señal PWM tenga una frecuencia de 2kHz usando el oscilador interno del pic que es 8 M Hz, se calcula con la siguiente formula
F_pwm = F_osc / [4 x PRE x (PR2+1)]
Donde:
F_osc: Frecuencia del oscilación del PIC
PRE : Es el preescaler ( Un prescaler es un circuito que reduce la frecuencia que ingresa a un temporizador-contador dividiéndola para un determinado valor . Por ejemplo, si la relación es 1:8, el prescaler entrega una frecuencia igual a la octava parte de la frecuencia del oscilador)
PR2 es el valor de 8 bits del registro TMR0
Si escogemos
F_osc = 8MHz
PRE = 4
F_PWM=4K Hz
Entonces el parámetro a despejar es PR2
PR2 = ( F_osc / [4 x PRE x F_pwm ] )-1 = ( 8 M Hz / 4 * 4 * 2k)-1 = 249
En este caso la función para configurar la frecuencia de la señal pwm en compilador pic c es
setup_timer_2 (mode, period, postscale)
Mode puedes T2_DISABLED, T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16 ( es el preescaler)
Period is a int 0-255 that determines when the clock value is reset ( es el PR2)
Postscale is a number 1-16 that determines how many timer overflows
Para nuestro caso
setup_timer_2(t2_div_by_4,249,1);
t2_div_by_4 es para definir el Preescaler
249 es PR2 para tener una frecuencia de 2Khz
postscale = 1
before an interrupt: (1 means once, 2 means twice, an so on)
Modulo convertidor ADC de un pic
Un pic de gama media como el pic16f887 incorpora un convertidor analógico digital que se puede configurar de 8 o 10 bits.
Módulo PWM de un pic
El PIC16F887, tiene 2 módulos CCP , los cuales corresponden a los PINES 16 (CCP2/RC1) y 17 (CCP1/RC2), en nuestro caso vamos usar el CCP1 el PIN 17
El pic tiene un módulo para generar una señal pwm a la cual se le puede modular el ancho de pulso con un valor de 8 bits
0 sería un acho de pulso cero, una potencia cero
255 sería un acho de pulso completo, la máxima potencia entregada
Funcionamiento
El microcontrolador lee el voltaje de salida del potenciómetro usando el módulo 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.
Esquema en Proteus

Programa en pic16f887
#INCLUDE <16F887.H> #DEVICE ADC=8 // resolucion del ADC de 8bits #USE DELAY(CLOCK=8000000) #FUSES NOWDT //No Watch Dog Timer #FUSES INTRC_IO //Internal RC Osc, no CLKOUT #FUSES NOPUT //No Power Up Timer #FUSES NOMCLR //Master Clear pin used for I/O #FUSES NOPROTECT //Code not protected from reading #FUSES NOCPD //No EE protection #FUSES NOBROWNOUT //No brownout reset #FUSES NOIESO //Internal External Switch Over mode disabled #FUSES NOFCMEN //Fail-safe clock monitor disabled #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 #FUSES BORV40 //Brownout reset at 4.0V #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 FLOAT pwmanalogica2; INT16 pwmdigital2; //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:"); lcd_gotoxy(1,0); lcd_putc("PWM2:"); // 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); setup_ccp1(ccp_pwm); //Configurar modulo CCP1 en modo PWM setup_ccp2(ccp_pwm); //Configurar modulo CCP1 en modo PWM setup_adc(adc_clock_internal); //Configurar ADC setup_adc_ports(sAN0|sAN1|VSS_VDD); // AN0 como entrada analogica while(true){ set_adc_channel(0); //Seleccionar Canal 0 delay_ms(1); pwmdigital=read_adc(); //Leer ADC delay_ms(1); set_adc_channel(1); //Seleccionar Canal 0 delay_ms(1); pwmdigital2=read_adc(); //Leer ADC //////////////// pwmanalogica=pwmdigital; pwmanalogica2=pwmdigital2; lcd_gotoxy(5,1); // point LCD cursor to col5 row1 printf(lcd_putc,"%2.1f",pwmanalogica); lcd_gotoxy(6,0); // point LCD cursor to col5 row1 printf(lcd_putc,"%2.1f",pwmanalogica2); set_pwm1_duty(pwmanalogica); // set_pwm2_duty(pwmanalogica2); // } }
Para compilar este programa se uso PIC C Compiler
Pines para grabar el pic16f887
Solo se usan cinco pines
VPP=1, VDD=32/11, VSS=31/12, PGD=40, PGC=39

