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

Пролог
В этом тексте я произвел обзор микросхемы 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.