Как работает h-мост для двигателей постоянного тока

Содержание

Содержание

Необходимое оборудование Настройка первой точки Подключение второй точки

Сначала, как всегда, разберемся со схемой будущего подключения

Перед нами стоит задача создать мост WiFi, то есть объединить две независимые локальные сети (проводные или беспроводные — не важно) или присоединить к нашей домашней сетке удаленно находящийся один компьютер при помощи сигнала Wi-Fi

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

Главное условие стабильной работы беспроводного моста — прямая видимость между двумя объектами.

А именно — внешняя wifi точка доступа, предназначенная для установки на улице. Опять же, если расстояниее не более нескольких десятков-сотен метров, то можно обойтись просто обычными двумя роутерами, в которых есть поддержка режима моста и к которым подключены внешние антенны.

Но для более серьезных расстояний и более стабильной работы рекомендуется использовать специальные точки доступа wifi, предназначенные именно для построения подобных беспроводных мостов. Они уже оснащены мощной направленной антенной и заточены под работу в связке между друг другом. Лидером на рынке по производству подобного оборудования является фирма Ubiquiti. Моделей различного ценового диапазона и характеристик производительности множество.

Мостовые драйверы

Далее предстояла работа над напряжением 20 вольт на управление затворами. Для этого существуют мостовые драйверы транзисторов, они обеспечивают стабильные импульсы в 20 вольт на затвор и высокую скорость отклика. Сначала у меня были популярные драйверы для маломощных моторов L293D.

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

В это же время я наткнулся на два варианта мостовых драйверов:

  • HIP4086
  • IR2101

Что касается HIP4086, то это полноценный мостовой драйвер, предназначенный для трёхфазного электродвигателя. Мне он показался несколько замороченным, и мои попытки использовать его в контроллере не увенчались успехом: он у меня так и не заработал. Углублённо разбираться в причинах не стал.

А взял я IR2101 — полумостовой драйвер, обеспечивающий работу нижнего и верхнего ключей для одной фазы. Несложно догадаться, что таких драйверов нужно три. К слову, драйвер очень прост в использовании, его подключение происходит безболезненно и легко. Получилась такая схема:

Печатная плата

И готовый результат

Собрал контроллер с этим драйвером и запустил двигатель. Ситуация с работой электродвигателя кардинально не поменялась, симптомы остались те же, как и в случае с драйвером L293D.

Индуктивные нагрузки

При выборе индуктивной нагрузки, представленной двигателем, решение проблемы режима плавного управления мощностными показателями мотора не всегда дается легко, что зависит от нескольких факторов, представленных:

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

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

Оптимальным вариантом для решения практически всех перечисленных выше проблем является использование частотных инверторов.

Индуктивный тип схемы для управления двигателем ПТ не отличается особой сложностью по сравнению с частотным управлением, а также способен обеспечивать вполне приемлемую результативность.

Где используют измерительный мост Уитстона?

Измерительные элементы применяют в работе с кабельными линиями из металла. Они позволяют нейтрализовать постороннее влияние для более эффективной локализации дефектов. Гарантированы высокоточные результаты в рамках диапазона измеряемых величин.

С помощью мостовой схемы Уитстона можно вычислить сопротивление изменяющегося элемента. Схемы используют в конструкциях электронных весов, электронных термометров и терморезисторов.

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

  • ММВ – измеряет сопротивление проводника постоянного напряжения;
  • Р333 – схема одинарного моста, с помощью которой выявляется поврежденный участок кабеля.

Настройка на маршрутизаторе Ubiquiti NanoStation M5

Особенность этого девайса — возможность передачи радиосигнала на расстояние до 7 км со скоростью 100 мбит/с. Порядок действий настройки будет таким:

  1. Подключите оборудование к модему.
  2. Затем в браузере напишите «192.168.1.20».
  3. Введите реквизиты для входа в панель инструментов.
  4. Откройте вкладку «Wireless».
  5. В строке «Wireless Mode» поставьте «Access Point». Напротив «SSID» впишите название сети. В поле «Channel Width» выставьте любое значение до 20 MHz. Остальные параметры можно не трогать.
  6. Зайдите во вкладку «Network».
  7. Напротив «Network Mode» выберите «Bridge». Сохраните параметры.
  8. Теперь настройте 2-й девайс, который будет приемником сигнала. Перейдите во вкладку «Wireless».
  9. Выставьте следующие параметры: «Wireless Mode»  — «Station», «SSID» — название сети, «Channel Width» — то же значение, что на первом роутере.
  10. Во вкладке «Network» напротив «Network Mode» поставьте «Bridge». В поле «IP Address» смените последнюю цифру на 1. Сохраните изменения.
  11. Перезагрузите устройство — все готово.

Логика управления H-мостом

Логический элемент «И» состоит из интегрированных электронных компонентов и, не зная, что у него внутри, мы можем рассматривать его как своего рода «черный ящик», который имеет два входа и один выход. Таблица истинности показывает нам 4 возможные комбинации сигналов на входах и соответствующий им сигнал на выходе.

Мы видим, что только тогда, когда на обоих входах положительный сигнал (логическая единица), на выходе появляется логическая единица. Во всех остальных случаях на выходе будет логический ноль (0В).

В дополнение к данному логическому «И» элементу для нашего H-моста понадобиться другой тип логического элемента «И», у которого мы можем видеть небольшой круг на одном из его входов. Это все тот же логический элемент «И», но с одним инвертирующим (перевернутым) входом. В этом случае таблица истинности будет немного иная.

Если мы объединим эти два типа «И» элемента, с двумя электронными переключателями, как показано на следующем рисунке, то состояние выхода «Х» может быть в трех вариантах: разомкнутое, положительное или отрицательное. Это будет зависеть от логического состояния двух входов. Этот тип выхода известен как «выход с тремя состояниями» (Three-State Output) который широко используется в цифровой электронике.

Теперь посмотрим, как будет работать наш пример. Когда вход «ENA» (разрешение) равен 0В, независимо от состояния входа «А», выход «Х» будет разомкнут, поскольку выходы обоих «И» элементов будут равны 0В, и, следовательно, два переключателя также будут разомкнуты.

Когда мы подаем напряжение на вход ENA, один из двух переключателей будет замкнут в зависимости от сигнала на входе «A»: высокий уровень на входе «A» подключит выход «X» к плюсу, низкий уровень на входе «A» подключит выход «X» к минусу питания.

Таки образом, мы построили одну из двух ветвей «H» моста. Теперь перейдем к рассмотрению работы полного моста.

Прототип на базе микросхемы MC33035

Параллельно с разработкой контроллера на Ардуино я рассматривал альтернативные варианты логической части контроллера. И это привело меня к микросхеме MC33035. Это старая разработка от Motorola, сейчас её выпускает ON Semiconductor. Создана специально для мощных трёхфазных двигателей.

Данная микросхема:

  • Отвечает за всю логическую часть контроллера
  • Считывает показания с датчиков Холла
  • Определяет положения вала
  • Выдаёт сигналы для затворов Н-моста на их драйверы
  • Имеет возможность подключения индикатора ошибок, перегрева
  • Обрабатывает и передает ШИМ-сигнал (PWM)
  • Осуществляет реверс (обратный ход колеса)

Одним словом, микросхема содержит всё необходимое для управления электродвигателем. Её стоимость очень низкая: на Алиэкспрессе — около 50 рублей. Для сборки полноценного контроллера на её основе потребуется микросхема MC33035, полумостовые драйверы и Н-мост из полевых транзисторов. Я также собрал контроллер на этой микросхеме. Работает отлично, стабильно, колесо крутится как надо на различных оборотах. Но функционал микросхемы ограничен, если необходимо наворотить различные функции, вывод на дисплей скорости, одометр, расход батареи, то опять же возникает необходимость дополнительно подключить Ардуино или что-то аналогичное.

Схема с MC33035

Печатная плата

Готовый вариант

Description

The H-Bridge block represents an H-bridge motor driver.
The block has the following two Simulation mode options:

  • — The
    H-Bridge block output is a controlled voltage
    that depends on the input signal at the PWM port. If the
    input signal has a value greater than the Enable threshold
    voltage parameter value, the
    H-Bridge block output is on and has a value
    equal to the value of the Output voltage amplitude
    parameter. If it has a value less than the Enable threshold
    voltage parameter value, the block maintains the load circuit
    using one of the following three Freewheeling mode
    options:

    The first and third options are sometimes referred to as synchronous
    operation.

    The signal at the REV port determines the polarity of the
    output. If the value of the signal at the REV port is less
    than the value of the Reverse threshold voltage parameter,
    the output has positive polarity; otherwise, it has negative polarity.

  • — This mode has two Load
    current characteristics options:

    The option assumes that the current is
    practically continuous due to load inductance. In this case, the
    H-Bridge block output is:

    VOVPWMAPWM−IOUTRON

    where:

    • VO is the value of the
      Output voltage amplitude parameter.

    • VPWM is the value of the
      voltage at the PWM port.

    • APWM is the value of the
      PWM signal amplitude parameter.

    • IOUT is the value of the
      output current.

    • RON is the Bridge
      on resistance parameter.

    The current will be smooth if the PWM frequency is large enough. Synchronous
    operation where freewheeling is via a bridge arm back to the supply also helps
    smooth the current. For cases where the current is not smooth, or possibly
    discontinuous (that is, it goes to zero between PWM cycles), use the
    option. For this
    option, you must also provide values for the Total load series
    resistance, Total load series inductance,
    and PWM frequency. During simulation, the block uses these
    values to calculate a more accurate value for H-bridge output voltage that
    achieves the same average current as would be present if simulating in PWM
    mode.

Set the Simulation mode parameter to
to speed up simulations when driving the
H-Bridge block with a Controlled PWM
Voltage block. You must also set the Simulation
mode parameter of the Controlled PWM
Voltage block to mode. This
applies the average of the demanded PWM voltage to the motor. The accuracy of the
mode simulation results relies on the validity
of your assumption about the load current. If you specify that the current is
, then the accuracy also
depends on the values you provide for load resistance and inductance being
representative. This mode also makes some simplifying assumptions about the underlying
equations for the case when current is discontinuous. For typical motor and bridge
parameters, accuracy should be within a few percent. To verify
mode accuracy, run the simulation using the
mode and compare the results to those obtained from
using the mode.

Braking mode is invoked when the voltage presented at the BRK
port is larger than the Braking threshold voltage. Regardless of
whether in or mode,
when in braking mode the H-bridge is modeled by a series combination of two resistances
R1 and R2 where:

  • R1 is the resistance of a single bridge arm, that is, half
    the value of the Total bridge on resistance
    parameter.

  • R2 is the resistance of a single bridge arm in parallel
    with a diode resistance, that is, R1 · Rd / (
    R1 + Rd ), where Rd is the diode resistance.

External Power Supply

To model the demands placed on the DC supply, you can choose to expose the power
supply ports of the H-Bridge block by setting the
Power supply parameter to
. If the power supply ports are exposed, then
only PWM simulation mode is supported.

Note

If the Power supply parameter is set to
, the block is able to figure out the
load-side voltage offset by referencing to the supply rail voltages. However, if
the supply rail connections are not exposed, you must add an
Electrical Reference block on the load
side.

Схема управления двигателем постоянного тока

Самым простым способом регулировки скорости двигательного вращения является применение модуляции (РWМ) широтно-импульсного типа, или ШИМ. Данный способ базируется на подаче питающего напряжения на движок в форме импульсов со стабильной частотой следования, но изменением длительности.

Вся ШИМ-сигнальная система имеет очень важный критерий, представленный коэффициентом стандартного заполнения (Duty сyсlе).

Такая величина соответствуют соотношению импульсной длительности к его периоду:

D = (t/Т) × 100 %

Для самой простой схемы реализации управления ДПТ характерно наличие полевой транзисторной части с подачей на затвор ШИМ-сигнальной системы. В подобной схеме транзистор представляет особый электронный ключ, которым один из двигательных выводов коммутируется на землю. В этом случае открытие полупроводникового триода осуществляется именно на момент импульсной длительности.

Конструкция двигателя постоянного тока

При низкой частоте и в условиях незначительного коэффициента ШИМ-сигнала преобразующее устройство срабатывает рывками. Высокая частота РWМ, составляющая несколько сотен Герц, способствует непрерывному вращению мотора, а скорость вращательного движения в этом случае изменяется строго пропорционально коэффициенту заполняемости.

Известно множество схематичных решений, генерирующих ШИМ-сигнал, но к числу наиболее простых относится «схема таймера 555», нуждающаяся в минимальном количестве компонентов и не требующая особой настройки.

Понятие ШИМ частоты

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

Устанавливается необходимая частота открытия и закрытия ключей. Напряжение меняется с нулевого на рабочее. Чтобы управлять оборотами, необходимо наложить сигнал ШИМ на сигналы ключей.

Схема регулятора оборотов двигателя постоянного тока на напряжение 12 вольт

Сигнал ШИМ может быть сформирован аппаратом на несколько выводов. Или создать ШИМ для отдельного ключа программой. Схема становится проще. ШИМ сигнал имеет 4— 80 килогерц.

Увеличение частоты приводит к большему количеству процессов перехода, что даёт выделение тепла. Высота частоты ШИМ повышает количество переходных процессов, от этого происходят потери на ключах. Маленькая частота не даёт нужную плавность управления.

Чтобы уменьшить потери на ключах при переходных процессах, ШИМ сигналы подаются на верхние или на нижние ключи по отдельности. Прямые потери рассчитываются по формуле P=R*I2, где P — мощность потерь, R — сопротивление ключа, I — сила тока.

Меньшее сопротивление минимизируют потери, увеличивает КПД.

Разновидности

  1. Небольшие сопротивления измеряются посредством прибора Кери Фотера. Можно узнать разницу между противодействиями больших значений.
  2. Еще один тип – делитель Кельвина-Варлея. Применяется в приборах лабораторного оборудования. Максимальная измеряющая способность, зафиксированная этим делителем напряжения, достигает 1,0*10-7.
  3. Мост Кельвина, который в некоторых странах называют именем Томсона, предназначен для замера неизвестных сопротивлений небольших величин (меньше 1 Ом). По принципу работы похож на одинарный мост Уинстона. Разница лишь в наличии дополнительного сопротивления, снижающего погрешности в измерении, которые появляются в результате падения напряжения в одном из плеч.
  4. Еще один тип – мост Максвелла. Измеряет низкодобротную индуктивность неизвестной величины.

Protection diodes and PWM mode

A side-effect of how a motor works is that the motor will also generate electrical energy. When you disable the transistors to stop running the motor, this energy needs to be released on some way.

If you add diodes in the reverse direction for the transistors, you give a path for the current to take to release this energy. Without them, you risk that the voltage rises and damages your transistors.

You can read more about this – and what to keep in mind if you want to use a PWM signal to control the speed of the motor, this article.

The resistors going into each base is there to reduce the current to each transistor. Not sure how to calculate it? If you’re using a microcontroller to control them, start with 1k and adjust if that doesn’t work.

Резонансный полумост

Довольно перспективный вид полумостового преобразователя, его схема показана ниже:

Резонансный полумост будет немного проще, чем полумост с ШИМ. Это обусловлено наличием индуктивности резонансной, которая ограничивает максимальный ток транзисторов, а коммутация транзисторов происходит в нуле тока или напряжения. Ток, протекающий по силовой цепи, будет иметь форму синусоиды, что снимет нагрузку с конденсаторных фильтров. При таком построении схемы необязательно необходимы драйверы, переключение может осуществляться обычным импульсным трансформатором. Качество управляющих импульсов в данной схеме не столь существенно как в предыдущей, но безтоковая пауза все равно должна быть.

В данном случае можно обойтись без токовой защиты, а форма вольт-амперной характеристики ВАХ будет иметь падающий вид, что не требует ее параметрического формирования.

Выходной ток будет ограничиваться только индуктивностью намагничивания трансформатора и соответственно сможет достигать довольно таки значительных величин, в случае, когда возникнет короткое замыкание КЗ. Данное свойство положительно влияет на поджиг и горение дуги, но и его также необходимо учитывать при подборе выходных диодов.

Как правило, выходные параметры регулируются изменением частоты. Но и регулирование фазное тоже дает немного своих плюсов и является более перспективным для сварочных инверторов. Он позволяет обойти такое неприятное явление как совпадение режима короткого замыкания с резонансом, а также увеличивает диапазон регулирования выходных параметров. Применение фазовой регулировки может позволить изменять выходной ток в диапазоне от 0 до Imax.

Полный мост с ШИМ

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

Данная  схема позволяет получать мощность в 2 раза больше, чем при включении типа полумост и в 2 раза больше чем при включении типа «косой» мост, при этом величины токов и соответственно потери во всех трех случаях будут равны. Это можно объяснить тем, напряжение питания будет равным напряжению «раскачки» первичной обмотки трансформатора силового.

Для того, чтоб получить одинаковые мощности с полумостом (напряжение раскачки 0,5Uпит.) необходим ток в 2 раза! меньше чем для случая полумоста. В схеме полного моста с ШИМ транзисторы будут работать поочередно – Т1, Т3 включены, а Т2, Т4 выключены и соответственно наоборот при изменении полярности. Через трансформатор тока отслеживают  и контролируют значения амплитудное тока протекающего через эту диагональ. Для его регулирования есть два наиболее часто применяемые способы:

  • Оставить неизменным напряжение отсечки, а изменять только длину импульса управления;
  • Проводить изменения уровня отсекающего напряжения по данным с трансформатора тока при этом оставляя неизменным длительность импульса управления;

Оба способа могут позволить проводить изменения выходного тока в довольно больших пределах.  У полного моста с ШИМ недостатки и требования такие же, как и у полумоста с ШИМ. (Смотри выше).

H-мост на транзисторах

Для создания электронного H-моста на транзисторах можно использовать транзисторы как NPN, так и PNP типа. Могут быть использованы также и полевые транзисторы. Мы рассмотрим версию с NPN-транзисторами, потому что это решение использовано в микросхеме L298, которую мы увидим позже.

Транзистор — это электронный компонент, описание работы которого может быть сложным, но применительно к нашему H-мосту его работу легко проанализировать, поскольку он работает только в двух состояниях (отсечка и насыщение).

Транзистор мы можем представить просто как электронный переключатель, который закрыт, когда на базе (b) 0 В и открыт, когда на базе положительное напряжение.

Хорошо, мы заменили механические переключатели транзисторными ключами. Теперь нам необходим блок управления, который будет управлять нашими четырьмя транзисторами. Для этого мы будем использовать логические элементы типа «И».

Операция


Два основных состояния H-моста

Н-образная перемычка обычно используется для изменения полярности / направления двигателя, но также может использоваться для «торможения» двигателя, когда двигатель внезапно останавливается из-за короткого замыкания клемм двигателя, или для того, чтобы позволить двигателю двигатель от холостого хода до остановки, так как двигатель фактически отключен от цепи. В следующей таблице приводится сводка операций, при этом S1-S4 соответствуют диаграмме выше.

S1 S2 S3 S4 Результат
1 1 Мотор движется вправо
1 1 Мотор движется влево
Моторные берега
1
1
1
1
1 1 Моторные тормоза
1 1
Икс Икс 1 1 Короткое замыкание
1 1 Икс Икс

Description

The Dual Channel H-Bridge Motor Shield is composed of 2 discrete MOSFET H-bridge, designed to drive two DC motor with max current 8A. It is made up of 8 N-channel MOSFET IRF3205S and 4 pcs of half bridge motor controller IR2104, to build 2 H-bridge. With this shield and the Arduino board, users can control and drive motors with a max current 8A@ 22V. The universal 7.4~11.1V lipo battery that are popular used in the remote car and model airplane can be applied as well.

The H-Bridge Motor Shield can be controlled by simply applying logic 0 or 1 to the direction pins for that motor and a PWM signal to the speed pin. In this way, speed and direction of two separate motors can be controlled independently. Note that the PWM signal on the P_1 and P_2 can be 0~99%, but 100% high signal (logic 1) not works because of the motor controller IR2104 boost circuit.

Элементы платы

Драйвер двигателей TB6612FNG

Сердце и мускулы платы — микросхема двухканального H-моста TB6612FNG, которая позволяет управлять двумя коллекторными моторами или одним биполярным шаговым двигателем с помощью внешнего микроконтроллера.

Термин «H-мост» появился благодаря графическому изображению схемы, напоминающему букву «H». Рассмотрим подробнее принцип работы H-моста.


В зависимости от текущего состояние переключателей возможно разное состояние мотора.

S1 S2 S3 S4 Результат
1 1 Мотор крутится вправо
1 1 Мотор крутится влево
Свободное вращение мотора
1 1 Мотор тормозит
1 1 Мотор тормозит
1 1 Короткое замыкание источника питания
1 1 Короткое замыкание источника питания

Ключи меняем на MOSFET-транзисторы, а для плавной регулировки скорости вращения вала мотора используем ШИМ-сигнал.

Питание

На плате драйвера моторов присутствует два контура питания: силовое и логическое.

  • Силовой контур (VM) — напряжение для питания моторов от силовой части микросхемы и светодиодов индикации. Силовое питание подключается через клеммник c входным диапазоном напряжения от 5 до 12 вольт.
  • Логический контур (Vcc) — питание вспомогательной цифровой логики управления микросхемы . Логическое питание поступает на плату модуля через контакт . Диапазон входного напряжения от 3,3 до 5 вольт.

Если отсутствует хотя бы один из контуров питания — драйвер H-мост работать не будет.

При подключении питания соблюдайте полярность. Неправильное подключение может привести к непредсказуемому поведению или выходу из строя платы или источника питания.

Нагрузка

Нагрузка разделена на два независимых канала. Первый канал на плате обозначен шёлком , а второй канал — . К каждому каналу можно подключить по одному коллекторному мотору или объединить каналы для подключения биполярного шагового двигателя.

Обозначения «+» и «−» показывают воображаемые начало и конец обмотки. Если подключить два коллекторных двигателя, чтобы их одноимённые контакты щёточного узла соответствовали одному и тому же обозначению на плате, то при подаче на H-Bridge одинаковых управляющих импульсов, моторы будут вращаться в одну и ту же сторону.

Светодиодная индикация

Имя светодиода Назначение
DIR1/EN1 Индикация состояния направления и скорости первого канала . При высоком логическом уровне светится зелёным светом, при низком — красным. Яркость светодиода пропорциональна скорости вращения двигателя.
DIR2/EN2 Индикация состояния направления и скорости первого канала . При высоком логическом уровне светится зелёным светом, при низком — красным. Яркость светодиода пропорциональна скорости вращения двигателя.

Примеры работы для Arduino и XOD

В качестве мозга для управления моторами рассмотрим платформу из серии Arduino, например Arduino Uno.

  • Как начать работу с Arduino?

  • Как начать работу с XOD?

Подключение к Arduino

Выберите один из вариантов коммуникации драйвера с внешним микроконтроллером:

  • Подключите H-мост к платформе Arduino. Для коммуникации понадобятся соединительные провода «мама-папа».
  • Для быстрой сборки и отладки устройства возьмите плату расширения Troyka Shield, которая одевается сверху на Arduino Uno методом бутерброда. Для коммуникации используйте трёхпроводные шлейфы «мама-мама», который идут в комплекте с модулем.

Управление коллекторными моторами

Код для Arduino

Для начала покрутим каждый мотор в одну, а затем другую сторону.
Прошейте платформу Arduino скетчем, приведённым ниже.

troyka-h-bridge-dual-example-arduino-dc-motors.ino
// Пины управления скоростью и направлением мотора
constexpr auto pinM1Speed = 9;
constexpr auto pinM1Direction = A1;
constexpr auto pinM2Speed = 10;
constexpr auto pinM2Direction = A0;
 
int pins = {pinM1Speed, pinM1Direction, pinM2Speed, pinM2Direction};
 
void setup() {
  // Настраиваем все пины управление моторами в режим выхода
  for (int i = ; i < 4; i++) {     
    pinMode(pinsi, OUTPUT);
  }
} 
 
void loop() {
  // Крутим мотор M1 в одну сторону в течении 1 секунды
  motorsDrive(255, );
  delay(1000);
 
  // Крутим мотор M1 в другую сторону в течении 1 секунды
  motorsDrive(-255, );
  delay(1000);
 
  // Крутим мотор M2 в одну сторону в течении 1 секунды
  motorsDrive(, 255);
  delay(1000);
 
  // Крутим мотор M2 в другую сторону в течении 1 секунды
  motorsDrive(, -255);
  delay(1000);
 
  // Стоим на месте
  motorsDrive(, );
  delay(1000);
 
}
 
// Функция управления моторами
void motorsDrive(int M1Speed, int M2Speed) {
  if (M1Speed > ) {
    digitalWrite(pinM1Direction, HIGH);
  } else {
    digitalWrite(pinM1Direction, LOW);
  }
 
  if (M2Speed > ) {
    digitalWrite(pinM2Direction, HIGH);
  } else {
    digitalWrite(pinM2Direction, LOW);
  }
  analogWrite(pinM1Speed, abs(M1Speed));
  analogWrite(pinM2Speed, abs(M2Speed));
}

Усовершенствуем эксперимент: заставим каждый мотор по очереди плавно разгоняться и останавливаться в разных направлениях.

troyka-h-bridge-dual-example-arduino-dc-motors-pwm.ino
// Пины управления скоростью и направлением мотора
constexpr auto pinM1Speed = 9;
constexpr auto pinM1Direction = A1;
constexpr auto pinM2Speed = 10;
constexpr auto pinM2Direction = A0;
 
int pins = {pinM1Speed, pinM1Direction, pinM2Speed, pinM2Direction};
 
void setup() {
  // Настраиваем все пины управление моторами в режим выхода
  for (int i = ; i < 4; i++) {     
    pinMode(pinsi, OUTPUT);
  }
} 
 
void loop() {
  // Медленно разгоняем M1 в одну сторону
  for (int i = ; i <= 255; i++) {
    motorsDrive(i, );
    delay(10);
  }
  // Медленно тормозим мотор
  for (int i = 255; i >= ; i--) {
    motorsDrive(i, );
    delay(10);
  }
  // Медленно разгоняем M1 в другую сторону
  for (int i = ; i <= 255; i++) {
    motorsDrive(-i, );
    delay(10);
  }
  // Медленно тормозим мотор
  for (int i = 255; i >= ; i--) {
    motorsDrive(-i, );
    delay(10);
  }
 
  // медленно разгоняем M2 в одну сторону
  for (int i = ; i <= 255; i++) {
    motorsDrive(, i);
    delay(10);
  }
  // медленно тормозим мотор
  for (int i = 255; i >= ; i--) {
    motorsDrive(, i);
    delay(10);
  }
  // медленно разгоняем M2 в другую сторону
  for (int i = ; i <= 255; i++) {
    motorsDrive(, -i);
    delay(10);
  }
  // медленно тормозим мотор
  for (int i = 255; i >= ; i--) {
    motorsDrive(, -i);
    delay(10);
  }
 
}
 
// Функция управления моторами
void motorsDrive(int M1Speed, int M2Speed) {
  if (M1Speed > ) {
    digitalWrite(pinM1Direction, HIGH);
  } else {
    digitalWrite(pinM1Direction, LOW);
  }
 
  if (M2Speed > ) {
    digitalWrite(pinM2Direction, HIGH);
  } else {
    digitalWrite(pinM2Direction, LOW);
  }
  analogWrite(pinM1Speed, abs(M1Speed));
  analogWrite(pinM2Speed, abs(M2Speed));
}

Код для Arduino

troyka-h-bridge-dual-example-arduino-stepper.ino
// Библиотека для работы с шаговым двигателем
#include <AmperkaStepper.h>
 
// Создаём объект для работы с шаговым двигателем
// и передаём фиксированное количество шагов за полный оборот.
// Подробности в характеристиках двигателя
AmperkaStepper motor(200, A0, A1, 9, 10);
 
void setup() {
  // Устанавливаем скорость вращения 30 оборотов в минуту.
  motor.setSpeed(30);
}
 
void loop() {
  // 180° по часовой стрелке в двухфазном режиме
  motor.step(100, FULL_STEP);
  delay(1000);
 
  // 180° против часовой стрелки в однофазном режиме
  motor.step(-100, WAVE_DRIVE);
  delay(1000);
 
  // 180° по часовой стрелке в полушаговом режиме
  motor.step(200, HALF_STEP);
  delay(1000);
 
  // 180° против часовой стрелки в двухфазном режиме
  // этот режим используется по умолчанию, если не передан
  // второй аргумент
  motor.step(-100);
  delay(1000);
}