驱动扩展板(Driver Shield)

驱动扩展板可在 6-36 V 的宽电压供电下驱动两个 3 A 电机或四个独立的 1.5 A 线路驱动器,为 OpenMV Cam 提供坚固的电机控制前端,并具备反向电压和浪涌保护。

驱动扩展板(Driver Shield)

完整的数据手册、照片和订购信息请参见 驱动扩展板产品页面

亮点

  • 双路 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)