Você já deve ter precisado alimentar uma carga que puxa muita corrente com microcontroladores. E deve ter descobrido que é necessário criar um circuito externo para isso. Mas, no caso de motores, existe um circuito específico chamado ponte h. Portanto vamos aprender sobre esse circuito bem útil e prático.
O que é
A ponte H é um circuito que serve para variar o sentido da corrente em uma determinada carga, bem como controlar sua potência. A imagem abaixo é o circuito típico de uma ponte h.
Recomendo a leitura de outro post que expliquei sobre um circuito muito parecido com esse: inversor de tensão.
A ideia principal da ponte h, em relação ao inversor de tensão, é a mesma: Acionando a chave S1 e S4 a corrente flui em um sentido; Acionando a chave S2 e S3, a corrente flui no sentido contrário; e acionando S1 e S2 ou S3 e S4 nada acontece.
A principal diferença é que, na ponte h, nós mantemos um par de chave fixo (S1 e S4 ou S2 e S3). Isto é, a corrente só fluirá em um sentido ao longo do funcionamento da carga. É claro que, se você quiser alterar o sentido de rotação do motor, outro par de chaves deve ser acionado.
É possível também fazermos o controle da tensão em cima do motor de modo a controlar sua velocidade. Abaixo explicarei como isso é feito.
Funcionamento
Para facilitar nossas vidas existem alguns CI’s com o circuito da ponte h internamente. São eles:
- L293d
- L298
- LMD18200
- L9110
Entretanto, para facilitar o entendimento, vou focar no circuito do L293d que pode ser visto abaixo.
L293d
Antes de explicar o funcionamento, vamos esclarecer o que são alguns pinos de acordo com o datasheet.
- Vss – Pino 16: Serve para alimentar o CI com 5v
- Vs – Pino 8: Recebe a mesma tensão de funcionamento do motor para poder alimentá-lo
- GND – Pinos 4,5,12 e 13: Recebem o GND
- Input 1,2 – Pinos 2,7: São as chaves que controlam o motor que pode ser ligado ao pino 3 e 6 (output – lado esquerdo)
- Input 3,4 – Pinos 10,15: São as chaves que controlam o motor que pode ser ligado ao pino 11 e 14 (output – lado direito)
- Enable 1 – Pino 1: Habilita ou desabilita o funcionamento do motor ligado do lado esquerdo
- Enable 2 – Pino 9: Habilita ou desabilita o funcionamento do motor ligado do lado direito
- Output 1,2 – Pinos 3,6: Usados para controlar o motor 1
- Output 3,4 – Pinos 11,14: Usados para controlar o motor 2
Veja a imagem abaixo com ligações de exemplo:
Se você jogar sinal de nível alto (5v) no pino 2 (Input1) e sinal de nível baixo (GND) no pino 7 (Input2), o motor gira no sentido anti-horário. Se você fizer o contrário, a rotação inverte. Isso tudo considerando que o pino Enable 1 esteja acionado (5v).
Repare que o pino Enable serve como uma chave para dizer se o motor pode ser acionado ou não. Sendo assim, podemos alimentar ele com um sinal de PWM e, assim, a tensão em cima do motor será de acordo com o PWM. Ou seja, podemos fazer o controle da velocidade do motor dessa forma.
A ponte h também pode ser utilizada para criar um inversor de tensão ou um circuito elevador de tensão. Enfim, agora você já é capaz de controlar motores em seus projetos de uma forma bem simples.
Este post ajudou-me muito a compreender o quê uma ponte H e como ela funciona.
Ótimo saber isto! Espero que os demais posts do site possam te ajudar da mesma forma.
Com o chaveamento da tensão do PWM do Arduino, a frequência é de 980 Hz.
A reatáncia do motor aumenta ?
Pois Xl = 2 pi f L
De fato faz sentido, Haroldo. Nos motores de indução esse fator é importante, pois a frequência nominal deles é 60Hz (aqui no Brasil), então esse tipo de acionamento talvez exija uma análise mais aprofundada.
Bom, a única coisa que eu tenho a dizer é :
nem todo herói usa capa, alguns usam palavras.
DALE
Hehehe sensacional seu comentário, Guilherme! Brigadão, meu amigo!
PODERIA ME AJUDAR? nesse programa a baixo qual pino da ponte H vai no arduino?
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include "Ultrasonic.h"
//Criando objeto ultrasonic e definindo as portas digitais
//do Trigger - 9 - e Echo - 10
Ultrasonic SensorUltrassonico1(9, 10);
long Microsegundos = 0;// Variável para armazenar o valor do tempo da reflexão do som refletido pelo objeto fornecido pela biblioteca do sensor
float DistanciaemCM = 0;// Variável para armazenar o valor da distância a ser convertido por uma função da própria bilbioteca do sensor
#define MotorLadoEsquerdo1 7
#define MotorLadoEsquerdo2 8
#define MotorLadoDireito1 4
#define MotorLadoDireito2 5
#define VelocidadeMotorLadoEsquerdo 6
#define VelocidadeMotorLadoDireito 3
//============================================================ Escolhe a velocidade dos motores ==================================================================//
int ValorVelocidadeMotorLadoEsquerdo = 80;
int ValorVelocidadeMotorLadoDireito = 60;
void setup() {
//============================================================== Definições de entrada e saída ===================================================================//
pinMode(MotorLadoEsquerdo1, OUTPUT);
pinMode(MotorLadoEsquerdo2, OUTPUT);
pinMode(MotorLadoDireito1, OUTPUT);
pinMode(MotorLadoDireito2, OUTPUT);
Serial.begin(115200);// Inicia a comunicação seria com velocidade de 115200 bits por segundo
delay(3000);// Tempo de espera para inicialização (para dar tempo de por o robô no chão)
}
void loop() {
//Convertendo a distância em CM e lendo o sensor
DistanciaemCM = SensorUltrassonico1.convert(SensorUltrassonico1.timing(), Ultrasonic::CM);
Serial.print(DistanciaemCM);
Serial.println(" cm");
if (DistanciaemCM <= 40) {// Se a distância lida pelo sensor for menor ou igual que 40 centimetros
//Velocidade motor lado esquerdo
analogWrite( VelocidadeMotorLadoEsquerdo, ValorVelocidadeMotorLadoEsquerdo);
//Velocidade motor lado direito
analogWrite( VelocidadeMotorLadoDireito, ValorVelocidadeMotorLadoDireito);
// Motor lado esquerdo para trás
digitalWrite(MotorLadoEsquerdo1, HIGH);
digitalWrite(MotorLadoEsquerdo2, LOW);
// Motor lado direito para trás
digitalWrite(MotorLadoDireito1, HIGH);
digitalWrite(MotorLadoDireito2, LOW);
delay(700);// Tempo que ficará indo para trás
// Motor lado esquerdo para frente
digitalWrite(MotorLadoEsquerdo1, LOW);
digitalWrite(MotorLadoEsquerdo2, HIGH);
// Motor lado direito para trás
digitalWrite(MotorLadoDireito1, HIGH);
digitalWrite(MotorLadoDireito2, LOW);
delay(200);// Tempo que ficará indo para o lado direito
}
else {// Se não, ou seja, se a distância for maior que 40 centimetros
//Velocidade motor lado esquerdo
analogWrite( VelocidadeMotorLadoEsquerdo, ValorVelocidadeMotorLadoEsquerdo);
//Velocidade motor lado direito
analogWrite( VelocidadeMotorLadoDireito, ValorVelocidadeMotorLadoDireito);
// Motor lado esquerdo para frente
digitalWrite(MotorLadoEsquerdo1, LOW);
digitalWrite(MotorLadoEsquerdo2, HIGH);
// Motor lado direito para frente
digitalWrite(MotorLadoDireito1, LOW);
digitalWrite(MotorLadoDireito2, HIGH);
}
}
Olá, Gabriel. Difícil ter certeza sem saber de onde você pegou o código. Mas parece que os pinos 7 e 8 vão no IN1 e IN2, os pinos 4 e 5 no IN3 e IN4, o pino 3 vai no enable 2 e, por fim, o pino 6 no enable 1.