thumb

Controle de velocidade de Motor CC com Arduino


Vimos no artigo “Controlando Motores DC com Arduino” como proceder para controlar o sentido de rotação de um Motor DC utilizando o Arduino.

Este tipo de controle é muito utilizado, por exemplo, em projetos de robótica ou de automação industrial. Outro controle bastante importante é o controle de velocidade de motores CC (Corrente Contínua), ou seja, o controle de sua velocidade de rotação.

É possível controlar a velocidade de motores CC utilizando recursos puramente mecânicos, com engrenagens, polias, etc., ou utilizando-se recursos eletrônicos.

Nosso foco é na utilização de circuitos eletrônicos e, nesse campo, há dois métodos principais para se conseguir o controle da velocidade de rotação de motores CC. O primeiro é variando-se a tensão aplicada no motor e o segundo é utilizando uma técnica chamada de modulação PWM.

Em relação ao primeiro método, quanto maior for a tensão aplicada no motor maior será a sua velocidade de rotação. Por outro lado, reduzindo-se a tensão aplicada obtém-se uma velocidade menor. Este método funciona muito bem em alguns casos, contudo ele possui uma desvantagem que deve ser levada em consideração dependendo do tipo de projeto. Com a redução da tensão aplicada no motor também reduzimos sua corrente, com isso, além de reduzirmos a sua velocidade de rotação o motor também perde potência e, consequentemente, seu torque cai.

Com a queda do torque do motor ficamos limitados em relação ao tipo de carga na qual desejamos atuar. Devemos ter em mente que o torque do motor, também conhecido como “Momento”, é igual a “Força” vezes “Deslocamento”. Deste modo, a “Força” de um motor é seu “Momento” dividido pelo “Deslocamento”. Em outras palavras, se o eixo do motor precisar movimentar uma carga qualquer e seu torque for reduzido, a sua “Força” também reduzirá, podendo comprometer sua capacidade de mover a carga.

Para as situações em que não podemos perder torque existe uma segunda maneira de conseguirmos controlar a velocidade de rotação do motor que é utilizando uma técnica chamada de Modulação por Largura de Pulso, ou PWM (Pulse Width Modulation). Esta técnica consiste na aplicação de pulsos de tensão no motor, fazendo com que em um período haja tensão (nível alto) e em outro não (nível baixo).

Deste modo, controlando-se o período do nível alto obtemos uma tensão média que determina a velocidade de rotação do motor. Este método impede que o torque do motor caia, pois a cada aplicação do pulso temos um pico de corrente (corrente máxima), sendo assim, apesar da tensão média poder ser aumentada ou reduzida, a potência do motor não é reduzida. A figura a seguir exemplifica este processo.

 

pwm

Figura 1 – Exemplo de modulação por largura de pulso (PWM).

Note que na figura o período T1 é o tempo em nível alto e o período T2 em nível baixo; como T1, neste exemplo, representa 20% (0,2ms) do  período total (3ms), a tensão média aplicada ao motor é de 6V ( [30V x 0,6ms] / 3ms), ou seja, 20% dos 30V que é a tensão de cada pulso. Como cada pulso é aplicado com sua tensão máxima (30V), não temos perda de corrente e a potência do motor não é alterada. Se aumentarmos o tempo T1 teremos um aumento da tensão aumentando a velocidade de rotação do motor e se reduzirmos este tempo, sua velocidade cairá, mas sua potência não.

Tendo como base a teoria apresentada acima, já temos conhecimento suficiente para iniciarmos nosso projeto.

OBJETIVO: Projetar um circuito com o Arduino que seja capaz de controlar a velocidade de rotação de um Motor DC utilizando a técnica PWM.

MATERIAIS:

  • 1 Arduino
  • 1 Protoboard
  • 1 CI L293B
  • 1 Bateria de 9V
  • 1 Motor DC de 9V
  • 1 Potenciômetro de 10 kOhms
  • Fios Diversos

PROCEDIMENTOS: Montar o circuito conforme apresentado abaixo:

 

protoboard_bb

Figura 2 – Circuito montado no Protoboard.

Na figura 2 podemos ver o circuito montado no Protoboard. O CI L293B é uma ponte H e esta sendo utilizada como “driver” para o motor, já que este CI suporta até 1A de corrente. Como o motor é de 9V, em sua velocidade máxima ele consome em torno de 300mA (dado obtido experimentalmente) e o L293B suporta bem a tarefa de acioná-lo. Caso você não tenha este CI também é possível a utilização de um transistor configurado como chave que suporte a corrente máxima consumida pelo motor. Para saber mais sobre o CI L293B leia o artigo “Controlando Motores DC com o Arduino” e para aprender a trabalhar com transistores, leia a série de artigos relacionados que publicamos aqui no Laboratório de Eletrônica.

O potenciômetro foi ligado à uma das entradas analógicas do Arduino, de modo que ao variarmos sua resistência obteremos um valor correspondente à queda de tensão no mesmo no pino A0 do microcontrolador. Este valor obtido será utilizado para determinar a velocidade do motor. O Arduino possui uma série de pinos (portas) que podem ser utilizadas como PWM. Estas portas podem ser identificadas pelo símbolo “~” impresso em sua placa. No caso do nosso projeto, o pino ~3 esta sendo utilizado como PWM e foi ligado ao pino 1 do L293B. Este pino é o “enable” do CI e toda vez que ele fica em nível alto o circuito fica habilitado para acionar o motor. Variando-se os pulsos aplicados nesse pino com a técnica PWM podemos determinar a velocidade do motor.

O pino 4 do Arduino foi conectado ao pino 2 do L293B; quando este pino é acionado com nível alto o motor começa a girar, desde que o enable do CI esteja ativado e o pino 3 do L293B esteja ligado ao motor, conforme foi configurado no circuito da figura.

PSEUDO-CÓDIGO PARA ARDUINO:

definir pino A0 como pinoPotenciometro
definir pino 4 como pinoMotor
definir pino 3 como pinoVelocidade
 
atribuir nivel alto para o pinoMotor
 
enquanto verdade:
  valorPotenciometro = ( (valor do pinoPotenciometro) * 5) / 1024
  valorPWM = (valorPotenciometro * 255) / 5
  atribuir valorPWM ao pinoVelocidade
fim enquanto

 SKETCH PARA ARDUINO:

int pinoPotenciometro = A0;
int pinoMotor = 4;
int pinoVelocidade = 3;
 
void setup(){
    pinMode(pinoPotenciometro, INPUT);
    pinMode(pinoMotor, OUTPUT);
    pinMode(pinoVelocidade, OUTPUT);
 
    digitalWrite(pinoMotor, HIGH);
}
 
void loop(){
    float valorPotenciometro = (float)(analogRead(pinoPotenciometro) * 5) / 1024;
    float valorPWM = (valorPotenciometro * 255) / 5;
    analogWrite(pinoVelocidade, valorPWM);
}

No código podemos observar que a variável “pinoPotenciometro” será utilizada para ler os valores do potenciômetro de 10 kOhms ligado à porta A0 do Arduino, a variável “pinoMotor”, relacionado ao pino 4 do Arduino”, será utilizada para acionar o pino 2 do CI L293b e a variável “pinoVelocidade”, ligada ao PWM (~3) do Arduino, será conectada ao “enable” do L293B. Na rotina “setup” configuramos os pinos correspondentes como entrada ou saída e atribuímos nível lógico alto para o “pinoMotor”. Como o “pinoVelocidade” ainda não foi acionado o L293B não esta habilitado, consequentemente o motor não esta acionado.

Na rotina “loop” convertemos o valor lido pelo potenciômetro para valores compreendidos entre 0 e 5V atribuindo-os à variável “valorPotenciometro”. Lembre-se que as entradas analógicas do Arduino são de 10 Bits, gerando valores compreendidos entre 0 e 1024 para cada nível de tensão presentes em suas entradas. As saídas PWM do Arduino são de 8 Bits, deste modo, podemos atribuir valores entre 0 e 255 às mesmas. Deste modo, precisamos converter o “valorPotenciometro” para valores compreendidos na faixa aceita pelo PWM. Isto é feito com uma regra de três, cujo resultado é atribuído à variável “valorPWM”. Finalmente podemos atribuir “valorPWM” ao “pinoVelocidade”, o que é feito com o auxílio da rotina “analogWrite”.

 

RESULTADOS: Após montar o circuito e gravar o código no Arduino, ao girar o potenciômetro você notará que o motor girará com velocidades diferentes, sempre mantendo seu torque. Observe o funcionamento do circuito no vídeo abaixo:

 

 

Se você gostou deste artigo e deseja que o Laboratório de Eletrônica continue existindo, por favor compartilhe este post clicando no botão “Compartilhar” abaixo. Obrigado e até a próxima.

 

Compartilhar

 

Comentários

  • Valdemar
    Responder

    Gostei do video , vou ver outros

  • ubirajara
    Responder

    Obrigado por seu tempo.
    Explicação muito clara, que me ajudou bastante.
    Sucesso!

  • William
    Responder

    muito bom, parabens…
    porém eu gostaria de plotar os valores da velocidade e aceleração angular do motor no monitor (serial.print), voce pode me ajudar?

  • Caik
    Responder

    E os cálculos do circuito como vc chegou a esse resultado?

  • Dri
    Responder

    posso usar um motor DC de 5v?

  • AdrianDrike
    Responder

    Howdy !! The name is WILDA LONG. I have a house in Bridgeport. Soon i will turn 57. My school’s name is The Dizzy Military School in Nashua. I work as a Model. My hobby is Kite Boarding. My dad name is Tim and he is a Sexologist. My mother is a Marksman.

  • besyol bbCymn
    Responder

    very good
    thx for information Its googd explanation