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
Цена за модуль: 0.1$ 1.2$
Цена за микросхему: 0.5$ 1.5$

Видос

Итого

В общем-то мостик этот мне понравился. Пожалуй, это лучший среди широкодоступных, хотя бы из-за допустимого напряжения питания двигателей 15В (МАКС). Недостатком только является отсутствие защиты от КЗ .

152
RSS
Нет комментариев. Ваш будет первым!
Загрузка...