Driver Shield¶
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 輸入 |
端子台上的 6–36 V 寬範圍輸入(可承受反向電壓) |
AIN 輸入 |
端子台上的類比輸入 |
VIN 輸出 |
來自板載穩壓器的 5.4 V,最高可達 600 mA |
3.3V 電源軌 |
為擴充板的板載電子元件供電 |
GND 電源軌 |
共同接地 |
備註
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)→ 滑行(輸出為 Hi-Z)(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)