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

Пролог
В этом тексте я произвел обзор микросхемы 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
--Нет SPI регистров, чтобы читать состояние чипа (события перегрева или сверхтока).
--Нет режима проверки факта оторванной нагрузки в H-мосте
--Сомнительная надежность. Из двух купленных модулей DRV8870 заработало только полтора. На одном модуле H-мост крутился только в одну сторону.
Что можно улучшить?
Как вариант, можно попробовать управлять током в обмотках не классическим PWM сигналом, а PDM сигналом. Или, говоря правильно, delta-sigma модуляцией. Там тоже заполнение увеличивается при увеличении входного сигнала.
ток, % |
PDM код на INi, bin |
1 |
100000000000000000000000000000000 |
25 |
10001000100 |
50 |
10 |
75 |
11011101110 |
100 |
011111111111111111111111111111111 |
Однако аппаратных генераторов Sigma-Delta сигналов в MCU не бывает, и расчет PDM придется делать чисто программно, а это требует частых прерываний и вычислений внутри ISR.
Идеи проектов на основе IC DRV8870
++Если к DRV8870 подключить соленоид и поочередно пускать ток через катушку, то в одном направлении, то в другом уменьшая при этом амплитуду PWM сигналом, то можно сделать прибор для размагничивания отверток, свёрел, болтов, винтиков, наручных часов, шестигранников, насадок для шуруповертов и прочих мелких металлических предметов.
Аналогично пуская постоянный ток можно напротив до разной степени намагничивать инструменты, чтобы отвёртки могли подхватывать мелкие метизы при сборке механических изделий всяческих агрегатов.
++Можно использовать IC, как строго заданного источник тока в системе управления с обратной связью.
++Можно управлять тяговым мотором в игрушечной радио управляемой машинке.
++Можно раскручивать маховики для стабилизации CubeSat-ов
++Электромагнит
++Драйвер бензонасоса, дворников, поворотники зеркал и т. п.
++LED драйвер
Итоги
Удалось научиться крутить DC мотор через микросхему драйвер DRV8870. Прошивку можно скачать тут.
Словарь
Акроним |
Расшифровка |
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 |
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.
Комментарии (17)

randomsimplenumber
13.10.2025 01:49Сомнительная надежность
Вместо оригинала от TI взять дешевую копию - что тут не так?

LinkToOS
13.10.2025 01:49Есть надежный способ отличить клон (китайский "аналог") от оригинала?
На Алиэкспрессе оригинальные микросхемы тоже попадаются, и в модулях и отдельно.

osmanpasha
13.10.2025 01:49Покупать чипы в проверенных местах с хорошей репутацией, типа LCSC, digikey, mouser? На LCSC этот DRV8870 от TI стоит $0.27, что, прямо скажем, подъемно.
Можно, конечно, купить на Али и вглядываться в маркировку чипа и искать, где там китайцы неправильно поставили точку или использовали не тот лазер, но это в любом случае лотерея. Может выглядеть нормально и работать нормально, а ближе к допустимым границам сломается.

LinkToOS
13.10.2025 01:49Вы работали с микросхемой DRV8870?
У этого драйвера никаких функциональных особенностей нет. Типичный представитель своего класса.

aabzel Автор
13.10.2025 01:49Может кто знает нормальные отладочные модули с этим чипом?

LinkToOS
13.10.2025 01:49Я не встречал. Но есть ли необходимость тренироваться именно на этой микросхеме? Можно что угодно использовать с таким же типом управления и возможностью установки максимального тока. Разве что нужно именно до 45 вольт. Таких аналогов немного.

aabzel Автор
13.10.2025 01:49Но есть ли необходимость тренироваться именно на этой микросхеме?
Нет. Мне сойдет любая микросхема драйвера интегрированного H-моста. Лишь бы для нее была относительно компактная макетная плата с 4мя отверстиями 3мм по углам и винтовыми клемниками для привинчивания нагрузки и питания.
А в идеале чтобы на плате еще и был какой-н ARM Cortex-M.
checkpoint
Сейчас экспериментирую с аналогичной китайской микросхемой SA8328, это два H-моста в одном, по 2.5А каждый. Даташит на неё крайне лаконичен, режимы не описаны. Никто не сталкивался ?
aabzel Автор
SA8328 выглядит как решение для шаговых двигателей.
Хотя интерфейс не step dir и можно вращать два отдельных BDC моторчика.
checkpoint
SA8328 - это обычный сдвоенный H-мост. Мне не понятно какие комбинации In1/In2 оно поддерживает и имеются ли внутри защитные диоды как в КР1128КТ4.
osmanpasha
Он же на мосфетах, там паразитные диоды в любом случае играют роль защитных, нет?
checkpoint
При небольших токах - да, но на 2А их пробьет как нефиг делать. Я подозреваю, что китайские инженеры подумали на эту тему, так как данная микросхема подсмотренна в готовом изделии с моторами и там никаких дополнительных защитных средств нет. Но хотелось бы найти какое-то обоснованное подтверждение этому предположению. :) Микросхема очень привлекает своими миниатюрными габаритами и ценой.
aabzel Автор
Прям, как в российских микросхемах. Спека размером 1, максимум 3 странички.
https://eandc.ru/pdf/mikroskhema/kr1128kt4.pdf
и формулировки типа: "изделие работает от электричества"
osmanpasha
А можно взять чип с нормальной документацией вместо этого? Если некитайские производители недоступны, то найти какой-нибудь честный китайский клон TI - хотя бы будет понятно, что от него ожидать.
Я сейчас купил HT8835A, клон DRV8835, тоже двойной H-мост, только на меньшие ток и напряжение, чем у вас, у него гораздо подробнее даташит (до оригинала конечно все равно не дотягивает).
checkpoint
Тоже интересный вариант, спасибо за наводку. Если с SA8328 не получится, попробую HT8835A.