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

Пролог
В этом тексте я произвел обзор микросхемы 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 |
|
10 |
100000000000000000000000000000000 |
|
25 |
10001000100 |
|
50 |
10 |
|
75 |
11011101110 |
|
100 |
011111111111111111111111111111111 |
Однако расчет PDM придется делать программно, а это много вычислений.
Идеи проектов на основе IC DRV8870
++Если к DRV8870 подключить соленоид и поочередно пускать тот через катушку, то в одном направлении, то в другом уменьшая при этом амплитуду PWM сигналом, то можно сделать прибор для размагничивания отверток, свёрел, болтов, винтиков, наручных часов, шестигранников, насадок для шуруповертов и прочих мелких металлических предметов.
Аналогично пуская постоянный ток можно напротив до разной степени намагничивать инструменты, чтобы отвёртки могли подхватывать мелкие метизы при сборке механических изделий всяческих агрегатов.
++Можно использовать IC, как строго заданного источник тока в системе управления с обратной связью.
++Можно управлять тяговым мотором в игрушечной радио управляемой машинке.
++Можно раскручивать маховики для стабилизации CubeSat-ов
Итоги
Удалось научиться крутить 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 |
|
OCP |
Overcurrent Protection |
|
TSD |
Thermal Shutdown |
|
PWM |
pulse-width modulation |
|
BDC |
Brushed DC |
Ссылки
|
Название |
URL |
|
H-мост: Load Detect (или как выявлять вандализм) |
|
|
Управление напряжением PWM сигналом (PWM+RC=DAC) |
|
|
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.
Автор: aabzel
