驱动扩展板(Driver Shield)¶
驱动扩展板可在 6-36 V 的宽电压供电下驱动两个 3 A 电机或四个独立的 1.5 A 线路驱动器,为 OpenMV Cam 提供坚固的电机控制前端,并具备反向电压和浪涌保护。
完整的数据手册、照片和订购信息请参见 驱动扩展板产品页面。
亮点¶
双路 3 A 电机驱动器或四路 1.5 A 线路驱动器,6-36 V
输入端具备反向电压和瞬态浪涌保护
0-5 V ADC 输入,带 ±36 V 过压保护
0-5 V 数字 I/O,用于摄像头同步触发,具备短路保护
引脚分布¶
引脚参考¶
引脚 |
功能 |
|---|---|
P0 |
输出对 O1/O2 的方向(DIR) |
P1 |
输出对 O3/O4 的方向(DIR,备用) |
P2 |
输出对 O3/O4 的方向(DIR,默认) |
P6 |
电平转换后的 AIN 回读(P6 上为 0–3.3 V) |
P7 |
输出对 O1/O2 的 PWM |
P8 |
输出对 O3/O4 的 PWM |
P10 |
SYN — 接线端子上的开漏数字 I/O |
PWR in |
接线端子上的 6–36 V 宽输入(耐反向电压) |
AIN in |
接线端子上的模拟输入 |
VIN out |
由板载稳压器输出 5.4 V,电流最高可达 600 mA |
3.3V rail |
为扩展板的板载电路供电 |
GND rail |
公共地 |
备注
AIN 具备最高 ±36 V 的过压保护,默认为 0–5 V 电压输入,在 P6 上降压至 0–3.3 V。短接扩展板正面的 4–20 mA 模式分流器,即可将 AIN 切换为 4–20 mA 电流环输入。
备注
SYN 是一条开漏数字线路,在摄像头一侧上拉至 3.3 V,在 SYN 端子一侧上拉至 5 V。默认情况下它是输入 — 扩展板将 SYN 上的 0–5 V 电平转换为 P10 上的 0–3.3 V。改动板载的焊接跳线即可将 P10 切换为输出,将 P10 上的 0–3.3 V 电平转换为 SYN 上的 0–5 V。
备注
P0、P1、P2、P6、P7、P8 和 P10 中的每一个都可以被重新用于无关的用途。P0、P2、P6、P7、P8 和 P10 默认通过背面的焊接跳线连接 — 断开你想释放的任意引脚上的跳线即可。P1 默认断开:短接其正面跳线,即可将 O3/O4 的方向(DIR)改路由到 P1(并断开 P2 背面的跳线以释放 P2)。
备注
扩展板背面有两个模式跳线 — 每个 H 桥一个 — 可分别将每个输出对设置为三种模式之一。每个跳线都有 L 和 H 标记,以指示哪一侧选择哪种状态:
Low(默认) — DIR/PWM 模式:每个桥有一个 DIR 引脚和一个 PWM 引脚。
High — H 桥模式:两个引脚通过芯片的双输入真值表直接驱动桥。
Float(不连接) — 独立模式:每个引脚成为路由到一个输出的独立线路驱动器。
每个 DRV8876 的电流限制为每芯片总计 3 A — 即通过单个桥(DIR/PWM 或 H 桥模式)的 3 A,或在两个输出之间分配的每输出 1.5 A(独立模式)。
用法¶
DIR/PWM 模式(默认)¶
在输出对 O1/O2 上驱动有刷直流电机 — 在 P0 上设置方向,在 P7 上施加 PWM 速度信号。下面的循环将占空比逐渐升至全速再降回,然后翻转方向并重复:
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)
这两个 H 桥也可以驱动双极步进电机 — 将两个 PWM 通道保持在全驱动状态,并让 DIR 引脚遍历四相序列:
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)
H 桥模式¶
将模式跳线设为 high 后,两个桥引脚直接驱动 H 桥。对于 O1/O2,真值表为:
(P0, P7) = (L, L)→ 滑行(输出为高阻态)(P0, P7) = (L, H)→ 正转(O1 = H,O2 = L)(P0, P7) = (H, L)→ 反转(O1 = L,O2 = H)(P0, P7) = (H, H)→ 刹车(两个输出均为低电平)
(O3/O4 遵循相同的真值表,使用 P1/P2 和 P8。)下面的循环让电机在输出对 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)
任一引脚都可替换为 machine.PWM 通道以实现比例驱动 — 例如 (P0=0, P7=PWM) 给出按 PWM 占空比的正转/滑行,(P0=1, P7=PWM) 给出按 (100 % − duty) 的反转/刹车。下面的循环在 P0 保持为 0(正转/滑行)的情况下将占空比逐渐升高再降低:
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)
独立模式¶
将模式跳线置于浮空后,每个引脚成为路由到一个输出的独立线路驱动器 — 适用于电磁阀、继电器或任何不需要 H 桥的开/关负载。映射关系为 P7 → O1、P0 → O2、P8 → O3 和 P1(或 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)
这四个引脚中的任意一个也可通过 machine.PWM 进行 PWM 驱动以实现比例控制 — 例如,依次让每个输出渐亮和渐暗:
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)
其他 I/O¶
通过电平转换后的 P6 引脚读取 AIN 接线端子输入:
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)
对 SYN 线路上的下降沿做出响应 — 例如,让摄像头与另一个将 SYN 拉低的设备同步:
from machine import Pin
def on_sync(pin):
print("SYN falling edge")
syn = Pin("P10", Pin.IN)
syn.irq(on_sync, Pin.IRQ_FALLING)