Control de velocidad pwm de dos motores dc usando un PIC16f887, control motor usando dos potenciometros

Escrito Por: admin Publicado En: Proyectos de microcontroladores PIC Fecha de Creación: 2018-05-31 visitas: 862

Control de velocidad pwm de dos motores dc usando un PIC16f887, control motor usando dos potenciometros

Objetivo:                                     

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 (16x2) 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.

http://miliohm.com/wp-content/uploads/2017/09/L293D-with-motors.png

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

 

http://1.bp.blogspot.com/-O35HZVcDx1c/U2Ow8c-bcMI/AAAAAAAAACA/2laDX5I4eVs/s1600/pwm.gif

 

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

 

 

https://i1.wp.com/electronilab.co/wp-content/uploads/2016/03/PICkit3_MCU_Programmer_debuger_pinout.jpg?ssl=1