3.15. Controle de motor DC

Um motor DC com escovas é uma bobina de fio em um eixo dentro de um campo magnético. Faça a corrente passar pela bobina e o campo exerce uma força sobre ela; essa força se torna torque no eixo. Escovas dentro do motor invertem o sentido da corrente na bobina conforme o eixo gira, de modo que o torque sempre empurra o eixo no mesmo sentido. Aplique uma tensão DC nos dois terminais do motor e o eixo gira; inverta a polaridade e ele gira no sentido contrário.

Motores normalmente exigem de centenas de miliampères a vários ampères, em tensões de alimentação acima do trilho lógico de 3,3 V da câmera. Um pino GPIO consegue fornecer cerca de 25 mA e não pode inverter a polaridade – ele só pode acionar seus dois trilhos. O estágio de acionamento entre a câmera e o motor precisa conduzir a corrente do motor, rotear uma alimentação de motor separada e de tensão mais alta, e permitir que a câmera inverta a polaridade sob comando. A ponte H de quatro transistores é a resposta padrão.

3.15.1. A ponte H

Uma ponte H é composta por quatro chaves dispostas em forma de H ao redor do motor:

Um esquema de ponte H. Vmotor no topo conecta-se através da chave S1 para baixo até um nó A à esquerda, e através da chave S2 para baixo até um nó B à direita. O motor M fica na horizontal entre A e B. De A, outra chave S3 desce até o terra; de B, outra chave S4 desce até o terra.

A ponte H: quatro chaves (S1S4) conectam o motor M entre Vmotor e o terra.

Fechar diferentes pares de chaves seleciona o que o motor vê em seus terminais:

  • S1 + S4 fechadas, S2 + S3 abertas. A corrente flui de Vmotor através de S1, para dentro de A, atravessa o motor até B e passa por S4 até o terra. O motor gira em um sentido.

  • S2 + S3 fechadas, S1 + S4 abertas. A corrente flui no sentido oposto pelo motor. O motor gira no sentido contrário.

  • Todas as quatro abertas. Ambos os terminais do motor ficam flutuando; o motor gira por inércia.

  • S3 + S4 fechadas (ou S1 + S2 fechadas). Ambos os terminais do motor ficam ligados ao mesmo trilho; a própria energia cinética do motor gera uma corrente que o par fechado dissipa como calor em curto. O motor freia.

A combinação proibida é fechar ambas as chaves de uma mesma coluna – S1 + S3 ou S2 + S4 – o que forma um curto-circuito de Vmotor direto para o terra. Isso é shoot-through, e o código da câmera não deve permitir.

Na prática, as quatro chaves são MOSFETs (apresentados na página Conversão de nível) dentro de um CI driver integrado. O chip expõe dois ou três pinos de entrada em nível lógico que se mapeiam internamente para as quatro chaves e inclui uma lógica de intertravamento que impede o shoot-through, de modo que o código da câmera não precisa gerenciá-lo diretamente.

3.15.2. PWM e a indutância do motor

Definir a velocidade do motor exige mais do que apenas ligado total e desligado total. O truque é o mesmo usado para LEDs em Dimerização de LED com PWM: pulsar o acionamento em alta frequência e deixar a carga fazer a média do resultado. Para um LED, quem fazia a média era o olho; para um motor, é a própria bobina.

A bobina de um motor tem indutância considerável. A corrente através de um indutor não pode mudar instantaneamente; ela muda a uma taxa proporcional à tensão sobre ele. Pulsar a ponte ligando e desligando a 20 kHz faz a corrente da bobina subir durante cada fase ligada e, durante a fase desligada, a corrente precisa continuar fluindo – a bobina inverte a tensão sobre si mesma para mantê-la.

Sem um caminho por onde ir, essa corrente provocaria um pico de tensão na chave recém-aberta e poderia danificar o transistor. Diodos de roda livre sobre cada chave – muitas vezes apenas os próprios diodos de corpo dos MOSFETs dentro do chip driver – dão à corrente o caminho de que ela precisa. Ela flui por um diodo e retorna por uma das chaves ainda fechadas, completando um laço de roda livre no qual a corrente decai gradualmente através das pequenas resistências da ponte e do próprio motor. O diodo também mantém a tensão sobre a chave aberta dentro de uma queda de diodo em relação ao trilho ao qual o laço retorna, bem dentro da área de operação segura do MOSFET.

A média da corrente ao longo de cada período de PWM é o que produz torque, e essa média acompanha o ciclo de trabalho de forma linear – dobrar o ciclo de trabalho aproximadamente dobra o torque e, sob carga constante, aproximadamente dobra a velocidade. Diferentemente do dimerização de LED, em que 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 de PWM só precisa superar dois limiares:

  • Acima de ~20 kHz a portadora fica fora da faixa audível humana. Abaixo disso, a força magnética sobre a bobina sobe e desce a cada pulso de PWM e os enrolamentos e as lâminas vibram fisicamente na frequência da portadora – o motor efetivamente se torna um pequeno alto-falante emitindo um tom na altura do PWM.

  • Muito acima de ~50 kHz os MOSFETs e seus drivers de gate começam a perder eficiência por causa das perdas de chaveamento. Durante cada transição liga-desliga, o MOSFET conduz brevemente tanto uma tensão significativa quanto uma corrente significativa, dissipando uma pequena rajada de potência na forma de calor; a capacitância de gate dos MOSFETs também precisa ser carregada e descarregada a cada ciclo, o que o chip driver paga. Ambos os custos crescem com a frequência de PWM, então em taxas altas o calor do chaveamento pode rivalizar com o calor da condução da corrente do motor.

20 kHz é o padrão confortável para motores de porte de hobby.

3.15.3. Acionando uma ponte H

Um chip driver de ponte H com duas entradas mapeia IN1 e IN2 para as quatro chaves mais ou menos assim:

  • IN1 = 0, IN2 = 0 – inércia (todas as quatro chaves abertas).

  • IN1 = 1, IN2 = 0 – aciona em um sentido.

  • IN1 = 0, IN2 = 1 – aciona no outro sentido.

  • IN1 = 1, IN2 = 1 – frear.

Acionar as duas entradas como saídas PWM permite que a câmera defina o sentido escolhendo qual dos dois pinos carrega 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 até o máximo e de volta proporciona uma partida e uma parada 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 sentido e velocidade

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

Isso é mais fácil de acionar por software do que o esquema de duas entradas PWM. Os dois sinais correspondem à forma como o problema costuma ser enunciado – “gire para este lado, nesta velocidade” – de modo que o código pode dizer set_direction(forward); set_speed(50) em vez de fazer ramificações entre in1 e in2. Apenas um canal de PWM é necessário, o que libera o outro canal do mesmo timer para uma tarefa não relacionada. E o pino de sentido pode permanecer estacionado entre mudanças sem reacionar a ponte, então mudar a velocidade com sentido fixo afeta apenas um registrador.

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 “parar” de fato faz nesse tipo de driver – girar por inércia ou frear – depende do chip. Com um driver de duas entradas, o código da câmera escolhe (ambas as entradas em nível baixo para inércia, ambas em nível alto para frear); com um driver de sentido e velocidade, o chip decide, então vale a pena dar uma olhada na folha de dados antes de depender de qualquer um dos comportamentos.