Управление биполярным шаговым двигателем без использования драйвера

Как-то раз мне захотелось поэксперементировать с шаговыми двигателями. С униполярным двигателем всё очень просто, достаточно полумоста на очень бюджетной микросхеме ULN2003 или ULN2803. А вот с биполярным двигателем всё гораздо сложнее. Он имеет минимум две обмотки, на каждом конце которых полярность питания должна меняться на противоположную. Кто-то скажет «зачем изобретать велосипед? Купи драйвер на L239 и радуйся жизни», может быть это и правильно, но мы же не ищем лёгких путей, да и что-нибудь спаять руки чешутся (а драйверы были куплены, просто они ещё ехали из Китая). Немного покопавшись в интернете, я заинтересовался такой штукой, как H-мост.

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

Так как у биполярного двигателя две обмотки, то нам понадобится два H-моста. Тогда для управления двумя мостами у нас получается восемь управляющих проводов (на затворы каждого транзистора). Это очень неудобно, потому что, во первых, нужно много проводов цеплять к управляющему микроконтроллеру, а во вторых, если подать управляющий сигнал одновременно на верхний и на нижний транзисторы одного плеча моста, то мы получим короткое замыкание и просто сожжём два транзистора. Поэтому я решил сделать одну хитрость: затворы нижних транзисторов каждого плеча (они у нас коммутируют минус к обмотке мотора) необходимо подключить через инвертор (в данном случае логический элемент «не»), а затворы верхних транзисторов — на вход того же инвертора. Таким образом мы получаем уже четыре управляющих сигнала (A, B, C ,D).

В итоге, если мы подаём на любую линию управления логическую единицу (ТТЛ), то у нас откроется верхний транзистор плеча, а на затвор нижнего пойдёт логический нуль и он будет закрыт. А если подать на ту же линию логический нуль , то верхний транзистор будет закрыт, а на затвор нижнего будет подана логическая единица (с выхода инвертора), и конец обмотки будет подключён к минусу. С теорией покончено.

Теперь подключаем нашу схему к arduino (или просто микроконтроллеру): линии A,B,C,D — к любому свободному пину, так же же подключаем минус и плюс 5 вольт от платы контроллера. Сами мосты запитываем от отдельного блока питания (у меня был не стабилизированный на 15 вольт). 

Осталось написать программу управления

Будем управлять двигателем в полушаговом режиме (8 шажков). В моей программе написаны три функции: forward — будет крутить двигатель в одну сторону, backward — в обратную, stope — остановка. Функции запускаются с помощью терминала путём отправки символов (f,b и s соответственно). Переменная dl служит для управления скоростью вращения двигателя. Так как программа выполняется по кругу, то двигатель вращается постоянно. По аналогии можно добавить подпрограммы для одного шага или нужного количества шагов.

Внешний вид готового устройства:

Как видно из фотографии, мосты собраны из разных транзисторов (в верхних плечах пары ceb703al и 76129s выпаянные из старых материнок, в нижних плечах irf640  и irf610), так как восемь одинаковых у меня просто не было. Тем не менее схема вполне работоспособна. Так же на фото заметна пара «соплей» — перемычек — как всегда ошибки при рисовании платы.

И в конце статьи — демонстрационное видео работы устройства.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
IC1 Микросхема к1533лн1 1 74als04
R1-R8 Резистор 100Ом-1кОм 1 любой мощности
T1-T8 Транзистор IRF740 1 IRF610, IRF630, IRF640, IRF730,