Control de velocidad pwm de un motor dc usando PIC18f4550

Control de velocidad pwm de un motor dc usando PIC18f4550

Objetivo:

Usar un pic18f4550 para controlar en lazo abierto la velocidad un motor dc  mediante una señal pwm controlada por un potenciometro.

Material:

  • Motor DC
  • LCD
  • Potenciometro
  • PIC18f4550
  • 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  como el PIC18f4550  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.

Esquema en Proteus

 





Programa en pic18f4550

Para compilar este programa se uso PIC C Compiler

#include <18F4550.h>
#device ADC = 10
#fuses NOMCLR INTRC_IO
#use delay(clock = 8000000)

//LCD module connections
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_ENABLE_PIN PIN_D2
#define LCD_DATA4 PIN_D3
#define LCD_DATA5 PIN_D4
#define LCD_DATA6 PIN_D5
#define LCD_DATA7 PIN_D6

#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

output_c(0); // PORTC initial state
set_tris_c(0); // Configure PORTC pins as outputs
output_d(0); // PORTD initial state
set_tris_d(0); // Configure PORTD pins as outputs
setup_adc(ADC_CLOCK_DIV_8); // Set ADC conversion time to 8Tosc
setup_adc_ports(AN0); // Configure AN0 as analog input

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 *