0

Ponte H L298N – Aprenda a controlar a velocidade de um motor DC

No último tutorial vimos como ligar um motor DC no Arduino com o auxilio de um módulo Ponte H, usando as suas entradas para variar o sentido de giro. Mas na robótica é comum termos de controlar, além do sentido, a velocidade do motor. Neste tutorial iremos ensinar, de forma simples e didática, como podemos controlar a velocidade de um motor DC.

Como controlar a velocidade de um motor?

Um motor DC gira baseado em campos magnéticos gerados pela corrente que passa em suas bobinas. Pode variar a velocidade do motor podemos alterar essa corrente que é diretamente proporcional a tensão sobre elas.

Campo magnético motor DC

Dessa forma, com a mudança da tensão em cima do motor, teremos uma alteração de velocidade. mas como podemos fazer isso usando o Arduino e a Ponte H? A solução é simples e eficiente e se chama PWM.

 

PWM

PWM (Pulse Width Modulation – Modulação por Largura de Pulso) é uma técnica para obter resultados analógicos por meios digitais (Leia mais sobre Grandezas digitais e analógicas e PWM). Esta técnica consiste na geração de uma onda quadrada em uma frequência muito alta em que pode ser controlada a percentagem do tempo em que a onda permanece em nível lógico alto. Esse tempo é chamado de Duty Cycle(Ciclo de trabalho) e sua alteração provoca mudança no valor médio da onda, indo desde 0V (0% de Duty Cycle) a 5V (100% de Duty Cycle) no caso do Arduino.

 

 

O duty cycle é a razão do tempo em que o sinal permanece na tensão máxima (5V no Arduino) sobre o tempo total de oscilação, como está ilustrado na figura abaixo:

ºDuty Cycle (%) = (x/x+y)*100% = (x/T)*100%

Vmédio = Vmáx*Duty Cycle(%)

 

O valor do Duty Cycle usado pelo Arduino é um inteiro armazenado em 8 bits, de forma que seu valor vai de 0 (0%) a 255 (100%).

Exemplo.: Para um sinal PWM de valor 200 temos:

Se 255 é 100%, 200 é aproximadamente 78,4%.

Como a tensão máxima de saída do Arduino é 5V a tensão média do sinal PWM será:

Vmédio = Vmax*Duty Cycle(%)

Vmédio=5*78,4%

Vmédio=3,92V

Modulando a ponte H

No módulo Ponte H com CI L298N cada ponte H possui um pino que ativa ou não a ponte H. Caso tenha um sinal de 5V inserido nele, a ponte esta ligada, caso seja 0V a ponte esta desligada. Como temos 2 pontes H, temos o Enable A(Ativa A) e o Enable B (Ativa B).

Normalmente o Enable A e B fica em curto com um sinal de 5V da placa através de um jumper.

 

Jumpers Enable A e B

 

Se retiramos esse jumper e inserimos um sinal PWM nessa entrada, modularemos a tensão que é enviada para o motor no mesmo formato. Isso ocorre porque a ponte H só ira “funcionar” enquanto o sinal de Enable estive com 5V.

inal PWM entrando no Enable A em vermelho (5V) e a saída para o motor A em preto (12V).

 

Sendo assim, a saída para o motor será um sinal PWM com um Duty Cycle igual ao do Enable e terá tensão média calculada pela seguinte formula.

Vmédio = Vmax(tensão PonteH)*Duty Cycle(%)

 

Com essa modulação, podemos variar a velocidade do motor através de PWM.

Exemplo de Código 1 – Controle de velocidade

Neste segundo exemplo, vamos verificar o controle de velocidade dos motores A e B.

Para este exemplo, utilizaremos:

  • Arduino UNO
  • Ponte H
  • 2 Motores DC 12V (pode ser feito com apenas 1)
  • Fonte alimentação de 12V

Prossiga com a montagem conforme esquema abaixo(caso use apenas um motor, basta desconsiderar o motor B:

Garanta que seu Arduino e a fonte externa estejam desligados durante a montagem.

 

 

Esquema de montagem exemplo 1

 

 

5Agora vamos à implementação do programa. Dessa forma, dentro da IDE Arduino: escreva o seguinte código e ao final clique em Upload para que o programa seja transferido para seu Arduino.

/*Pinagem do arduino*/
 
//motor A
int IN1 = 2 ;
int IN2 = 4 ;
int velocidadeA = 3;
 
//motor B
int IN3 = 6 ;
int IN4 = 7 ;
int velocidadeB = 5;
 
//variavel auxiliar
int velocidade = 0;
 
//Inicializa Pinos
void setup(){
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(velocidadeA,OUTPUT);
pinMode(velocidadeB,OUTPUT);
}
 
void loop(){
 
/*Exemplo de velocidades no motor A*/
 
//Sentido Horario
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
 
//Alta
analogWrite(velocidadeA,230);
 
//Intermediaria
analogWrite(velocidadeA,150);
 
//Baixa
analogWrite(velocidadeA,80);
 
/*Exemplo de variacao de velocidade no motor B*/
 
//Sentido Horario
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
 
//velocidade de 0 a 255
while (velocidadeB < 255){ analogWrite(velocidadeB,velocidade); velocidade = velocidade + 10; delay(50); } //velocidade de 255 a 0 while (velocidadeB > 0){
analogWrite(velocidadeB,velocidade);
velocidade = velocidade - 10;
delay(50);
}
}

Exemplo de Código 2 – Controlo de velocidade

Caso queira fazer um código mais compacto e modularizado, temos este exemplo de implementação um pouco avançado que usa funções.

#define MOTOR_A 1
#define MOTOR_B 2
#define HORARIO true
#define ANTIHORARIO false

//inicializa pinos
void setup(){
for (int i = 2; i < 8; i++)
pinMode(i,OUTPUT);
}

void loop(){

acionaMotor(MOTOR_A,HORARIO, 255);
acionaMotor(MOTOR_B,ANTIHORARIO, 255);

}

//função para acionamento individual de cada motor
void acionaMotor(int motor, boolean sentido, int velocidade){
if (motor == MOTOR_A){
digitalWrite(2,sentido);
digitalWrite(4,!sentido);
analogWrite(3,velocidade);
}
else if (motor == MOTOR_B){
digitalWrite(6,sentido);
digitalWrite(7,!sentido);
analogWrite(5,velocidade);
}
}

 

Todos os produtos utilizados neste artigo podem ser encontrados na Loja de Eletrónica e Robótica – ElectroFun.

Gostaram deste artigo? Deixem o vosso comentário no formulário a baixo e partilhem com os vossos amigos.

Não se esqueçam de fazer like na nossa Página no Facebook.

Podem ainda colocar as vossas dúvidas no nosso Forum da Comunidade Arduino em Portugal ou no nosso Grupo no Facebook Arduino Portugal – Qual o teu projeto?

Comments

Comentários

mariana guedes

Deixar uma resposta

Este site utiliza o Akismet para reduzir spam. Fica a saber como são processados os dados dos comentários.