Идея создания данного устройства у меня возникла во время доработки другого моего проекта, в котором используется микроконтроллер и повышающий преобразователь на многим известной MC34063, достаточно простой и надёжный. В том проекте предполагалось, что выходное напряжение преобразователя должно изменяться в некоторых пределах. Для этого в схеме на MC34063 имеется резистивный делитель напряжения, изменяя номиналы резисторов которого можно менять уровень выходного напряжения. В изначальной версии того проекта я использовал джамперы, которые подключали резисторы разных номиналов к делителю напряжения. Такой метод очень прост и надёжен, но мне хотелось некоторой автоматизации процесса. Я попытался вместо джамперов использовать ключи на n-mos транзисторах, которые управлялись микроконтроллером и подтягивали резисторы разных номиналов к делителю напряжения MC34063, но такой подход не принёс ожидаемого результата - из-за собственного сопротивления переходов транзисторов выходное напряжение менялось непредсказуемо. Также была попытка сделать преобразователь на микроконтроллере самого устройства, но и такой вариант тоже оказался нежизнеспособным, так как контроль выходного напряжения требовал частого его измерения и коррекции, что занимало валовую часть "процессорного времени" и не давало работать основной программе должным образом. Поэтому я пришёл к выводу, что необходим отдельный преобразователь напряжения с возможностью управления по какому-либо цифровому интерфейсу, желательно с минимальным количеством линий. Чего-то подходящего и недорогого от китайских товарищей на aliexpress я не нашёл. Тогда я решил делать свой, тем более, что по ходу моих предыдущих изысканий остались кое-какие наработки.
За основу был взят микроконтроллер STM32G030F6P6. Он достаточно недорогой, работает на частоте до 64MHz, имеет богатую периферию (в частности, АЦП, таймеры с возможностью вывода ШИМ сигнала на несколько каналов) и компактный корпус, а также может прошиваться по UART. Хотя использовать можно любой микроконтроллер, имеющий хотя бы по одному каналу АЦП, ШИМ и UART интерфейс.
В качестве управляющего интерфейса я выбрал UART, так как он наиболее прост в реализации и имеется даже в самых древних MCS-51 микроконтроллерах. А также по UART можно управлять устройством с ПК через USB-UART конвертер.
Аналоговая часть сделана по типовой схеме, аналогичной схеме "обвязки" MC34063:
Сигнал ШИМ подаётся на затвор транзистора Q1, а напряжение обратной связи снимается с резисторного делителя напряжения, подключенного между выходом преобразователя и "землёй", коэффициент его деления составляет 1/10, что даёт максимальное теоретическое выходное напряжение преобразователя - 33 Вольта (так как опорное напряжение АЦП - 3,3 вольта). Транзистор Q1 можно использовать и биполярный n-p-n структуры (например, 2SD789), для этого из схемы необходимо убрать резистор R2. Подбором резистора R3 регулируется напряжение обратной связи для точной установки выбранного уровня выходного напряжения (максимальное напряжение на делителе не должно превышать напряжение VREF АЦП модуля). Ёмкость конденсатора C4 выбирается исходя из диапазона необходимых выходных напряжений (50 - 300 uF, чем выше выходное напряжение, тем ниже ёмкость).
Цифровая часть, а точнее - программная, устроена достаточно просто. Микроконтроллер в бесконечном цикле считывает значение АЦП, сравнивает его с необходимым уровнем и в зависимости от результата убавляет или добавляет значение ШИМ сигнала. АЦП настроен на максимальную скорость измерения и разрядность 10 бит. ШИМ 9 разрядный, его таймер тактируется частотой 64MHz (частота ШИМ получается 64000000 / 512 = 125000Hz ровно). Установка необходимого уровня напряжения происходит в прерывании от UART.
При запуске преобразователя уровень выходного напряжения установлен в нуль и на выходе преобразователя будет уровень входного напряжения, проходящего через дроссель L1 и диод D1. Чтобы запустить процесс преобразования, необходимо задать уровень выходного напряжения. Это делается с помощью передачи команды по UART. Всего на данный момент поддерживается три команды: 1 - задать уровень выходного напряжения; 2 - задать интервал опроса АЦП (в миллисекундах); 3 - задать скорость нарастания/убывания ШИМ (в единицах). Каждая команда состоит из пяти байт: 1-й и 5-й байты маркеры начала и конца пакета (0xDC и 0xCD соотв.), 2-й байт - маркер команды, 3-й и 4-й байты - "полезные" данные. См. таблицу ниже.
КомандаБайт 1Байт 2Байт 3байт 4байт5Значение1 - Задать напряжение0xDC0xDCЦелыеСотые0xCD0 - 32,002 - Задать интервал0xDC0xD0ЗначениеНе важно0xCD1 - 1003 - Задать скорость0xDC0xD1ЗначениеНе важно0xCD1 - 5
Чтобы отправить команду, необходимо настроить UART управляющего микроконтроллера или компьютера на скорость 9600 бод, 8 бит, 1 - стоп бит, Parity - NO, и передать последовательно пять байт. Все значения задаются в шестнадцатеричном виде. Поясню на примере первой команды: например, надо задать выходное напряжение 12,38В, отправляем последовательно: 0xDC, 0xDC, 0x0C(12), 0x26(38), 0xCD - после получения пятого байта напряжение будет задано. Остальные две команды работают аналогично, за исключением того, что значение задаётся в 3-м байте, а 4-й не учитывается и может иметь любое значение (в пределах 0x00 - 0xFF).
Из сигналов управления, кроме входа "UART_RX", также есть вход сброса "RST"с активным низким уровнем.
Ещё я думаю добавить выход "ERROR" для сигнализации об ошибке, на тот случай, если выходное напряжение не устанавливается до нужного уровня в течение заданного таймаута. Пока это только в планах.
Данное устройство пока что было реализовано и опробовано только на макетке. Для имитации нагрузки я подключал резисторы различного номинала между выходом преобразователя и землёй с помощью кнопки и смотрел как компенсируются просадки напряжения на выходе. Просадки были в пределах +/-0,2V и достаточно быстро компенсировались ШИМ-ом. Это всё при условии установленного дросселя неизвестной индуктивности (намотанные мною на ферритовой гантельке 100 витков тонкого ~0.1-0.15 провода). При использовании транзистора 2N7002 и входным напряжением 5 Вольт (от USB) удалось поднять напряжение до 23 Вольт (при использовании менее подходящих транзисторов, например S9018 (npn) генерация становилась нестабильной уже на 15-17 вольтах). Нужно точно подбирать номиналы всех ключевых деталей для стабильной работы.
Так как схема аналоговой части очень простая, не стоит ожидать от этого преобразователя больших токов и супер точного напряжения. Он может подойти для конструкций, питающихся от USB, где необходимо повышенное напряжение с током в несколько десятков mA и возможностью изменения его уровня "на лету".
В конце статьи прикладываю весь проект в STM CubeIDE целиком. Его несложно адаптировать под другие микроконтроллеры не только от STM, главное наличие соответствующей периферии (АЦП, ШИМ, UART), в идеале вообще использовать микроконтроллер в 8-ногом корпусе для ещё большего удешевления конструкции и миниатюризации. Если использовать микроконтроллер с несколькими каналами АЦП и ШИМ, то можно сделать параллельно два или более канала преобразователя с разными напряжениями одновременно, добавив аналогичные аналоговые цепи. Я пробовал данную конструкцию с микроконтроллером STM32F103C8 (скорее всего, поддельным), 8-битным Nuvoton MS51FB9AE (имеет очень крутой 6-канальный ШИМ-контроллер при стоимости менее 0,5$). Результаты были аналогичными. Главное, разделить питание аналоговой части от микроконтроллера хотя бы с помощью LDO, а в идеале ещё и дросселем во избежание сброса МК из-за скачков питающего напряжения при включении генерации.
Проект пока в довольно "сыром" виде, требует доработки и тестирования в реальных условиях. Поэтому, если у кого-то есть мысли по доработке в первую очередь аналоговой части, не стесняйтесь высказывать свои предложения и конструктивную критику.
Скачать список элементов (PDF)
Прикрепленные файлы:
- G030_DCDC.rar (5459 Кб)
- Schematic_DCDC_STM32.PDF (40 Кб)
Автор: AndrejChoo