Driver Shield

Driver Shield управляет двумя моторами по 3 А или четырьмя независимыми линейными драйверами по 1,5 А от источника питания в широком диапазоне 6-36 В, обеспечивая OpenMV Cam надёжным интерфейсом управления моторами с защитой от переполюсовки и выбросов напряжения.

Driver Shield

Полный datasheet, фотографии и информацию для заказа смотрите на странице продукта Driver Shield.

Основные характеристики

  • Два драйвера моторов по 3 А ИЛИ четыре линейных драйвера по 1,5 А, 6-36 В

  • Защита входа от переполюсовки и переходных выбросов напряжения

  • Вход ADC 0-5 В с защитой от перенапряжения ±36 В

  • Цифровой ввод-вывод 0-5 В для триггеров синхронизации камеры, с защитой от короткого замыкания

Распиновка

Распиновка Driver Shield

Описание выводов

Вывод

Функция

P0

DIR для пары выходов O1/O2

P1

DIR для пары выходов O3/O4 (альтернативный)

P2

DIR для пары выходов O3/O4 (по умолчанию)

P6

Считывание AIN с преобразованием уровня (0–3,3 В на P6)

P7

PWM для пары выходов O1/O2

P8

PWM для пары выходов O3/O4

P10

SYN — цифровой ввод-вывод с открытым стоком на клеммной колодке

PWR in

Широкий вход 6–36 В на клеммной колодке (с защитой от переполюсовки)

AIN in

Аналоговый вход на клеммной колодке

VIN out

5,4 В при токе до 600 мА от встроенного стабилизатора

Шина 3,3 В

Питает встроенную электронику шилда

Шина GND

Общая земля

Примечание

AIN защищён от перенапряжения до ±36 В и по умолчанию работает как вход напряжения 0–5 В, масштабируемый до 0–3,3 В на P6. Замкните перемычку режима 4–20 мА на лицевой стороне шилда, чтобы переключить AIN на токовый вход 4–20 мА.

Примечание

SYN — это цифровая линия с открытым стоком, подтянутая к 3,3 В со стороны камеры и к 5 В со стороны клеммы SYN. По умолчанию это вход — шилд преобразует уровень 0–5 В на SYN до 0–3,3 В на P10. Измените положение паяной перемычки на плате, чтобы переключить P10 в режим выхода, преобразуя уровень 0–3,3 В на P10 до 0–5 В на SYN.

Примечание

Каждый из выводов P0, P1, P2, P6, P7, P8 и P10 можно освободить для постороннего использования. P0, P2, P6, P7, P8 и P10 по умолчанию подключены через паяные перемычки на обратной стороне — разомкните перемычку на любом выводе, который хотите освободить. P1 по умолчанию отключён: замкните его перемычку на лицевой стороне, чтобы направить DIR для O3/O4 на P1 (и разомкните перемычку P2 на обратной стороне, чтобы освободить P2).

Примечание

Две перемычки режима на обратной стороне шилда — по одной на каждый H-мост — независимо устанавливают каждую пару выходов в один из трёх режимов. На каждой перемычке есть маркировка L и H, показывающая, какая сторона выбирает какое состояние:

  • Low (по умолчанию) — режим DIR/PWM: один вывод DIR + один вывод PWM на мост.

  • High — режим H-моста: оба вывода управляют мостом напрямую через таблицу истинности двух входов микросхемы.

  • Float (без подключения) — независимый режим: каждый вывод становится отдельным линейным драйвером, направленным на один выход.

Каждый DRV8876 ограничен по току до 3 А суммарно на микросхему — это 3 А через один мост (режим DIR/PWM или H-моста) либо 1,5 А на выход, разделённые между двумя выходами (независимый режим).

Использование

Режим DIR/PWM (по умолчанию)

Управляйте коллекторным двигателем постоянного тока на паре выходов O1/O2 — задайте направление на P0 и подайте PWM-сигнал скорости на P7. Цикл ниже плавно увеличивает скважность до полной скорости и обратно, затем меняет направление и повторяет:

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)

Любой из четырёх выводов также можно использовать как PWM через machine.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)

Прочий ввод-вывод

Считывайте вход AIN с клеммной колодки через вывод P6 с преобразованием уровня:

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)