Получение 9В, 12В от Quick Charge ⚡ с микроконтроллером STM32 (+регулировка)

С развитием телефоны стали обладать аккумуляторами с большей энергоемкостью, что потребовало увеличение мощности зарядных, нужно было увеличивать либо ток, либо напряжение. Технология быстрой зарядки Quick Charge для увеличения передающей мощности увеличивает напряжение. Таким образом сейчас довольно много сетевых зарядных устройств и носимых аккумуляторных могут выдавать более 5В.

Создавая устройства на МК вам может понадобиться повышенное напряжение, а тут такая возможность получить 9В/12В/20В без дополнительных повышающих преобразователей и с возможностью настройки, просто сказка . Облегченную версию можно найти на хабре: https://habr.com/ru/post/526992/

Приобрести на Aliexpress

🏷️ QC Trigger 9V 12V 20V (0.84💲): https://ali.ski/neZOgj
🏷️ PD Trigger 9V 12V 20V (1.04💲): https://ali.ski/zGuXz
🏷️ Trigger with Voltmetr & Button (3.90💲): https://ali.ski/B9QktN

🛒 Плохое ЗУ 3*USB-A (2💲): https://ali.ski/-f9555
🛒 Норм дорогое ЗУ 65Вт USB-C (25💲): https://ali.ski/BAL6Vs
🛒 Мой мультиметр T21D RM113D (15.0💲): https://ali.ski/l7ZdW

Описание протокола

Он описан в нескольких источниках, но лучше всего брать сведения из тех. документа на микросхему, встроенную в само зарядное, что даст 100% рабочее описание работы.

По умолчанию ЗУ выдает 5В на выходе, при этом оно следит за напряжением на D+ (D- и D+ пока замкнуты).

Чтобы зайти в режим Quick Charge нужно на вывод D+ подать напряжение выше 0.325 и ниже 2 В (обычно подают 0.6В) на время не менее 1.25 с. Потом D- автоматически подтягивается через резистор 19.58 кОм к минусу. Нам нужно подать на него ноль на время не менее 1 мс.

Всё! После этого подаем сочетание напряжений согласно таблице и на выходе оказывается соответствующее значение напряжения.

Получение постоянного выходного напряжения

Обычно всем нужно 12В, поэтому подаем 0.6В на D- и D+. Кстати, менять это сочетание можно в любой момент!

Регулировка выходного напряжения

Есть возможность перестройки выходного напряжения с шагом 0.2 В, неплохо. Выбираем непрерывный режим (continuos mode) комбинацией на D+ 0.6 В и на D- 3.3 В.

И теперь подачей импульсов на D+ приводит к увеличению, а на D- к уменьшению выходного напряжения. Куда уж проще!

Сначала самое простое исполнение (получение 12В)

Схема подключения

МК питается отдельно (от программатора), минусы конечно же соединены.

После подачи питания на выводе D+ будет 0.6В, ждем 1.25с (согласно требованиям) и  создаем переход на D- от 0В к 0.6В на время не менее чем 1 мс. Сделать всё это можно почти на любом МК, но я делаю на примере STM32, как всегда.

Создание проекта

Новый проект:

Выбираем микроконтроллер:

Любое имя -> Finish:

Включаем отладчик:
SYS -> Debug -> Serial Wire

Настраиваем один выход на выход (ЛКМ -> GPIO_Output) и пользовательская метка (ПКМ -> Enter user label): USB_DN

Программирование

/* USER CODE BEGIN 2 */ HAL_GPIO_WritePin(USB_DN_GPIO_Port, USB_DN_Pin, GPIO_PIN_SET); HAL_Delay(1300); /* DP: 0.6V; DN: 0.6V */ HAL_GPIO_WritePin(USB_DN_GPIO_Port, USB_DN_Pin, GPIO_PIN_RESET); HAL_Delay(1); HAL_GPIO_WritePin(USB_DN_GPIO_Port, USB_DN_Pin, GPIO_PIN_SET); /* USER CODE END 2 */

Проверка в железе (на макетной плате)

Проверяем путем подключения к разъему и потом нажатии кнопки сброса.

Работает:

Усложненная схема (5В/9В/12В +регулировка с шагом 0.2В)

Схема подключения

Теперь на каждом из выводов данных (D-, D+) можно устанавливать как 0.6В, так и 3.3В.

Для установки 0.6В нижний резистор (DOWN) к минусу, верхний (UP) к плюсу.

Для установки 3.3В оба к плюсу.

Куб

Нужно теперь уже аж четыре вывода, а что поделать.

Программирование (9В)

/* USER CODE BEGIN 2 */ /********** QC 9V/12V/step regulation 200mV ***********/ /* DP: 0.6V; DN: 0.6V - preset */ HAL_GPIO_WritePin(USB_DP_UP_GPIO_Port, USB_DP_UP_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(USB_DP_DOWN_GPIO_Port, USB_DP_DOWN_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(USB_DN_UP_GPIO_Port, USB_DN_UP_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(USB_DN_DOWN_GPIO_Port, USB_DN_DOWN_Pin, GPIO_PIN_RESET); HAL_Delay(1250); /* min 1.25s */ /* DP: 0.6V; DN: 0V */ HAL_GPIO_WritePin(USB_DN_UP_GPIO_Port, USB_DN_UP_Pin, GPIO_PIN_RESET); HAL_Delay(1); /* min 1ms */ /* DP: 3.3V; DN: 0.6V for 9V */ HAL_GPIO_WritePin(USB_DN_UP_GPIO_Port, USB_DN_UP_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(USB_DN_DOWN_GPIO_Port, USB_DN_DOWN_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(USB_DP_UP_GPIO_Port, USB_DP_UP_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(USB_DP_DOWN_GPIO_Port, USB_DP_DOWN_Pin, GPIO_PIN_SET); /* USER CODE END 2 */

Проверка

Хорошо, и 9 вольтов удалось получить .

Программирование (рег. с шагом 0.2В)

/* USER CODE BEGIN 2 */ /********** QC 9V/12V/step regulation 200mV ***********/ /* DP: 0.6V; DN: 0.6V - preset */ HAL_GPIO_WritePin(USB_DP_UP_GPIO_Port, USB_DP_UP_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(USB_DP_DOWN_GPIO_Port, USB_DP_DOWN_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(USB_DN_UP_GPIO_Port, USB_DN_UP_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(USB_DN_DOWN_GPIO_Port, USB_DN_DOWN_Pin, GPIO_PIN_RESET); HAL_Delay(1250); /* min 1.25s */ /* DP: 0.6V; DN: 0V */ HAL_GPIO_WritePin(USB_DN_UP_GPIO_Port, USB_DN_UP_Pin, GPIO_PIN_RESET); HAL_Delay(1); /* min 1ms */ /* DP: 0.6V; DN: 3.3V for continuous mode */ HAL_GPIO_WritePin(USB_DN_UP_GPIO_Port, USB_DN_UP_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(USB_DN_DOWN_GPIO_Port, USB_DN_DOWN_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(USB_DP_UP_GPIO_Port, USB_DP_UP_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(USB_DP_DOWN_GPIO_Port, USB_DP_DOWN_Pin, GPIO_PIN_RESET); /* USER CODE END 2 */

Функция для увеличения выходного напряжения на 0.2 В

void QC_200mV_Inc(void){ /* DN: 3.3V */ HAL_GPIO_WritePin(USB_DN_UP_GPIO_Port, USB_DN_UP_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(USB_DN_DOWN_GPIO_Port, USB_DN_DOWN_Pin, GPIO_PIN_SET); /* ****** */ /* * * */ /* * * */ /******* *******/ /* DP: 0.6V */ HAL_GPIO_WritePin(USB_DP_UP_GPIO_Port, USB_DP_UP_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(USB_DP_DOWN_GPIO_Port, USB_DP_DOWN_Pin, GPIO_PIN_RESET); /* DP: 3.3V */ HAL_GPIO_WritePin(USB_DP_UP_GPIO_Port, USB_DP_UP_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(USB_DP_DOWN_GPIO_Port, USB_DP_DOWN_Pin, GPIO_PIN_SET); HAL_Delay(1); /* DP: 0.6V */ HAL_GPIO_WritePin(USB_DP_UP_GPIO_Port, USB_DP_UP_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(USB_DP_DOWN_GPIO_Port, USB_DP_DOWN_Pin, GPIO_PIN_RESET); }

Функция для уменьшения выходного напряжения на 0.2 В

void QC_200mV_Dec(void){ /* DP: 0.6V */ HAL_GPIO_WritePin(USB_DP_UP_GPIO_Port, USB_DP_UP_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(USB_DP_DOWN_GPIO_Port, USB_DP_DOWN_Pin, GPIO_PIN_RESET); /******* *******/ /* * * */ /* * * */ /* ****** */ /* DN: 3.3V */ HAL_GPIO_WritePin(USB_DN_UP_GPIO_Port, USB_DN_UP_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(USB_DN_DOWN_GPIO_Port, USB_DN_DOWN_Pin, GPIO_PIN_SET); /* DN: 0.6V */ HAL_GPIO_WritePin(USB_DN_UP_GPIO_Port, USB_DN_UP_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(USB_DN_DOWN_GPIO_Port, USB_DN_DOWN_Pin, GPIO_PIN_RESET); HAL_Delay(1); /* DN: 3.3V */ HAL_GPIO_WritePin(USB_DN_UP_GPIO_Port, USB_DN_UP_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(USB_DN_DOWN_GPIO_Port, USB_DN_DOWN_Pin, GPIO_PIN_SET); }

Проверка

Каждый раз при выполнении функции QC_200mV_Inc() напряжение увеличивается на 200 мВ, а при выполнении QC_200mV_Dec() уменьшается на 200 мВ.

Что там с USB Type-C

Припаял плату-переходник с разъемом и проверил. Обязательно резисторы 5.1к, вот здесь описана важные нюансы работы с USB-C.

Подключаю к ноутбучному ЗУ 65Вт (поддерживат куча всего, в том числе QC):

Проверил выставление 9В, 12В ну и регулировку - всё работает! 

Необычный способ

Ознакомившись со статьей по использованию ШИМ-сигнала с ФНЧ для получения ЦАП можно обойтись всего лишь двумя выводами, способными генерировать ШИМ-сигнал от таймера. Сразу стоит учесть, что нужно использовать повторитель на ОУ для пассивного фильтра, то есть появится дополнительная МС. Но с другой стороны, если каждая ножка на счету такое решение может стать решением.

Определение подключения разъема

Если устройство (МК) будет питаться от того же зарядного полностью, то проблем нет - оставляем как есть и код выполнится после включения один раз перед главным циклом.

Коль же устройство работает независимо (от встроенного аккумулятора), то можно либо поставить кнопку или просто докинуть дополнительный стабилизатор 3.3В, тот же AMC1117 с входным напряжением не менее 15В, а его выход на любой вход МК. Таким образом будет уже использовано пять ножек .

Проверка различных ЗУ

Проверил с разными зарядками, которые были в наличии, на всех где должно работать - работает. Обратить внимание стоит на наименьшее выходное напряжение, оно немного отличается, например, с мощные ЗУ могут уменьшать напряжение до 3.7В, а вот оюычные полутрадолларовые зарядки только 4.2В, поэтому ориентироваться всегда нужно на не менее чем 4.2В (при регулировке).

Видос

Итого

В проекте имена (Label) ножек изменены на более осмысленные (USB -> QC), чтобы не возникало путаницы: https://github.com/Egoruch/Quick-Charge-STM32-HAL

Теперь вы можете с легкостью использовать Quick Charge в своих проектах и получить до 20В 12В, да еще и с возможностью настройки выходного напряжения, что дает возможность значительно упростить питание (не нужно дополнительных повышающих преобразователей), сэкономить на компонентах и повысить КПД устройства. Выполнить эту схему можно на маленьком МК и использовать как триггер "спусковой крючок" для питания чего-то, требующего повышенного напряжения.

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