Fork me on GitHub

Microcontrolandos

O Blog está passando por uma fase de mudanças. Todos os posts estão sendo atualizados, códigos, links e imagens estão sendo arrumados. Conteúdos novos ainda estão por vir.

PIC: Controlando Motores DC com L293D

Share:

PIC: Controlando Motores DC com L293D






O CI L293D é um controlador que possui duas Ponte-H. Pode controlar motores de corrente contínua (DC) de 4.5V até 36V. O L293D suporta uma corrente constante de 600mA e uma corrente de pico de 1.2A. Portanto, tome cuidado para não utilizar motores que exijam correntes maiores que 600mA. Também possuem diodos de proteção internamente.

É possível ligar até dois motores ( ou três, para isso consulte o datasheet ).

FUNCIONAMENTO:


EN1IN1IN2Função
HLHGirar para um lado
HHLGirar para outro lado
HLLMotor1 Parado
HHHMotor1 Parado
LXXMotor1 Parado


Os pinos 2 e 7 são a entrada de controle para um motor. Os pinos 10 e 15 são a entrada de controle para um segundo motor.
Os pinos 3 e 6 são a saída do motor 1 e os pinos 11 e 14 para o motor 2.
Os pinos 1 e 9 habitam as saídas dos motores 1 e 2, respectivamente.
O pino 16 é a alimentação do circuito interno, 5V.
O pino 8 é a alimentação do motor, de 4.5V a 36V.

Neste projeto há 4 botões: um para acionar ou desacionar o motor, outro para alterar a direção da rotação e outros dois para aumentar e diminuir a velocidade.

A velocidade do motor é controlada através do canal PWM do PIC conectando no pino 1 (EN1) do L293D.

Para alterar o giro, é só alterar os níveis lógicos nos pinos 2 (IN1) e 7 (IN2), de acordo com a tabela acima.

DOWNLOAD:

CÓDIGO:
MikroC PRO PIC

/*
  Autor: Tiago Henrique
  MCU: PIC16F628A
  Clock: INTOSC 4MHz
  
  Bibliotecas:
  PWM
*/

//Pinos de ligacao do L293D
sbit L293D_M1_P1 at RA1_Bit;
sbit L293D_M1_P2 at RA2_Bit;
sbit L293D_M1_P1_Direction at TRISA1_Bit;
sbit L293D_M1_P2_Direction at TRISA2_Bit;

void L293D_Init()
{
    L293D_M1_P1_Direction = 0;
    L293D_M1_P2_Direction = 0;
    L293D_M1_P1 = 0;
    L293D_M1_P2 = 0;
    PWM1_Init( 500 );
    PWM1_Set_Duty( 127 ); //Velocidade inicial 50%
    PWM1_Start();
}

//direcao == 1 -> gira para um lado
//direcao == 2 -> gira para outro lado
//direcao == 0 -> motor parado
void L293D_Girar( char direcao )
{
    //Define as saidas dos pinos
    L293D_M1_P1 = direcao.B0;
    L293D_M1_P2 = direcao.B1;
}

void main() 
{
char velocidade = 255; //100%
char flags = 0;

    L293D_Init();
    
    CMCON = 7; //Desativa o comparador analogico
    
    //Define os pinos como entrada
    TRISB1_Bit = 1;  //botao de giro
    TRISA4_Bit = 1;  //botao de ligar/ desligar
    TRISB4_Bit = 1;  //botao aumentar velocidade
    TRISB5_Bit = 1;  //botao dimunir velocidade

    while(1)
    {
       //botao RB0 pressionado = girar para direita
       //botao RB0 liberado = girar para esquerda
       //botao RA4 pressionado = motor ligado
       //botao RA4 liberado = motor desligado
       //Essa linha de comando ficou show hein!!!!
       L293D_Girar( PORTA.B4 << PORTB.B0 );
       
       //controlando a velocidade
       
       if( PORTB.B4 ) flags.B0 = 1;
       else if( PORTB.B5 ) flags.B1 = 1;

       if( !PORTB.B4 && flags.B0 )
       {
           flags.B0 = 0;
           velocidade += 5;
           PWM1_Set_Duty( velocidade );
       }
       else if( !PORTB.B5 && flags.B1 )
       {
           flags.B1 = 0;
           velocidade -= 5;
           PWM1_Set_Duty( velocidade );
       }
    }
}

19 comentários:

  1. ficou show mesmo...parabéns pelo blog!

    ResponderExcluir
  2. Muito bom seus projetos! Gostaria de deixar aqui uma sugestão: Tutorial e projeto usando os módulos ethernet para pic e arduino. Veja o que pode fazer, tenho certeza que será um tópico top.
    Obrigado pelo material que vc disponibiliza.

    ResponderExcluir
  3. Ola, nao estou conseguindo fazer download do projeto.

    ResponderExcluir
  4. Parabéns pelo Blog.
    Tem como controlar até 36 motores iguais a este via RS 485?

    ResponderExcluir
    Respostas
    1. Obrigado.
      Precisaria de um expansor de portas IO, como por exemplo, o 74HC595, e vários drivers.

      Excluir
  5. Boas

    O projeto do motor está muito bom.
    Agora precisava da vossa ajuda.
    Como posso por 2 fins de curso no esquema. um switch que seria o fim de curso quando o motor anda para a esquerda e pare e outro switch para parar quando o motor vai para a direita

    Obrigado

    ResponderExcluir
  6. Parabéns Tiago pelo Blog. Eu precisaria de um esquema igual a esse porem para motor de passo unipolar para um espalhador de fio para uma bobinadeira de trafo automática, já fiz o contador com parada automática só falta o do espalhador. vc teria esse esquema com código?

    Desde já Obrigado

    ResponderExcluir
    Respostas
    1. Aqui no blog tem um post falando sobre motores de passo, de uma pesquisada. Abraços.

      Excluir
  7. Olá, quando passo o programa ao ccs compilar ele está dando erro. O que pode ser?

    ResponderExcluir
  8. Bom dia Gostaria de saber qual programa vc usou porque alguns comandos são diferente do ccs

    ResponderExcluir
  9. Muito bom, gostaria de saber se eu quiser ligar 2 motores à minha ponte H com controle de PWM idêntico ao teu projeto, porém com o PIC16F877a, o Enable 2 seria conectado ao CCP2 do PIC? Enable 1 conectado ao CCP1, e depois as entradas conectadas a qualquer PORT do PIC para controlar o giro?

    ResponderExcluir
  10. Muito bom, gostaria de saber se eu quiser ligar 2 motores à minha ponte H com controle de PWM idêntico ao teu projeto, porém com o PIC16F877a, o Enable 2 seria conectado ao CCP2 do PIC? Enable 1 conectado ao CCP1, e depois as entradas conectadas a qualquer PORT do PIC para controlar o giro?

    ResponderExcluir
  11. pode ser outro controlador???
    não to encontrando esse controlador...ele funciona sem??
    e tbm não to conseguindo simular pelo isis no proteus.

    ResponderExcluir
  12. Ola Thiago é possível fazer alguma alteração no projeto para colocar um motor mais forte tipo 5A

    ResponderExcluir
  13. Estou tentando usar o princípio desse programa para fazer um motor se comportar como um rpm analógico por frequência aumentando a frequência o ponteiro sobe diminuindo a frequência o ponteiro desce estou usando um motor DC comum mas não consigo bom resultado.

    ResponderExcluir