3.15. Управление двигателем постоянного тока

Щёточный двигатель постоянного тока представляет собой катушку из провода на валу внутри магнитного поля. Пропустите ток через катушку, и поле начнёт действовать на неё с силой; эта сила превращается в крутящий момент на валу. Щётки внутри двигателя переключают направление тока в катушке по мере вращения вала, так что крутящий момент всегда толкает вал в одном и том же направлении. Подайте постоянное напряжение на два вывода двигателя, и вал завращается; поменяйте полярность, и он завращается в другую сторону.

Двигателям обычно требуются от сотен миллиампер до нескольких ампер при напряжениях питания выше логического уровня 3,3 В камеры. Вывод GPIO может отдавать ток порядка 25 мА и не может менять полярность – он способен подключать лишь к двум своим шинам. Выходной каскад между камерой и двигателем должен пропускать ток двигателя, подводить отдельное питание двигателя с более высоким напряжением и позволять камере менять полярность по команде. Четырёхтранзисторный H-мост – это стандартное решение.

3.15.1. H-мост

H-мост – это четыре ключа, расположенные в виде буквы H вокруг двигателя:

Схема H-моста. Vmotor сверху подключается через ключ S1 вниз к узлу A слева и через ключ S2 вниз к узлу B справа. Двигатель M расположен горизонтально между A и B. От A ещё один ключ S3 идёт вниз к земле; от B ещё один ключ S4 идёт вниз к земле.

H-мост: четыре ключа (S1S4) соединяют двигатель M между Vmotor и землёй.

Замыкание различных пар ключей определяет, что двигатель видит на своих выводах:

  • S1 + S4 замкнуты, S2 + S3 разомкнуты. Ток течёт от Vmotor через S1, в A, через двигатель к B и через S4 к земле. Двигатель вращается в одну сторону.

  • S2 + S3 замкнуты, S1 + S4 разомкнуты. Ток течёт через двигатель в другую сторону. Двигатель вращается в другую сторону.

  • Все четыре разомкнуты. Оба вывода двигателя свободны; двигатель катится по инерции.

  • S3 + S4 замкнуты (или S1 + S2 замкнуты). Оба вывода двигателя подключены к одной и той же шине; собственная кинетическая энергия двигателя создаёт ток, который замкнутая пара рассеивает в виде тепла. Двигатель тормозит.

Недопустимая комбинация – замыкание обоих ключей в одном столбце – S1 + S3 или S2 + S4 – что образует короткое замыкание от Vmotor прямо к земле. Это сквозной ток, и код камеры не должен его допускать.

На практике четыре ключа – это MOSFET-транзисторы (представленные на странице Согласование уровней) внутри интегральной микросхемы драйвера. Чип предоставляет два или три логических входных вывода, которые внутренне сопоставляются с четырьмя ключами, и содержит логику блокировки, предотвращающую сквозной ток, так что коду камеры не приходится управлять этим напрямую.

3.15.2. ШИМ и индуктивность двигателя

Чтобы задать скорость двигателя, недостаточно полного включения и полного выключения. Приём тот же, что использовался для светодиодов в Регулирование яркости светодиода с помощью ШИМ: подавать привод импульсами высокой частоты и позволить нагрузке усреднить результат. Для светодиода усреднителем был глаз; для двигателя – сама катушка.

Катушка двигателя обладает значительной индуктивностью. Ток через индуктивность не может измениться мгновенно; он меняется со скоростью, пропорциональной напряжению на нём. Подача импульсов на мост с включением и выключением на частоте 20 кГц наращивает ток катушки в течение каждой фазы включения, а в течение фазы выключения ток должен продолжать течь – катушка меняет полярность напряжения на себе, чтобы поддержать его.

Не имея, куда деться, этот ток создал бы скачок напряжения на только что разомкнутом ключе и мог бы повредить транзистор. Обратные (вентильные) диоды на каждом ключе – часто это просто собственные паразитные диоды MOSFET-транзисторов внутри микросхемы драйвера – дают току необходимый путь. Он течёт через диод и обратно через один из ещё замкнутых ключей, замыкая контур самоиндукции, в котором ток постепенно затухает на малых сопротивлениях моста и самого двигателя. Диод также удерживает напряжение на разомкнутом ключе в пределах падения на диоде относительно той шины, к которой возвращается контур, что лежит хорошо внутри безопасной области работы MOSFET.

Среднее значение тока за каждый период ШИМ – это то, что создаёт крутящий момент, и это среднее линейно следует за коэффициентом заполнения – удвоение коэффициента заполнения примерно удваивает крутящий момент, а при постоянной нагрузке примерно удваивает скорость. В отличие от регулирования яркости светодиодов, где нелинейный отклик глаза требует кривой, линейное изменение duty_u16 уже соответствует линейному изменению усилия двигателя.

Частота ШИМ должна лишь преодолеть два порога:

  • Выше ~20 кГц несущая выходит за пределы слышимого человеком диапазона. Ниже этого магнитная сила на катушке нарастает и спадает с каждым импульсом ШИМ, и обмотки и пластины сердечника физически вибрируют на частоте несущей – двигатель фактически становится маленьким динамиком, излучающим тон на частоте ШИМ.

  • Значительно выше ~50 кГц MOSFET-транзисторы и их драйверы затворов начинают терять КПД на коммутационных потерях. Во время каждого перехода включения-выключения MOSFET кратковременно пропускает одновременно значительное напряжение и значительный ток, рассеивая небольшой всплеск мощности в виде тепла; ёмкость затвора MOSFET также приходится заряжать и разряжать каждый цикл, за что платит микросхема драйвера. Обе эти затраты растут с частотой ШИМ, так что на высоких частотах тепло от коммутации может сравниться с теплом от проведения тока двигателя.

20 кГц – удобное значение по умолчанию для двигателей любительского размера.

3.15.3. Управление H-мостом

Микросхема драйвера H-моста с двумя входами сопоставляет IN1 и IN2 с четырьмя ключами примерно так:

  • IN1 = 0, IN2 = 0 – инерционный выбег (все четыре ключа разомкнуты).

  • IN1 = 1, IN2 = 0 – привод в одном направлении.

  • IN1 = 0, IN2 = 1 – привод в другом направлении.

  • IN1 = 1, IN2 = 1 – торможение.

Подача на два входа сигналов ШИМ позволяет камере задавать направление выбором того, который из двух выводов несёт коэффициент заполнения, а скорость – самим значением коэффициента заполнения:

import time
from machine import PWM, Pin

in1 = PWM(Pin("P7"), freq=20_000, duty_u16=0)
in2 = PWM(Pin("P8"), freq=20_000, duty_u16=0)

def drive_a(speed):       # speed: 0..65535
    in1.duty_u16(speed)
    in2.duty_u16(0)

def drive_b(speed):
    in1.duty_u16(0)
    in2.duty_u16(speed)

def coast():
    in1.duty_u16(0)
    in2.duty_u16(0)

def brake():
    in1.duty_u16(65535)
    in2.duty_u16(65535)

drive_a(32768)    # half speed in direction A
time.sleep(2)
drive_b(16384)    # quarter speed in direction B
time.sleep(2)
coast()

Плавное нарастание от выключенного состояния до максимума и обратно обеспечивает мягкий пуск и остановку:

for d in range(0, 65535, 256):
    in1.duty_u16(d)
    time.sleep_ms(10)
for d in range(65535, 0, -256):
    in1.duty_u16(d)
    time.sleep_ms(10)

3.15.4. Драйверы с управлением направлением и скоростью

Второе семейство микросхем H-моста предоставляет более удобный интерфейс: один цифровой вход направления (часто обозначаемый DIR или PH от «phase», фаза) плюс один вход скорости (часто PWM или EN от «enable», разрешение). Вывод направления выбирает, в какую сторону приводит мост; коэффициент заполнения на выводе скорости задаёт средний ток.

Этим проще управлять из программы, чем схемой с двумя входами ШИМ. Два сигнала соответствуют тому, как обычно формулируется задача – «вращай в эту сторону, с такой скоростью» – так что код может сказать set_direction(forward); set_speed(50) вместо ветвления между in1 и in2. Нужен только один канал ШИМ, что освобождает другой канал того же таймера для несвязанной задачи. А вывод направления может оставаться зафиксированным между изменениями без повторного запуска моста, так что изменение скорости при фиксированном направлении затрагивает только один регистр.

import time
from machine import PWM, Pin

dir_pin = Pin("P8", Pin.OUT)
speed = PWM(Pin("P7"), freq=20_000, duty_u16=0)

def drive(direction, speed_u16):
    dir_pin.value(direction)         # 0 or 1
    speed.duty_u16(speed_u16)        # 0..65535

drive(0, 32768)     # direction A at half speed
time.sleep(2)
drive(1, 16384)     # direction B at quarter speed
time.sleep(2)
speed.duty_u16(0)   # stop

Что именно делает «стоп» на драйвере такого типа – выбег или торможение – зависит от чипа. С драйвером с двумя входами выбор делает код камеры (оба входа низкие для выбега, оба высокие для торможения); с драйвером управления направлением и скоростью решает чип, поэтому стоит заглянуть в техническое описание, прежде чем полагаться на то или иное поведение.