3.15. Controlo de motores DC

Um motor DC com escovas é uma bobina de fio num veio dentro de um campo magnético. Ao fazer circular corrente pela bobina, o campo exerce uma força sobre ela; essa força converte-se em binário no veio. As escovas no interior do motor invertem a direção da corrente na bobina à medida que o veio roda, de modo que o binário empurra sempre o veio na mesma direção. Aplique uma tensão DC nos dois terminais do motor e o veio gira; inverta a polaridade e gira no sentido contrário.

Os motores necessitam tipicamente de centenas de miliamperes a vários amperes, com tensões de alimentação acima do nível lógico de 3,3 V da câmara. Um pino GPIO consegue fornecer da ordem dos 25 mA e não pode inverter a polaridade – só pode conduzir para os seus dois níveis. O estágio de acionamento entre a câmara e o motor tem de suportar a corrente do motor, encaminhar uma alimentação de motor separada de tensão mais elevada e permitir que a câmara inverta a polaridade por comando. A ponte H de quatro transístores é a resposta padrão.

3.15.1. A ponte H

Uma ponte H é composta por quatro interruptores dispostos em H em torno do motor:

An H-bridge schematic. Vmotor at top connects through switch S1 down to a node A on the left, and through switch S2 down to a node B on the right. The motor M sits horizontally between A and B. From A another switch S3 goes down to ground; from B another switch S4 goes down to ground.

A ponte H: quatro interruptores (S1S4) ligam o motor M entre Vmotor e a massa.

O fecho de diferentes pares de interruptores seleciona o que o motor vê nos seus terminais:

  • S1 + S4 fechados, S2 + S3 abertos. A corrente flui de Vmotor através de S1, para A, atravessa o motor até B, e passa por S4 para a massa. O motor roda num sentido.

  • S2 + S3 fechados, S1 + S4 abertos. A corrente flui no sentido contrário através do motor. O motor roda no sentido oposto.

  • Todos os quatro abertos. Ambos os terminais do motor ficam em flutuação; o motor entra em modo livre.

  • S3 + S4 fechados (ou S1 + S2 fechados). Ambos os terminais do motor estão ligados ao mesmo nível; a própria energia cinética do motor faz circular uma corrente que o par fechado curto-circuita em calor. O motor trava.

A combinação proibida é fechar ambos os interruptores na mesma coluna – S1 + S3 ou S2 + S4 – o que cria um curto-circuito de Vmotor direto para a massa. Isto chama-se shoot-through, e o código da câmara não o deve permitir.

Na prática, os quatro interruptores são MOSFETs (introduzidos na página Conversão de nível lógico) dentro de um CI driver integrado. O chip expõe dois ou três pinos de entrada de nível lógico que mapeiam internamente para os quatro interruptores e inclui lógica de bloqueio que impede o shoot-through, pelo que o código da câmara não tem de o gerir diretamente.

3.15.2. PWM e a indutância do motor

Definir a velocidade do motor requer mais do que ligar e desligar completamente. O truque é o mesmo que é usado para LEDs em Regulação de luminosidade de LEDs com PWM: pulsar o acionamento a uma frequência elevada e deixar a carga calcular a média do resultado. Para um LED, o integrador era o olho; para um motor é a própria bobina.

A bobina de um motor tem uma indutância considerável. A corrente num indutor não pode mudar instantaneamente; muda a uma taxa proporcional à tensão sobre ele. Pulsar a ponte ligando e desligando a 20 kHz aumenta gradualmente a corrente na bobina durante cada fase ativa, e durante a fase inativa a corrente tem de continuar a fluir – a bobina inverte a tensão sobre si mesma para a manter.

Sem um caminho para onde ir, essa corrente faria disparar a tensão sobre o interruptor recém-aberto e poderia danificar o transístor. Os díodos de roda-livre em paralelo com cada interruptor – muitas vezes apenas os próprios díodos de corpo dos MOSFETs dentro do chip driver – fornecem o caminho de que a corrente necessita. Ela flui através de um díodo e volta pelo circuito através de um dos interruptores ainda fechados, completando um circuito de roda-livre no qual a corrente decai gradualmente através das pequenas resistências da ponte e do próprio motor. O díodo também fixa a tensão sobre o interruptor aberto dentro de uma queda de díodo em relação a qualquer nível para onde o circuito retorna, bem dentro da área de operação segura do MOSFET.

A média da corrente ao longo de cada período PWM é o que produz binário, e essa média acompanha linearmente o ciclo de trabalho – duplicar o ciclo de trabalho duplica aproximadamente o binário e, a carga constante, duplica aproximadamente a velocidade. Ao contrário da regulação de luminosidade de LEDs, onde a resposta não linear do olho exige uma curva, uma varredura linear de duty_u16 já corresponde a uma varredura linear do esforço do motor.

A frequência PWM só tem de ultrapassar dois limiares:

  • Acima de ~20 kHz, a portadora está fora da banda audível humana. Abaixo disso, a força magnética na bobina aumenta e diminui com cada pulso PWM e os enrolamentos e as laminações vibram fisicamente à frequência portadora – o motor torna-se efetivamente um pequeno altifalante emitindo um tom à frequência PWM.

  • Muito acima de ~50 kHz, os MOSFETs e os seus drivers de gate começam a perder eficiência para as perdas de comutação. Durante cada transição on-off, o MOSFET transporta brevemente tanto tensão significativa como corrente significativa, dissipando uma pequena quantidade de energia sob a forma de calor; a capacitância de gate dos MOSFETs também tem de ser carregada e descarregada em cada ciclo, o que é pago pelo chip driver. Ambos os custos escalam com a frequência PWM, pelo que a altas frequências o calor da comutação pode rivalizar com o calor da condução da corrente do motor.

20 kHz é o valor padrão confortável para motores de uso amador.

3.15.3. Acionar uma ponte H

Um chip driver de ponte H com duas entradas mapeia IN1 e IN2 para os quatro interruptores aproximadamente assim:

  • IN1 = 0, IN2 = 0 – livre (todos os quatro interruptores abertos).

  • IN1 = 1, IN2 = 0 – acionar numa direção.

  • IN1 = 0, IN2 = 1 – acionar na outra direção.

  • IN1 = 1, IN2 = 1 – travar.

Acionar as duas entradas como saídas PWM permite à câmara definir a direção escolhendo qual dos dois pinos transporta o ciclo de trabalho, e a velocidade pelo próprio valor do ciclo de trabalho:

import time
from machine import PWM, Pin

in1 = PWM(Pin("P7"), freq=20_000, duty_u16=0)
in2 = PWM(Pin("P8"), freq=20_000, duty_u16=0)

def drive_a(speed):       # speed: 0..65535
    in1.duty_u16(speed)
    in2.duty_u16(0)

def drive_b(speed):
    in1.duty_u16(0)
    in2.duty_u16(speed)

def coast():
    in1.duty_u16(0)
    in2.duty_u16(0)

def brake():
    in1.duty_u16(65535)
    in2.duty_u16(65535)

drive_a(32768)    # half speed in direction A
time.sleep(2)
drive_b(16384)    # quarter speed in direction B
time.sleep(2)
coast()

Uma rampa de desligado para máximo e de volta proporciona uma partida e uma paragem suaves:

for d in range(0, 65535, 256):
    in1.duty_u16(d)
    time.sleep_ms(10)
for d in range(65535, 0, -256):
    in1.duty_u16(d)
    time.sleep_ms(10)

3.15.4. Drivers de direção e velocidade

Uma segunda família de chips de ponte H expõe uma interface mais conveniente: uma entrada digital de direção (frequentemente rotulada DIR ou PH para «phase») mais uma entrada de velocidade (frequentemente PWM ou EN para «enable»). O pino de direção escolhe qual o sentido em que a ponte aciona; o ciclo de trabalho no pino de velocidade define a corrente média.

Isto é mais fácil de controlar por software do que o esquema de duas entradas PWM. Os dois sinais correspondem à forma como o problema é normalmente enunciado – «girar neste sentido, a esta velocidade» – pelo que o código pode usar set_direction(forward); set_speed(50) em vez de ramificar entre in1 e in2. Apenas um canal PWM é necessário, o que liberta o outro canal no mesmo temporizador para uma tarefa não relacionada. E o pino de direção pode ficar estacionado entre mudanças sem rearmar a ponte, de modo que mudar a velocidade a uma direção fixa toca apenas num registo.

import time
from machine import PWM, Pin

dir_pin = Pin("P8", Pin.OUT)
speed = PWM(Pin("P7"), freq=20_000, duty_u16=0)

def drive(direction, speed_u16):
    dir_pin.value(direction)         # 0 or 1
    speed.duty_u16(speed_u16)        # 0..65535

drive(0, 32768)     # direction A at half speed
time.sleep(2)
drive(1, 16384)     # direction B at quarter speed
time.sleep(2)
speed.duty_u16(0)   # stop

O que o «stop» faz efetivamente neste tipo de driver – livre ou travar – depende do chip. Com um driver de duas entradas, o código da câmara escolhe (ambas as entradas baixas para livre, ambas as entradas altas para travar); com um driver de direção e velocidade, o chip decide, pelo que vale a pena dar uma vista de olhos à folha de dados antes de confiar em qualquer um dos comportamentos.