"Надо написать прошивку - спиннер"

Пролог
В этом тексте я произвел обзор микросхемы DRV8870.
DRV8870 - это старая простая микросхема управления коллекторным DC-мотором с токами в обмотках до 3.5 Ампер от компании Texas Instruments. По сути это драйвер H-моста. Причем H-мост встроен прямо внутрь корпуса микросхемы. Это полностью интегрированное решение.
H-мост это электротехническая цепь, которая позволяет пускать ток, как в прямом направлении, так и в обратном направлении. Это приводит к тому, что вал DC мотора либо вращается по часовой стрелке либо против часовой стрелки.
Целевое оборудование это принтеры, игрушки, индустриальное оборудование, столы с подъёмной столешницей, стекло-опускатели в автомобилях, управления насосами и т. п. В общем, этим чипом можно управлять любой индуктивной нагрузкой мощностью до 150W.
Постановка задачи
Научиться регулировать ток в обмотке DC мотора микросхемой DVR8870. Изменять ток от I_min до I_max непрерывно благодаря PWM сигналу на управляющих пинах. Использовать частоту PWM за пределами 20kHz, чтобы не было слышно акустического шума. Написать демонстрационную прошивку-спинер мотора по командам из UART-CLI.
Аппаратная часть
Что надо из оборудования?
Оборудование | Пояснение |
Коллекторный мотор | для вращения вала |
отладочная плата с DRV8870 | для управления DC мотором |
отладочная плата с микроконтроллером | для управления драйвером |
лабораторный блок питания | для питания драйвера |
Две Li-ion MH12210 батареи 18650. Модель NCR18650B. | для питания драйвера |
батарейный отсек для двух элементов питания типоразмера 18650 | для питания драйвера |
программатор | для загрузки ПО в МК |
кабели, перемычи | для программатора, и прототипа |
осциллограф | для отладки PWM |
отвертки | для крепления провода к плате драйвера |
переходник USB-UART | для отладки прошивки через CLI |
Прежде всего надо найти источник питания. Можно выбрать две батареи 18650 и батарейный отсек для них. DC мотор подойдет от игрушек.

Обычно микросхемы такого класса сами аппаратно наблюдают за тем, чтобы не произошло короткого замыкания в H-мосте. Плюс еще заложена встроенная защита от сверхтока, пропадания питания и перегрева микросхемы.

Крутящий момент и, как следствие, угловая скорость вала DC-мотора может регулироваться PWM (или PDM) сигналом на пинах IN1 и IN2.

У микросхемы DRV8870 наружу выходит всего 8 пинов
№ | PIN | dir | TYPE | pull | DESCRIPTION |
1 | GND | in | PWR | -- | Заземление |
2 | IN2 | in | PWM | down | управляющий пин |
3 | IN1 | in | PWM | down | управляющий пин |
4 | VREF | in | analog | -- | опорное напряжение для компаратора |
5 | VM | in | PWR | -- | Питание H-моста |
6 | OUT1 | io | analog | -- | Пин для подключения к мотору |
7 | ISEN | out | analog | -- | Высотокотовый пин. Если используется регулировка по току то надо подключить к резистору малого сопротивления и высокой мощности. Через этот пин протекает тот же ток что и в обмотках двигателя. |
8 | OUT2 | io | analog | -- | Пин для подключения к мотору |
9 | PAD | -- | PWR | -- | Пад теплоотвода. Подключается к земле. |
Внутри чипа четыре мощных высоко токовых N-канальных полевых транзистора, цифровая цепь управления затворами полевых транзисторов, датчик тока в обмотке, датчик температуры, компараторы. Это очень простой чип.

Существует оригинальная отладочная плата DRV8870EVM, EVALUATION MODULE DRV8870

Однако PCB от TI слишком дорогая. Поэкспериментировать с микросхемой DRV8870 можно и на отладочной плате DRV8870 High-power Dual-channel DC Motor, купить которую можно на Aliexpress.

Вот так подключается обвязка

Габариты модуля 48x30мм, по углам 4 отверстия диаметром 3мм.

В качестве управляющего микроконтроллера можно применить STM32F407VGT6 на миниатюрной плате DevEBox-STM32F4XX_M_V3.0

Программная часть
Правило управления чипом изложено в таблице 1. Два бита комбинаторно дают всего 4 режима работы.
режим | IN2 | IN1 | OUT1 | OUT2 | Пояснение |
0 | 0 | 0 | High-Z | High-Z | Драйвер отключен от мотора. Свободный пробег. IC в режиме энергосбережения. |
1 | 0 | 1 | VBAT | GND | Ток течет в направлении OUT1->OUT2 (CW) |
2 | 1 | 0 | GND | VBAT | Ток течет в направлении OUT2->OUT1 (CCW) |
3 | 1 | 1 | GND | GND | Торможение, ток в катушке бегает по кругу. |
Формально DRV8870 микросхема может работать в одном из этих четырех режимов. Вот они перед вами.

Понятно, что включать и выключать токи в H-мосте это не весело. Хочется не просто вертеть ось мотора, но и делать это с разной угловой скоростью. Тут обычно два варианта: либо модулировать sigma-delta сигнал либо модулировать PWM сигнал.
Настройка PWM на STM32
--Надо выбрать два пина и сконфигурировать их на альтернативную функцию GPIO, чтобы GPIO пины стали подключены к компараторам аппаратного таймера.
+-----+-------+--------+-------+------+------+-----+-----+------------+---------------+
| No | pad | mode | level | dir | pull |MuxS |MuxG | connect2 | name |
+-----+-------+--------+-------+------+------+-----+-----+------------+---------------+
| 0 | PE13 | ALT1 | L | out | Air | 1 | 1 | IN1 | TIM1_CH3 |
| 1 | PE14 | ALT1 | L | out | Air | 1 | 1 | IN2 | TIM1_CH4 |
| 2 | PA6 | ALT1 | L | out | Air | 2 | 2 | IN1 | TIM3_CH1 |
| 3 | PA7 | ALT1 | L | out | Air | 2 | 2 | IN2 | TIM3_CH2 |
+-----+-------+--------+-------+------+------+-----+-----+------------+---------------+--Активировать прерывания по таймерам
+------+--------------------------+------------+------+
| irq | name | Base |prior |
+------+--------------------------+------------+------+
| 24 | TIM1_BRK_TIM9_IRQn | 0x08009811 | 10 |
| 25 | TIM1_UP_TIM10_IRQn | 0x080097b5 | 10 |
| 26 | TIM1_TRG_COM_TIM11_IRQn | 0x080097d9 | 10 |
| 27 | TIM1_CC_IRQn | 0x080097e5 | 10 |
| 28 | TIM2_IRQn | 0x080097f1 | 10 |
| 29 | TIM3_IRQn | 0x080097fd | 10 |
+------+--------------------------+------------+------+--Подать тактирование на аппаратные таймеры
--Выбрать источник тактирование для пред-делителя таймера
--Вычислить пред-делитель и период счета таймера
--Задать начальное значение счетчика таймера
--Активировать каналы сравнения
--Выбрать полярность срабатывания компаратора
--Выбрать режим PWM для компаратора таймера
--Задать значение компаратора для таймера. Регистр компаратора задает заполнение периода.
--Написать обработчик прерываний для аппаратного таймера
Суммируя вышесказанное, вот на таком наборе регистров у меня работал таймерный PWM. Кому интересно можно полностью восстановить режим работы сверив значения регистров с детализацией в спеке refference manual на STM32F407xx
TIMER1
I,[Timer] Base:0x40010000,Cnt:20
+-----+--------------------+-------+------+------------+------------+-------------------------------------------+
| N | Name |offset | size | Addr | ValHex | ValBin |
+-----+--------------------+-------+------+------------+------------+-------------------------------------------+
| 1 | TIMx_CR1 | 0x000 | 0 | 0x40010000 | 0x00000081 | 0b 00000000_00000000_00000000_10000001 |
| 2 | TIMx_CR2 | 0x004 | 4 | 0x40010004 | 0x00007000 | 0b 00000000_00000000_01110000_00000000 |
| 3 | TIMx_SMCR | 0x008 | 4 | 0x40010008 | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 4 | TIMx_DIER | 0x00c | 4 | 0x4001000c | 0x00000019 | 0b 00000000_00000000_00000000_00011001 |
| 5 | TIMx_SR | 0x010 | 4 | 0x40010010 | 0x00000006 | 0b 00000000_00000000_00000000_00000110 |
| 6 | TIMx_EGR | 0x014 | 4 | 0x40010014 | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 7 | TIMx_CCMR1 | 0x018 | 4 | 0x40010018 | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 8 | TIMx_CCMR2 | 0x01c | 4 | 0x4001001c | 0x00006c6c | 0b 00000000_00000000_01101100_01101100 |
| 9 | TIMx_CCER | 0x020 | 4 | 0x40010020 | 0x00001100 | 0b 00000000_00000000_00010001_00000000 |
| 10 | TIMx_CNT | 0x024 | 4 | 0x40010024 | 0x00003196 | 0b 00000000_00000000_00110001_10010110 |
| 11 | TIMx_PSC | 0x028 | 4 | 0x40010028 | 0x00000004 | 0b 00000000_00000000_00000000_00000100 |
| 12 | TIMx_ARR | 0x02c | 4 | 0x4001002c | 0x0000ee00 | 0b 00000000_00000000_11101110_00000000 |
| 13 | TIMx_RCR | 0x030 | 4 | 0x40010030 | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 14 | TIMx_CCR1 | 0x034 | 4 | 0x40010034 | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 15 | TIMx_CCR2 | 0x038 | 4 | 0x40010038 | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 16 | TIMx_CCR3 | 0x03c | 4 | 0x4001003c | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 17 | TIMx_CCR4 | 0x040 | 4 | 0x40010040 | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 18 | TIMx_BDTR | 0x044 | 4 | 0x40010044 | 0x00008000 | 0b 00000000_00000000_10000000_00000000 |
| 19 | TIMx_DCR | 0x048 | 4 | 0x40010048 | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 20 | TIMx_DMAR | 0x04c | 4 | 0x4001004c | 0x00000081 | 0b 00000000_00000000_00000000_10000001 |
+-----+--------------------+-------+------+------------+------------+-------------------------------------------+
-->tdrr 3
TIMER3
I,[Timer] Base:0x40000400,Cnt:20
+-----+--------------------+-------+------+------------+------------+-------------------------------------------+
| N | Name |offset | size | Addr | ValHex | ValBin |
+-----+--------------------+-------+------+------------+------------+-------------------------------------------+
| 1 | TIMx_CR1 | 0x000 | 0 | 0x40000400 | 0x00000081 | 0b 00000000_00000000_00000000_10000001 |
| 2 | TIMx_CR2 | 0x004 | 4 | 0x40000404 | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 3 | TIMx_SMCR | 0x008 | 4 | 0x40000408 | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 4 | TIMx_DIER | 0x00c | 4 | 0x4000040c | 0x00000007 | 0b 00000000_00000000_00000000_00000111 |
| 5 | TIMx_SR | 0x010 | 4 | 0x40000410 | 0x00000018 | 0b 00000000_00000000_00000000_00011000 |
| 6 | TIMx_EGR | 0x014 | 4 | 0x40000414 | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 7 | TIMx_CCMR1 | 0x018 | 4 | 0x40000418 | 0x00006c6c | 0b 00000000_00000000_01101100_01101100 |
| 8 | TIMx_CCMR2 | 0x01c | 4 | 0x4000041c | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 9 | TIMx_CCER | 0x020 | 4 | 0x40000420 | 0x00000011 | 0b 00000000_00000000_00000000_00010001 |
| 10 | TIMx_CNT | 0x024 | 4 | 0x40000424 | 0x0000571d | 0b 00000000_00000000_01010111_00011101 |
| 11 | TIMx_PSC | 0x028 | 4 | 0x40000428 | 0x00000002 | 0b 00000000_00000000_00000000_00000010 |
| 12 | TIMx_ARR | 0x02c | 4 | 0x4000042c | 0x00007100 | 0b 00000000_00000000_01110001_00000000 |
| 13 | TIMx_RCR | 0x030 | 4 | 0x40000430 | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 14 | TIMx_CCR1 | 0x034 | 4 | 0x40000434 | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 15 | TIMx_CCR2 | 0x038 | 4 | 0x40000438 | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 16 | TIMx_CCR3 | 0x03c | 4 | 0x4000043c | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 17 | TIMx_CCR4 | 0x040 | 4 | 0x40000440 | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 18 | TIMx_BDTR | 0x044 | 4 | 0x40000444 | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 19 | TIMx_DCR | 0x048 | 4 | 0x40000448 | 0x00000000 | 0b 00000000_00000000_00000000_00000000 |
| 20 | TIMx_DMAR | 0x04c | 4 | 0x4000044c | 0x00000081 | 0b 00000000_00000000_00000000_10000001 |
+-----+--------------------+-------+------+------------+------------+-------------------------------------------+Достоинства DRV8870
++Дешевизна IC DRV8870. Цена 39 RUR за чип. Это ни о чем.
++Полностью интегрированное решение. H-мост упакован внутри самой микросхемы.
Недостатки DRV8870
1-- Главная проблема микросхемы DRV8870 это относительно высокое стартовое напряжение 6.5 В. Что это значит? А вот что. Если Вы питаете драйвер от двух батарей 18650, то на выходе батарейного отсека у вас получается 7.4 Вольт. Как только ваши батареи разрядятся до 6.49 V моторы замолкнут. При этом батарея разрядится при этом всего на 13 процентов. На практике моя RC машина переставала ездить, когда в двух аккумуляторах оставалось 76 % энергии. Поэтому надо либо ставить какой-то повышающий DC-DC преобразователь, либо искать альтернативную микросхему управления H-мостом.
2-- Нет SPI регистров, чтобы читать состояние чипа (события перегрева или сверхтока).
3-- Нет режима проверки факта оторванной нагрузки в H-мосте
4-- Сомнительная надежность. Из двух купленных модулей DRV8870 заработало только полтора. На одном модуле H-мост крутился только в одну сторону.
Что можно улучшить?
Как вариант, можно попробовать управлять током в обмотках не классическим PWM сигналом, а PDM сигналом. Или, говоря правильно, delta-sigma модуляцией. Там тоже заполнение увеличивается при увеличении входного сигнала.
ток, % | PDM код на INi, bin |
1 | 100000000000000000000000000000000 |
25 | 10001000100 |
50 | 10 |
75 | 11011101110 |
100 | 011111111111111111111111111111111 |
PDM лучше PWM, так как при том же заполнении амплитуда пульсаций тока в обмотках окажется меньше.

Однако аппаратных генераторов Sigma-Delta сигналов в MCU не бывает, и расчет PDM придется делать чисто программно, а это требует частых прерываний и вычислений внутри ISR.
Идеи проектов на основе IC DRV8870
++Если к DRV8870 подключить соленоид и поочередно пускать ток через катушку, то в одно�� направлении, то в другом уменьшая при этом амплитуду PWM сигналом, то можно сделать прибор для размагничивания отверток, свёрел, болтов, винтиков, наручных часов, шестигранников, насадок для шуруповертов и прочих мелких металлических предметов.
Аналогично пуская постоянный ток можно напротив до разной степени намагничивать инструменты, чтобы отвёртки могли подхватывать мелкие метизы при сборке механических изделий всяческих агрегатов. Однако для заметного намагничивания болта надо ток начиная от 2х Aмпер.
++Можно использовать IC, как строго заданного источник тока в системе управления с обратной связью.
++Можно управлять тяговым мотором в игрушечной радио управляемой машинке.
++Можно раскручивать маховики для стабилизации CubeSat-ов
++Электромагнит
++Драйвер бензонасоса, дворников, поворотники зеркал и т. п.
++LED драйвер, фары.
++Видел, как DC-мотор занимался вращением радио локационной антенны.
Итоги
Удалось научиться крутить DC мотор через микросхему драйвер DRV8870. Прошивку можно скачать тут.
Однако в новых проектах лучше ставить более совершенную микросхему DRV8251.
Словарь
Акроним | Расшифровка |
IC | Integrated circuit |
VM | Voltage Motor |
DC | Direct Current |
UVLO | Under voltage Lockout |
FET | field-effect transistor |
RMS | Root Mean Square |
PCB | printed circuit board |
ISR | interrupt service routine |
OCP | Overcurrent Protection |
TSD | Thermal Shutdown |
PWM | pulse-width modulation |
BDC | Brushed DC |
Ссылки
Название | URL |
Brushed DC Motor Driver with Integrated Current Regulation | https://www.electronics-lab.com/project/brushed-dc-motor-driver-with-integrated-current-regulation/ |
https://docs.google.com/spreadsheets/d/1M7oag2_0BDQuKo4P--TOkBHT93x1ZcyHgHhzc4dX4Zw/edit?gid=0#gid=0 | |
Delta-sigma modulation | |
Электрический стол (или Зачем нужны ARM Cortex-M0) | |
STM32F4XX M | https://stm32-base.org/boards/STM32F407VGT6-STM32F4XX-M.html |
Прошивка для исследования возможностей DRV8870 | https://github.com/aabzel/Artifacts/tree/main/dev_ebox_stm32f4x_ir_car_m |
DRV8870DDAR, Драйвер Brushed DC двигателей, 3.6А [HSOP-8 EP] | |
DRV8870EVM, EVALUATION MODULE DRV8870 | https://www.chipdip.ru/product/drv8870evm-evaluation-module-drv8870-texas-instruments-8005804155 |
Отладочная плата с DRV8870 | |
Разработка блока управления боковыми зеркалами автомобиля @RV3EFE |
Вопросы
Существуют ли российские микросхемы полностью интегрированных драйверов H-мостов? КР1128КТ4, КР1128КТ3А
Существуют ли микроконтроллеры, которые генерируют sigma-delta модулированный сигнал (PDM)? Это позволило бы более плавно управлять токами в обмотках мотора и LED нежели в случае с PWM.