sábado, 19 de novembro de 2011

Driver para Motor DC com PWM

Pessoal vamos aprender como controlar um motor DC 12V utilizando um driver de potência e o microcontrolador PIC18F.

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