Módulo Driver¶
O Módulo Driver aciona dois motores de 3 A ou quatro drivers de linha independentes de 1,5 A a partir de uma alimentação ampla de 6–36 V, fornecendo à OpenMV Cam uma interface robusta de controlo de motores com proteção contra inversão de polaridade e picos de tensão.
Para o datasheet completo, fotografias e informações de compra, consulte a página do produto Módulo Driver.
Destaques¶
Drivers de motor duplos de 3 A OU drivers de linha quádruplos de 1,5 A, 6–36 V
Proteção contra inversão de polaridade e picos transitórios na entrada
Entrada ADC de 0–5 V com proteção contra sobretensão de ±36 V
I/O digital de 0–5 V para gatilhos de sincronização de câmara, com proteção contra curto-circuito
Pinagem¶
Referência de pinos¶
Pino |
Função |
|---|---|
P0 |
DIR para o par de saídas O1/O2 |
P1 |
DIR para o par de saídas O3/O4 (alternativo) |
P2 |
DIR para o par de saídas O3/O4 (padrão) |
P6 |
Leitura AIN com mudança de nível (0–3,3 V em P6) |
P7 |
PWM para o par de saídas O1/O2 |
P8 |
PWM para o par de saídas O3/O4 |
P10 |
SYN — I/O digital de coletor aberto no bloco de terminais |
Entrada PWR |
Entrada ampla de 6–36 V no bloco de terminais (tolerante à inversão de polaridade) |
Entrada AIN |
Entrada analógica no bloco de terminais |
Saída VIN |
5,4 V a até 600 mA a partir do regulador integrado |
Rail 3.3V |
Alimenta os componentes eletrónicos integrados do módulo |
Rail GND |
Terra comum |
Nota
AIN tem proteção contra sobretensão até ±36 V e aceita por defeito uma entrada de tensão de 0–5 V, escalada para 0–3,3 V em P6. Ponteie o shunt do modo 4–20 mA na frente do módulo para mudar AIN para uma entrada de laço de corrente 4–20 mA.
Nota
SYN é uma linha digital de coletor aberto, com pull-up para 3,3 V no lado da câmara e para 5 V no lado do terminal SYN. Por defeito é uma entrada — o módulo faz a mudança de nível de 0–5 V em SYN para 0–3,3 V em P10. Altere a ponte de solda integrada para colocar P10 em modo de saída, fazendo a mudança de nível de 0–3,3 V em P10 para 0–5 V em SYN.
Nota
Cada um dos pinos P0, P1, P2, P6, P7, P8 e P10 pode ser reclamado para uso independente. P0, P2, P6, P7, P8 e P10 estão ligados por defeito através de pontes de solda na face traseira — abra a ponte de qualquer pino que pretenda libertar. P1 está desligado por defeito: ponteie a sua ponte na face frontal para encaminhar DIR de O3/O4 para P1 (e abra a ponte traseira de P2 para libertar P2).
Nota
Dois jumpers de modo na parte traseira do módulo — um por ponte H — definem independentemente cada par de saídas num de três modos. Cada jumper tem marcações L e H para indicar qual o lado que seleciona cada estado:
Low (padrão) — Modo DIR/PWM: um pino DIR + um pino PWM por ponte.
High — Modo ponte H: ambos os pinos acionam a ponte diretamente através da tabela de verdade de duas entradas do circuito integrado.
Float (sem ligação) — Modo independente: cada pino torna-se um driver de linha autónomo encaminhado para uma saída.
Cada DRV8876 tem limitação de corrente a 3 A no total por circuito integrado — ou seja, 3 A através de uma ponte (modo DIR/PWM ou modo ponte H) ou 1,5 A por saída distribuído pelas duas saídas (modo independente).
Utilização¶
Modo DIR/PWM (padrão)¶
Acionar um motor DC com escovas no par de saídas O1/O2 — defina a direção em P0 e aplique um sinal PWM de velocidade em P7. O ciclo abaixo aumenta o ciclo de trabalho até à velocidade máxima e depois reduz, inverte a direção e repete:
from machine import Pin, PWM
import time
direction = Pin("P0", Pin.OUT)
speed = PWM(Pin("P7"), freq=20_000, duty_u16=0)
def ramp(target):
for duty in range(0, target, 1024):
speed.duty_u16(duty)
time.sleep_ms(10)
for duty in range(target, -1, -1024):
speed.duty_u16(duty)
time.sleep_ms(10)
while True:
direction.value(1) # forward
ramp(65_535)
direction.value(0) # reverse
ramp(65_535)
As duas pontes H podem também acionar um motor de passo bipolar — mantenha os dois canais PWM a acionamento máximo e avance os pinos DIR pela sequência de quatro fases:
from machine import Pin, PWM
import time
dir12 = Pin("P0", Pin.OUT)
dir34 = Pin("P2", Pin.OUT)
PWM(Pin("P7"), freq=20_000, duty_u16=65_535) # full drive on O1/O2
PWM(Pin("P8"), freq=20_000, duty_u16=65_535) # full drive on O3/O4
SEQUENCE = [(1, 1), (0, 1), (0, 0), (1, 0)]
def step(forward=True):
for a, b in SEQUENCE if forward else reversed(SEQUENCE):
dir12.value(a)
dir34.value(b)
time.sleep_ms(5)
while True:
for _ in range(50): # ~1 revolution forward (200 phases)
step()
for _ in range(50): # ~1 revolution backward
step(forward=False)
Modo ponte H¶
Com o jumper de modo em nível alto, ambos os pinos da ponte acionam a ponte H diretamente. Para O1/O2, a tabela de verdade é:
(P0, P7) = (L, L)→ deriva (saídas Hi-Z)(P0, P7) = (L, H)→ frente (O1 = H, O2 = L)(P0, P7) = (H, L)→ trás (O1 = L, O2 = H)(P0, P7) = (H, H)→ travagem (saídas ambas a baixo)
(O3/O4 segue a mesma tabela com P1/P2 e P8.) O ciclo abaixo percorre um motor em frente → travagem → trás → deriva no par de saídas O1/O2:
from machine import Pin
import time
p0 = Pin("P0", Pin.OUT)
p7 = Pin("P7", Pin.OUT)
def drive(a, b):
p0.value(a)
p7.value(b)
while True:
drive(0, 1) # forward
time.sleep(1)
drive(1, 1) # brake
time.sleep_ms(500)
drive(1, 0) # reverse
time.sleep(1)
drive(0, 0) # coast
time.sleep_ms(500)
Qualquer pino pode ser substituído por um canal machine.PWM para acionamento proporcional — por exemplo, (P0=0, P7=PWM) dá frente/deriva ao ciclo de trabalho PWM, (P0=1, P7=PWM) dá trás/travagem a (100 % − duty). O ciclo abaixo aumenta e diminui o ciclo de trabalho com P0 fixo a 0 (frente/deriva):
from machine import Pin, PWM
import time
p0 = Pin("P0", Pin.OUT, value=0)
p7 = PWM(Pin("P7"), freq=20_000, duty_u16=0)
while True:
for duty in range(0, 65_536, 1024):
p7.duty_u16(duty)
time.sleep_ms(10)
for duty in range(65_535, -1, -1024):
p7.duty_u16(duty)
time.sleep_ms(10)
Modo independente¶
Com o jumper de modo flutuante, cada pino torna-se um driver de linha autónomo encaminhado para uma saída — útil para solenoides, relés ou qualquer carga de ligado/desligado que não necessite de uma ponte H. O mapeamento é P7 → O1, P0 → O2, P8 → O3 e P1 (ou P2) → O4:
from machine import Pin
import time
outputs = [
Pin("P7", Pin.OUT), # O1
Pin("P0", Pin.OUT), # O2
Pin("P8", Pin.OUT), # O3
Pin("P2", Pin.OUT), # O4
]
while True:
for o in outputs: # walk a single high pulse across O1–O4
o.value(1)
time.sleep_ms(200)
o.value(0)
Qualquer um dos quatro pinos pode também ser controlado por PWM via machine.PWM para acionamento proporcional — por exemplo, aumentar e diminuir gradualmente cada saída por sua vez:
from machine import Pin, PWM
import time
outputs = [
PWM(Pin("P7"), freq=1_000, duty_u16=0), # O1
PWM(Pin("P0"), freq=1_000, duty_u16=0), # O2
PWM(Pin("P8"), freq=1_000, duty_u16=0), # O3
PWM(Pin("P2"), freq=1_000, duty_u16=0), # O4
]
while True:
for o in outputs:
for duty in range(0, 65_536, 1024):
o.duty_u16(duty)
time.sleep_ms(5)
for duty in range(65_535, -1, -1024):
o.duty_u16(duty)
time.sleep_ms(5)
Outros I/O¶
Ler a entrada do bloco de terminais AIN através do pino P6 com mudança de nível:
from machine import ADC
import time
ain = ADC("P6")
while True:
v = ain.read_u16() * 3.3 / 65535
print("AIN:", v * (5.0 / 3.3), "V")
time.sleep_ms(100)
Reagir a uma aresta descendente na linha SYN — por exemplo, para sincronizar a câmara com outro dispositivo que coloque SYN em nível baixo:
from machine import Pin
def on_sync(pin):
print("SYN falling edge")
syn = Pin("P10", Pin.IN)
syn.irq(on_sync, Pin.IRQ_FALLING)