Main Content

Circuitos_1

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 1Pino 2Pino 7Resultado
AltoBaixoAltoGirar no sentido dos ponteiros do relógio
AltoAltoBaixoGirar contra o sentido dos ponteiros do relógio
AltoBaixoBaixoParar
AltoAltoAltoParar
BaixoN/AN/AParar

Esquemático

Este é um circuito base de uma ponte H construída com transístores:

Circuitos_3_Schematics

O circuito usado foi o seguinte:

Circuitos_3_Schematics

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

Circuitos_4_Pinout

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.