
DBH-12V – модуль двухканального H-моста
Часть 2 - использование модуля
Частота и коэффициент заполнения сигнала ШИМ
В технических данных модуля, приведенных его продавцом на интернет-аукционе, имеется загадочная строчка:
Frequency: General Motors: 16kHz; Coreless Motor: 80kHz; TEC: 500Hz-80kHz
Можно, конечно, трактовать ее так, что если двигатель выпущен уважаемой фирмой General Motors, то рекомендуется частота ШИМ равная 16 кГц, если двигатель произведен замечательной английской фирмой TEC Motors, то частоту можно выбрать в широких пределах от 500 Гц до 80 кГц, а в случае, если двигатель имеет ротор без стального сердечника (такие двигатели выпускает, например, фирма Allied Motion), то надо непременно использовать сигнал ШИМ с частотой 80 кГц. При этом остается совершенно непонятным, какую частоту выбрать, если двигатель, которым требуется управлять, не выпущен ни одной из перечисленных фирм, а напротив, сделан безымянными умельцами где-нибудь в Шанхае.
Автор не имеет ни малейшего понятия, откуда взялись такие рекомендации и что бы это вообще могло означать, поэтому полностью их проигнорировал и успешно использовал описываемый модуль с микроконтроллерами Arduino UNO и Arduino Nano, у которых по умолчанию частота сигнала на большинстве выходов, поддерживающих ШИМ, составляет 490 Гц, а на некоторых выходах – 980 Гц. На этих частотах при помощи ШИМ модуль благополучно управлял двумя коллекторными двигателями постоянного тока номинальной мощностью около 60 Ватт каждый без заметного нагрева радиатора. Вероятно, модуль сможет так же успешно работать и на более высоких частотах, вплоть до десятков килогерц, однако автор не проверял это экспериментально.
Другая строчка технических данных модуля, также относящаяся к ШИМ:
Duty Cycle: 0-98%
гораздо более понятна чем строчка про частоты. Дело в том, что микросхема драйвера H-моста IR2104S использует цепь вольтодобавки ("charge pump"), состоящую из диода и конденсатора и предназначенную для того, чтобы надежно открывать верхний транзистор моста даже в том случае, когда напряжение питания двигателя превышает напряжение питания микросхемы драйвера. Цепь эта работает следующим образом: при открытом нижнем транзисторе моста и закрытом верхнем конденсатор заряжается через диод до напряжения питания микросхемы драйвера VCC, а в течение другого полупериода, когда нижний транзистор и диод закрыты, напряжение заряженного конденсатора суммируется с напряжением питания двигателя и подается на затвор верхнего транзистора, обеспечивая его надежное открывание.

Все это хорошо видно на типовой схеме включения микросхемы IR2104S, взятой из ее документации. Два MOSFET транзистора справа представляют собой половинку H-моста, а диод и конденсатор, подключенные к выводу VB микросхемы – схему вольтодобавки.
Понятно, что для успешной работы такой схемы конденсатор должен периодически заряжаться, а для этого Н-мост надо хотя бы на короткое время (2%) в течение каждого периода ШИМ переводить в состояние, когда нижний транзистор открыт, а верхний закрыт. Именно поэтому коэффициент заполнения сигнала не должен превышать 98%. Если же довести его до 100%, то есть попросту подать на соответствующий вход модуля постоянный уровень логической единицы, то конденсатор не будет заряжаться и напряжение на затворе верхнего транзистора моста будет недостаточно для его открывания.
По этой же причине нежелательно использовать режим остановки двигателя, при котором на входы IN1 и IN2 одного канала одновременно поданы уровни логической 1. Следует использовать либо подачу одновременно двух логических нулей, при этом открыты оба нижних транзистора H-моста (а им вольтодобавка не требуется) и выводы двигателя замкнуты между собой и на землю, либо подать 0 на вход EN, что также вызовет остановку двигателя, но уже с разомкнутыми выводами.
Итак, еще раз повторим, какие сигналы надо подавать на входы модуля для того чтобы управлять двигателем по направлению вращения и по скорости, но теперь уже с учетом того, что было сказано выше про ШИМ и про особенности микросхемы драйвера H-моста:
Вход EN | Вход IN1 | Вход IN2 | Двигатель |
0 | Любое значение | Любое значение | Остановлен (выводы разомкнуты) |
1 или не подключен* | 0 | ШИМ до 98% | Вращается вперед |
1 или не подключен* | ШИМ до 98% | 0 | Вращается назад |
1 или не подключен* | 0 | 0 | Заторможен (выводы замкнуты) |
Выход CT
На этом выходе модуля формируется напряжение пропорциональное протекающему через двигатель току. Это напряжение подается на аналоговый вход микроконтроллера в качестве сигнала обратной связи и его значение может использоваться в программе для различных целей, например, для ограничения максимального тока через двигатель, его плавного запуска или для вывода значения измеренного тока на дисплей. Если в контроле протекающего через двигатель тока нет необходимости, этот выход модуля можно никуда не подключать.
При нулевом токе через двигатель на выходе CT имеется некоторое начальное напряжение, которое может составлять от единиц до нескольких десятков милливольт. Это напряжение возникает оттого, что операционный усилитель LM358, используемый в качестве усилителя сигнала датчика тока питается от однополярного источника и, хотя в справочных данных этой микросхемы и записано, что диапазон выходных напряжений при таком питании начинается непосредственно от нуля, на самом деле это не совсем так, всегда имеется некоторое пороговое напряжение, ниже которого выход усилителя опуститься не может.
У разных экземпляров LM358 значение этого начального напряжения может быть разным и даже два усилителя в одной и той же микросхеме могут существенно отличаться по его величине. Поэтому, если стоит задача контролировать ток двигателя достаточно точно, то желательно это начальное смещение скомпенсировать в программе микроконтроллера.
Кроме того, для точного измерения тока через двигатель в каждом канале желательно также проверить справедливость формулы CT Pin Output Voltage(V) = Current(A) * 0.155, которую приводит в своем описании продавец модуля. Не исключено, что из-за разброса параметров элементов модуля для какого-то конкретного экземпляра ток надо будет умножать не на 0.155, а на какой-то другой коэффициент, подобрать который проще всего экспериментально. Для этого нужно подключить последовательно с двигателем образцовый амперметр, а к выходу CT – образцовый вольтметр, измерить ток двигателя и напряжение на выходе CT с максимально возможной точностью, после чего не составит труда вычислить этот коэффициент и в дальнейшем использовать его в программе микроконтроллера. Если же требования к точности измерения тока двигателя не слишком высоки, тогда можно не заниматься индивидуальным подбором начального смещения и коэффициента, определяющего чувствительность датчика тока, а использовать для вычислений в программе формулу, рекомендованную продавцом.
Тестовая программа
Автором написан простейший скетч для микроконтроллеров Arduino Nano, Arduino Uno и аналогичных, позволяющий убедиться в работоспособности модуля DBH-12V и погонять двигатель во всем диапазоне скоростей от нулевой до максимальной в обоих направлениях. Для сборки схемы потребуются: модуль DBH-12V, микроконтроллер, коллекторный двигатель постоянного тока и два источника питания – один с напряжением 5V или 9…12V для микроконтроллера, другой – с напряжением, соответствующим номинальному напряжению двигателя.
Схема тестирования чрезвычайно проста – двигатель подключается к выходу A или B модуля, источник питания двигателя подключается к клеммам PWR+ и PWR- модуля. Для соединения модуля с микроконтроллером используются три провода: пин 10 контроллера соединяется со входом IN1 модуля, пин 11 контроллера соединяется со входом IN2 модуля, а пин GND контроллера соединяется с общим проводом (GND) модуля. Контакты V+, EN и CT модуля остаются неподключенными. Питание на микроконтроллер подается обычным образом, либо по USB кабелю, либо на соответствующий разъем питания, если у него таковой имеется.
Исходный текст скетча приведен под спойлером ниже, а скачать его можно по ссылке в конце этой публикации.
// *********************** // Тест модуля DBH-12V // *********************** const int motorPin1 = 10; // вход IN1 модуля const int motorPin2 = 11; // вход IN2 модуля int counter = 0; void setup() { // Инициализация выходов pinMode(motorPin1,OUTPUT); pinMode(motorPin2,OUTPUT); analogWrite(motorPin1,0); analogWrite(motorPin2,0); } void loop() { // 1. Плавный разгон двигателя от нуля до // макс. скорости в прямом направлении // в течение 2.5 сек if (counter < 50) { analogWrite(motorPin1,0); analogWrite(motorPin2,counter * 5); } // 2. Вращение на макс. скорости в прямом // направлении в течение 2.5 сек else if (counter < 100) { analogWrite(motorPin1,0); analogWrite(motorPin2,250); } // 3. Плавное замедление двигателя от макс. // скорости до нуля в течение 2.5 сек else if (counter < 150) { analogWrite(motorPin1,0); analogWrite(motorPin2,(150 - counter) * 5); } // 4. Двигатель неподвижен в течение 2.5 сек else if (counter < 200) { analogWrite(motorPin1,0); analogWrite(motorPin2,0); } // 5. Плавный разгон двигателя от нуля до // макс. скорости в обратном направлении // в течение 2.5 сек else if (counter < 250) { analogWrite(motorPin1,(counter - 200) * 5); analogWrite(motorPin2,0); } // 6. Вращение на макс. скорости в обратном // направлении в течение 2.5 сек else if (counter < 300) { analogWrite(motorPin1,250); analogWrite(motorPin2,0); } // 7. Плавное замедление двигателя от макс. // скорости до нуля в течение 2.5 сек else if (counter < 350) { analogWrite(motorPin1,(350 - counter) * 5); analogWrite(motorPin2,0); } // 8. Двигатель неподвижен в течение 2.5 сек else if (counter < 400) { analogWrite(motorPin1,0); analogWrite(motorPin2,0); } else counter = -1; counter++; delay(50); }
Скетч работает следующим образом: в каждом цикле loop значение управляющей переменной counter увеличивается на 1, а в зависимости от ее текущего значения на пины 10 и 11 подаются различные сочетания выходных сигналов, вызывающие ускорение, замедление, вращение или остановку двигателя. Например, пока значение управляющей переменной находится в пределах от 0 до 49, на пин 10 подается ноль, а на пин 11 сигнал ШИМ с возрастающим коэффициентом заполнения. Благодаря временной задержке, длительность каждого цикла loop составляет около 50мс, а длительность 50-ти циклов, за время которых коэффициент заполнения на пине 11 вырастет от нуля до 98%, составляет 2.5 секунды. В течение этого времени двигатель будет плавно разгоняться
В следующие 50 циклов (еще 2.5 секунды) значение переменной counter будет меняться от 50 до 99, на пин 10 по-прежнему будет подаваться ноль, а на пин 11 – постоянная величина, соответствующая максимальному коэффициенту заполнения сигнала ШИМ 98%. В течение этого времени двигатель будет вращаться с максимальной скоростью.
В течение последующих интервалов по 2.5 секунды двигатель плавно замедлит вращение, затем постоит в заторможенном состоянии (нули на обоих входах модуля) и пойдет выполнять те же действия, но, вращаясь при этом уже в обратном направлении.
Когда значение управляющей переменной counter достигнет 400 (т.е. через 20 секунд после запуска теста), она будет вновь сброшена в 0 и все начнется сначала.
Файлы для скачивания
Скетч для тестирования модуля DBH-12V
Ссылки на сторонние ресурсы
На момент написания этой публикации все перечисленные ниже ссылки на сторонние ресурсы работают, однако интернет живет своей жизнью и автор не может гарантировать, что через какое-то время отдельные ссылки не перестанут работать или не будут указывать на страницы, содержащие совсем не ту информацию, которая там имеется сегодня. Если вы обнаружите какие-либо проблемы с внешними ссылками - пишите нам, мы постараемся их исправить.
- MOSFET транзистор STD70N03L
- Микросхема драйвера H-моста IR2104S
- Сдвоенный операционный усилитель LM358
Дополнение от 13.11.2023
Почти через пять лет после того, как этот материал был написан, в интернете внезапно отыскалась полная принципиальная схема модуля DBH-12V. В принципе, она не добавляет ничего нового к тому, что изложено выше, однако мы решили ее тут опубликовать для тех наших читателей, которые любят в каждом вопросе разобраться досканально или, как сказал поэт, "дойти до самой сути". Как минимум, она будет полезна тем, кому придется ремонтировать сгоревший модуль или в случае, если обладателю такого модуля захочется его улучшить, внеся в схему какие-либо изменения.
