Hoje irá ser construído um circuito para controlar motores DC.
Os motores eléctricos de qualquer tipo funcionam graças ao electromagnetismo. Permitem converter a energia eléctrica em energia mecânica. Os motores DC são motores de controlo relativamente simples.
São motores que têm dois modos de funcionamento e que os permite girar em ambos os sentidos em função da forma como lhes é aplicada a polaridade do circuito DC.
Habitualmente quando que pretende controlar este tipo de motores, são usadas as chamadas pontes H (H bridges) que podem ser construídas com 4 transístores bipolares (dois NPN e dois PNP) emparelhados de forma a que em função das tensões aplicadas em dois pontos conseguimos controlar o sentido do movimento do motor. Têm a designação de ponte H porque o desenho do circuito assume a forma da letra H.
Atendendo a que qualquer motor também é um gerador têm que se prevenir as chamadas correntes indutivas que são geradas quando o motor se transforma num gerador. Este passo é resolúvel através da colocação de diodos que irão proteger o circuito destas correntes.
É preciso ter em atenção que embora existam dois circuitos de alimentação (um para o controlo e outro para a alimentação dos motores), ambos devem partilhar o GND.
A utilização de uma ponte H para controlo do motor permite separar o circuito de alimentação do motor, que tipicamente precisa de uma tensão e mais corrente, do circuito de controlo.
No circuito que iremos construir iremos usar um IC designado por L293D. Este já incorpora praticamente tudo que precisamos e simplifica grandemente o circuito. A velocidade do motor é controlada por PWM aplicada ao pino de ENABLE do IC.
Este IC é muito interessante porque tem quatro meias pontes H e permite controlar motores até 600mA.
Quando usamos motores diferentes deverá ter-se em atenção das características do mesmo e as limitações do IC em termos de máximo de corrente que pode disponibilizar.
Para suavizar a carga de energia nos motores convém colocar alguns condensadores, isto ajuda a evitar picos e estabiliza a corrente. Na alimentação deverá usar-se um condensador electrolítico de 10 uF com uma tensão miníma superior à usada no circuito de alimentação e também pode ser usado um condensador cerâmico de 220nF mesmo junto a cada motor.
Dica:
- Existe uma forma simples de duplicar a corrente que o L293D pode aguentar. Basta colocar outro em cima do primeiro.
- Pode igualmente usar-se um IC alternativo que é o SN754410NE que suporta até 1A. Sendo necessário neste ultimo acrescentar os diodos de proteção.
Relativamente ao L293D, em função dos valores nos pinos 1,2 e 7 temos os seguintes resultados:
Pino 1 | Pino 2 | Pino 7 | Resultado |
---|---|---|---|
Alto | Baixo | Alto | Girar no sentido dos ponteiros do relógio |
Alto | Alto | Baixo | Girar contra o sentido dos ponteiros do relógio |
Alto | Baixo | Baixo | Parar |
Alto | Alto | Alto | Parar |
Baixo | N/A | N/A | Parar |
Esquemático
Este é um circuito base de uma ponte H construída com transístores:
O circuito usado foi o seguinte:
Componentes (BOM)
Circuito:
- 1x IC L293D
- 1x Botão de pressão (SW1)
- 1x Resistência de 10K Ohms (R2)
- 1x Resistência de 470 Ohms (R1,R3)
- 1x LED de 5mm Verde (D1)
- 1x LED de 5mm Vermelho (D2)
- 1x Resistência Variável de 10K Ohms (RV1)
- 1x Condensador Cerâmico de 220nF (C1)
- 1x Condensador Electrolítico de 10uF 25V (C2)
- 1x Motor DC (M1)
Pin-out dos IC/Componentes
Código
Este sketch deve ser carregado num Arduino através do seu IDE. Quando o botão for premido o motor mudará de direção.
O potenciómetro pode ser usado para mudar a velocidade de rotação do motor.
const int switchPin = 2; // botão
const int speedPin = A0; // ligado no pino do meio do Potenciometro
const int motor1Pin1 = 3; // pino 2 do L293D
const int motor1Pin2 = 4; // pino 7 do L293D
const int enablePin = 9; // pino 1 do L293D (PWM)
void setup() {
pinMode(switchPin, INPUT);
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
pinMode(enablePin, OUTPUT);
digitalWrite(enablePin, HIGH);
}
int direction = false;
void loop() {
int speed = analogRead(speedPin);
speed = map(speed, 0, 1023, 0, 255);
analogWrite(enablePin, speed); // PWM
if (digitalRead(switchPin) == LOW) {
direction = !direction;
}
if (direction) {
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, HIGH);
} else {
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
}
}
// Sketch uses 1,772 bytes (5%) of program storage space. Maximum is 32,256 bytes.
// Global variables use 17 bytes (0%) of dynamic memory, leaving 2,031 bytes for local variables. Maximum is 2,048 bytes.