H-мост ⚙️ TB6612 (15В 1.2А) драйвер коллекторного двигателя (подключение, тесты)
Основные параметры
Выходной ток: 1.2 А (3.2А ПИК)
Напряжение питания: 15 (МАКС)
Количество каналов: 4 (два H-моста для 2 двигателей)
Сопротивление открытых каналов: 0.5 Ом
Возможности: Вращение по часовой стрелки/против часовой/тормоз/стоп
Режим пониженного энергопотребления
Рассеиваемая мощность: 0.78 Вт (только МС)
Корпус: SSOP24 (шаг 0.65 мм)
Цена: 1.2$
Купить на Aliexpress
?️ TB6612 Dual Motor Driver 1A (1.67?): https://ali.ski/OGRDqv
?️ TB6612FNG (1.18?): https://ali.ski/jY5_k
?️ STM32F401 Module USB-C (3.15?): https://ali.ski/IbtO-
?️ STM32F401CEU6 Module (2.00?): https://ali.ski/3rb8l
? Мой мультиметр T21D RM113D (13.81?): https://ali.ski/vEq1v
Зачем нужен H-мост?
H-мост позволяет подавать на нагрузку питание разной полярности, таким образом подключив двигатель постоянного тока и меняя логические уровни на входе микросхемы можно менять +- на выходе, тем самым изменяя направление вращения вала мотора.

Вступление и микросравнение
Сложно найти хорошую и доступную микросхему для полноценного управления щеточными двигателями, ведь не делать же управление на дискретных компонентах


Есть бичевые
L9110, цена у них хорошая, но они рассчитаны на напряжение питания до 12В, а двигатели как раз и будут питаться от такого напряжения (или от трех банок LiPo), да и ток тут до 0.8А, да мосты эти сами по себе говененькие
, поэтому здесь обозревается решение получше — H-мост TB6612 от Toshiba.

Как подключать?
Рекомендуемая схема электрическая имеет на входе и выходе конденсаторы по питанию 0.1 мкф и 10 мкФ (можно поставить два керамических), и что важно, здесь видно, что логические входы имеют подтяжку 200 кОм к минусу, что очень удобно, т.к. не вынуждает ставить дополнительные резисторы.
Также параллельно двигателям постоянного тока настоятельно советую ставить емкость 0.1 мкФ, чтобы уменьшить искрение щеток, что увеличит срок службы моторчиков и значительно уменьшит создаваемые помехи
Это чудо имеет 4 канала, то бишь предназначено для подключения двух двигателей ( AO1, AO2 к одному и BO1, BO2 ко второму):
Для управление есть три вывода ( PWMA, AIN1, AIN2) и (PWMB, BIN1, BIN2), то есть можно как просто подавать логические уровни, так и дополнительно фигачить ШИМ-сигнал (до 100 кГц!) (если не используется, то вывод должен быть подключен к плюсу!).
Есть таблица, показывающая какие же уровни нужно подавать, и что тогда будет:
Испытание
Короче, подключив маленький щеточный двигатель у переставляя провода вручную, все работает отлично. Но руками переставлять провода неудобно
, поэтому подключаю это к плате MiniF4 с микроконтроллером STM32F411.

В кубике по-бырому настрои вывод для STBY два вывода на выход для AIN1 и AIN2, а также сразу попробуем ШИМить на PWMA, для этого используется первый канал первого таймера.
SYS -> Debug: Serial Wire
RCC -> HSE -> Crystal/Ceramic Resonator
GPIO -> GPIO Pull-up/Pull-down: Pull-down
TIM1 -> Clock Source: Internal Clock
TIM1 -> Channel1: PWM Generation CH1
Запускаем двигатель против часовой стрелки, для этого запускаем таймер, выставляем коэффициент заполнения 100% (можно меньше), и ставим на AIN1 высокий уровень, а на AIN2 низкий и выходим из спящего режима установкой высокого уровня на STBY:
/* USER CODE BEGIN 2 */
/* PWM */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
IM1->CCR1 = TIM1->ARR + 1; /* MAX VALUE */
/* CW */
HAL_GPIO_WritePin(AIN1_GPIO_Port, AIN1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(AIN2_GPIO_Port, AIN2_Pin, GPIO_PIN_RESET);
/* Exit Standby Mode */
HAL_GPIO_WritePin(STBY_GPIO_Port, STBY_Pin, GPIO_PIN_SET);
/* USER CODE END 2 */
Запускаю программу и всё отлично работает (питание от LiPo 3S):

Для обратного вращения меняем местами уровни на AIN1, AIN2:
/* USER CODE BEGIN 2 */
/* PWM */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
IM1->CCR1 = TIM1->ARR + 1; /* MAX VALUE */
/* CCW */
HAL_GPIO_WritePin(AIN1_GPIO_Port, AIN1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(AIN2_GPIO_Port, AIN2_Pin, GPIO_PIN_SET);
/* Exit Standby Mode */
HAL_GPIO_WritePin(STBY_GPIO_Port, STBY_Pin, GPIO_PIN_SET);
/* USER CODE END 2 */
И вуаля:

Также здесь есть остановка (просто отключение питания) и резкая остановка замыканием (
short brake) (таким образом ЭДС, которая генерируется за счет остаточного движения будет подключена на низкоомную нагрузка в виде переходов внутренних транзисторов, поэтому будьте осторожны, если вал будет продолжать вращаться из-за большой инерционности или внешними силами). В общем-то с обычными щеточными двигателями это заметно почти не будет, но, если есть шаговый, то попробуйте вращать вал с замкнутыми катушками
)
/* USER CODE BEGIN 2 */
/* PWM */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
IM1->CCR1 = TIM1->ARR + 1; /* MAX VALUE */
/* BRAKE */
HAL_GPIO_WritePin(AIN1_GPIO_Port, AIN1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(AIN2_GPIO_Port, AIN2_Pin, GPIO_PIN_SET);
TIM1->CCR1 = 0;
/* Exit Standby Mode */
HAL_GPIO_WritePin(STBY_GPIO_Port, STBY_Pin, GPIO_PIN_SET);
/* USER CODE END 2 */
И для включение режима ожидания:
/* USER CODE BEGIN 2 */
/* PWM */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
IM1->CCR1 = TIM1->ARR + 1; /* MAX VALUE */
/* STOP */
HAL_GPIO_WritePin(AIN1_GPIO_Port, AIN1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(AIN2_GPIO_Port, AIN2_Pin, GPIO_PIN_RESET);
TIM1->CCR1 = 0;
/* Enter Standby Mode */
HAL_GPIO_WritePin(STBY_GPIO_Port, STBY_Pin, GPIO_PIN_SET);
/* USER CODE END 2 */
Ток во время работы
Может достигать пиковых значений в 3 А, но советуют всё таки придерживаться допустимых значений.
Удобный код
Для читаемого и компактного кода предлагаю создать перечисление (сразу объявить его новым типом данных через typedef) со всеми состояниями двигателя:
typedef enum
{
CW,
CCW,
BRAKE,
STOP,
STBY
}MotSet;
Далее делаем функцию, в которой первым аргументом выступаем состояние, а вторым мощность, которая регулируется ШИМ-сигналом (от 0% до 100%):
void MotControl(MotSet motset, uint8_t power_percent)
{
/* Exit Standby Mode */
HAL_GPIO_WritePin(STBY_GPIO_Port, STBY_Pin, GPIO_PIN_SET);
if(power_percent >= 100)
{
TIM1->CCR1 = TIM1->ARR + 1;
}
else
{
TIM1->CCR1 = power_percent*0.01*(TIM1->ARR + 1);
}
switch(motset)
{
case CW:
HAL_GPIO_WritePin(AIN1_GPIO_Port, AIN1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(AIN2_GPIO_Port, AIN2_Pin, GPIO_PIN_RESET);
break;
case CCW:
HAL_GPIO_WritePin(AIN1_GPIO_Port, AIN1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(AIN2_GPIO_Port, AIN2_Pin, GPIO_PIN_SET);
break;
case BRAKE:
HAL_GPIO_WritePin(AIN1_GPIO_Port, AIN1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(AIN2_GPIO_Port, AIN2_Pin, GPIO_PIN_SET);
TIM1->CCR1 = 0;
break;
case STOP:
HAL_GPIO_WritePin(AIN1_GPIO_Port, AIN1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(AIN2_GPIO_Port, AIN2_Pin, GPIO_PIN_RESET);
TIM1->CCR1 = 0;
break;
case STBY:
HAL_GPIO_WritePin(STBY_GPIO_Port, STBY_Pin, GPIO_PIN_RESET);
TIM1->CCR1 = 0;
break;
}
}
И теперь в коде удобно осуществлять управление одной небольшой функцией (да, в случае последних трех функций мощность не важна):
MotControl(CW, 100); /* Clockwise */
MotControl(CCW, 100); /* Counter Clockwise */
MotControl(BRAKE, 100); /* Short Brake */
MotControl(STOP, 100); /* Stop */
MotControl(STBY, 100); /* Standby Mode (Input Current about 25 uA) */
Управление через ШИМ
По документации частота управляющего сигнала не должна превышать 100 кГц, обычно лучше ставить около 30 кГц, чтобы не было слышно писк.
Здесь в примере стоит 10 кГц (см. натсройки Куба), а также сделал увеличение этого значение для плавного увеличение числа оборотов/с:
/* USER CODE BEGIN 2 */
uint8_t motpow = 0;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
MotControl(CW, motpow);
motpow++;
if(motpow > 100)
{
motpow = 0;
}
HAL_Delay(50);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
И теперь скорость плавно нарастает от 0% до 100 % по кругу:

Ток покоя и рабочий ток
Для экономии заряда микросхему можно вводить в сон, установив на выводе STBY логический ноль, тогда протекающий ток должен быть до 25 мкА.
А в действительности так и есть, и это очень хорошее значение, учитывая рабочий ток около 1800 мА ( Uпит = 3.3В).

Испытание коротким замыканием
К сожалению, когда замкнул выход, то микросхемка моментально вышла из строя с дальнейшим нагревом при протекающем токе 0.6 А
.
Сравнение мостов L9110S и TB6612

Здесь можно посмотреть обзор на микросхему H-моста L9110S.
| H-МОСТЫ | L9110 | TB6612 |
| Напряжение, В: | 12 | 13.5 |
| Ток, А: | 0.8 | 1.2 |
| Пиковый ток, А: | 2 | 3.2 (10 мс) |
| Рабочий ток, мкА: | 500 (неправда) | 1800 (при 3.3В) |
| Ток покоя, мкА: | 2 (неправда) | 25 |
| Доп. возможности: | − |
остановка замыканием (
short brake) установка спящего режима ( standby) |
| Защита от КЗ: | нет (сгорает) | нет (сгорает) |
| Количество каналов: | 1 | 2 |
| Корпус: | SOP-8/DIP-8 | SSOP-14 |
| Цена за модуль: | 1$ (две МС) | 1.2$ |
| Цена за микросхему: | 0.1$ | 1.5$ |
Видос
Итого
В общем-то мостик этот мне понравился. Пожалуй, это лучший среди широкодоступных, хотя бы из-за допустимого напряжения питания двигателей 15В (МАКС). Недостатком только является отсутствие защиты от КЗ .
