Projeto: Controlar a velocidade de um motor DC utilizando o PWM do PIC18F4520
Descrição: O projeto controla a velocidade de um motor DC através do hardware PWM do PIC, e sua rotação, fazendo girar no sentido horário e anti-horário.
Vantagem: Utilizando o driver L298N você economiza tempo de projeto, diminui os ricos de funcionamento e ainda diminui o tamanho de sua placa.
Resumo do driver.
data sheet do driver
O L298 é um circuito integrado capaz de acoplar sinal de nível TTL em um driver para acionamento de cargas indutivas, relês, solenoides e motores de passo. Possui duas entradas individuais de habilitação capazes de habilitar individualmente cada saída.
Esquema do circuito no proteus
Código Fonte: O código fonte foi escrito na linguagem C, para o compilador Mikro C.
Segue o código./*********************************************************************
PROJETO DRIVER MOTOR D.C HI-Z Vale
Autor: Rodrigo Mira
e-mail: hizvale@hizvale.com.br
www.hizvale.com.br
Motor D.C
**********************************************************************/
sbit LCD_RS at RE1_bit;
sbit LCD_EN at RE0_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISE1_bit;
sbit LCD_EN_Direction at TRISE0_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
sbit ENA at RC3_bit;
sbit ENB at RC4_bit;
sbit INT_0 at RB0_bit;
sbit INT_1 at RB1_bit;
sbit INT_2 at RB2_bit;
#define INT0 PORTBbits.RB0
#define INT1 PORTBbits.RB1
#define INT2 PORTBbits.RB2
char txt1[] = "MOTOR:";
char txt2[] = "Duty Cycle";
unsigned char selectMotor = 1,speed = 20,aux;
void main() {
PWM1_Init(500); // inicializa módulo PWM1 para 500Hz
PWM2_Init(500); // inicializa módulo PWM2 para 500Hz
PWM1_Start(); // inicia PWM1
PWM2_Start(); // inicia PWM2
Lcd_Init(); // inicializa LCD
Lcd_Cmd(_LCD_CLEAR); // limpa display
Lcd_Cmd(_LCD_CURSOR_OFF); // desliga cursor
TRISC = 0; // configura PORTC como saída
TRISE = 0; // configura PORTE como saída
TRISD = 0; // configura PORTD como saída
TRISB = 0x0F; // configura os quatro 4 primeiros bits do PORTB como entradas
ADCON1 = 0x0F; // desliga conversor A/D
speed = 20; // duty cycle
for(;;){
if(INT_0 == 0){
while(INT_0 == 0);
if (speed < 235){
speed +=20;
}
}
if(INT_1 == 0){
while(INT_1 == 0);
if (speed > 20){
speed -=20;
}
}
if(INT_2 == 0){
while(INT_2 == 0);
if(selectMotor == 1)selectMotor = 2;
else if(selectMotor == 2)selectMotor = 1;
}
switch(selectMotor){
case 1:
ENA = 1;
ENB = 0;
Lcd_Out(2,1,txt2); // Write text in first row
aux = speed / 100;
Lcd_Chr(2,12,aux + 48);
aux = speed % 100;
aux = aux / 10;
Lcd_Chr(2,13,aux + 48);
aux = aux % 10;
Lcd_Chr(2,14,aux + 48);
Lcd_Out(1,1,txt1); // Write text in first row
Lcd_Chr(1,8, selectMotor + 48);
PWM1_Set_Duty(speed);
PWM2_Set_Duty(0);
break;
case 2:
ENA = 0;
ENB = 1;
Lcd_Out(2,1,txt2); // Write text in first row
aux = speed / 100;
Lcd_Chr(2,12,aux + 48);
aux = speed % 100;
aux = aux / 10;
Lcd_Chr(2,13,aux + 48);
aux = aux % 10;
Lcd_Chr(2,14,aux + 48);
Lcd_Out(1,1,txt1); // Write text in first row
Lcd_Chr(1,8, selectMotor + 48);
PWM2_Set_Duty(speed);
PWM1_Set_Duty(0);
break;
}
}
}
Nenhum comentário:
Postar um comentário