3.15. Управление двигателем постоянного тока¶
Щёточный двигатель постоянного тока представляет собой катушку из провода на валу внутри магнитного поля. Пропустите ток через катушку, и поле начнёт действовать на неё с силой; эта сила превращается в крутящий момент на валу. Щётки внутри двигателя переключают направление тока в катушке по мере вращения вала, так что крутящий момент всегда толкает вал в одном и том же направлении. Подайте постоянное напряжение на два вывода двигателя, и вал завращается; поменяйте полярность, и он завращается в другую сторону.
Двигателям обычно требуются от сотен миллиампер до нескольких ампер при напряжениях питания выше логического уровня 3,3 В камеры. Вывод GPIO может отдавать ток порядка 25 мА и не может менять полярность – он способен подключать лишь к двум своим шинам. Выходной каскад между камерой и двигателем должен пропускать ток двигателя, подводить отдельное питание двигателя с более высоким напряжением и позволять камере менять полярность по команде. Четырёхтранзисторный H-мост – это стандартное решение.
3.15.1. H-мост¶
H-мост – это четыре ключа, расположенные в виде буквы H вокруг двигателя:
H-мост: четыре ключа (S1 – S4) соединяют двигатель 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
Что именно делает «стоп» на драйвере такого типа – выбег или торможение – зависит от чипа. С драйвером с двумя входами выбор делает код камеры (оба входа низкие для выбега, оба высокие для торможения); с драйвером управления направлением и скоростью решает чип, поэтому стоит заглянуть в техническое описание, прежде чем полагаться на то или иное поведение.