Разработка buck-преобразователя на STM32F334: принцип работы, расчеты, макетирование

В двух своих последних статьях я рассказал о силовом модуле и плате управления на базе микроконтроллера STM32F334R8T6, которые созданы специально для реализации систем управления силовыми преобразователями и электроприводом. Так же был рассмотрен пример DC/AC преобразователя, который являлся демонстрацией, а не завершенной конструкцией. Теперь пришло время сделать что-то простое, но полезное, а главное завершенное.

Большинство вопросов, касающихся проекта и силовой электроники, связаны с конкретными топологиями: кому-то интересно узнать алгоритм управления PFC, кому-то хочется научиться строить LLC полумост, но наиболее популярная топология — это несомненно buck. Ведь buck-преобразователь (он же buck converter) является основной для большинства интересных проектов: это и драйвер для LED светильников, и основа MPPT контроллера для солнечных панелей, и зарядные устройства и вообще много чего еще.

В сети достаточно много информации по buck, в том числе и даташиты, но она разрозненна и мне лично не встречался материал, где подробно описан процесс создания buck-преобразователя с цифровым управлением. Пора это исправить. Математики практически нет, объяснения «на пальцах», поэтому будет интересно всем, кто хоть как-то связан с электроникой.

j4jpfvx10zexln6bwiv8gd6dbkc.jpeg

Введение


Для начала нужно понять, что мы хотим получить в итоге и какие вводные у нас есть. Топология buck является понижающей, то есть позволяет построить понижающий преобразователь напряжения. Как вы увидите далее напряжение на выходе buck-преобразователя практически линейно зависит от напряжения на входе, поэтому необходимо добавить обратную связь. Сегодня я расскажу о простой обратной связи по напряжению (voltage mode), которая является наиболее наглядной и позволит вам понять принцип работы, при этом такой обратной связи вам хватит для реализации большинства задач.

В конце статьи мы получим работающий стабилизированный источник напряжения по топологии «синхронный buck», работающий на достаточно высокой частоте с цифровым управлением, реализованным на STM32F334R8T6 с применение High Resolution PWM (HRPWM). Диапазон входного напряжения — 15…60В, выходное напряжение — 12В, максимальный выходной ток — 2А.

Глава 1. Принцип работы топологии buck


Начну я рассказывать начиная с самых основ и постепенно будем улучшать наш преобразователь, т.к. «синхронный buck» это версия улучшенный вариант с повышенными КПД и сложностью управления. Базовый вариант топологии, который вы наверняка использовали, выглядит следующим образом:

ofmvyqyaxkystxgvsiiauznkfqs.png

Данная топология используется в маломощных преобразователях напряжения, например, для питания цифровых схем и прочих маломощных приборов. Понижающие dc/dc, которые вы применяете в своих устройствах наверняка реализованы на микросхемах по данной топологии. Пример такой микросхемы LMR16006.

Принцип работы у данной схемы очень простой, на транзистор VT1 подается ШИМ сигнал, сама работа разделяется на 2 этапа, которые чередуются друг за другом:

  • Стадия накопления энергии в LC-контуре. На данном этапе транзистор VT1 открыт и ток протекает через транзистор в нагрузку, попутно накапливая энергию в катушке индуктивности и выходной емкости:

    xbx9fi3blibz8mc6t-unq7qeaau.png

  • Стадия разряда. На данном этапе транзистор VT1 закрывается и тут начинается самое интересное. Дроссель — эта такая штука, которая накапливает энергию если к нему приложить потенциал (открыть VT1) и отдает ее, если потенциал пропал (VT1 закрыли). При этом он стремится не просто отдать энергию, а сохранить значение тока и его направление, поэтому чтобы использовать данное свойство нужно добавить диод VT1, чтобы замкнуть цепь, ведь ток протекает только в замкнутой цепи:

    fmqrz2uboiwpztct_hjh9stsgws.png


Когда классе в 6–7 м я познакомился с данной топологией, то не понял сразу почему диод не проводит ток на 1-й стадии, сейчас это кажется банальным, но думаю стоит упомянуть. Когда VT1 открыт, то на катод диода VD1 прикладывается потенциал +VIN, например, +20В, а на аноде диода соответственно потенциал земли. Чтобы ток через диод протекал должно быть ровно наоборот: потенциал на аноде должен быть больше потенциала на катоде, поэтому в buck-е на стадии накопления энергии диод «закрыт». На стадии разряда диод уже замыкает цепь, на его катод не действует потенциал +VIN и не «запирает» его. Надеюсь понятно объяснил.

Тут у вас должен был возникнуть вопрос: «А какое напряжение будет на выходе, если мы подали на вход 20В?». Как всегда все просто:

hvozg6kwwhf1nekotraxpmdo2gc.png

Как видно из формулы напряжение на выходе линейно зависит от коэффициента заполнения (duty) ШИМ сигнала, который мы подаем на транзистор VT1. Если кто-то не знает или забыл «коэффициент заполнение (duty)» — это отношение времени, которое транзистор находится в открытом состояние к длительности периода. Данный коэффициент может принимать значение от 0 до 1 или от 0 до 100%. Дальше мы будет оперировать именно этой цифрой при управление преобразователем, но для понимая сути давайте подставим это отношение в формулу:

c5ijaxxjgvlviopshgx_uumfvh4.png

Частота работы buck-преобразователя величина постоянная и выбирается при проектирование, в процессе работы она не меняется, а значит и период (T) величина постоянная. Получается, что выходное напряжение напрямую зависит двух физических величин:

  • от времени на которое мы открывает верхний транзистор (VT1) — чем дольше он открыт, тем больше энергии успевает накопиться в LC-фильтре и соответственно выше напряжение на выходе;
  • от входного напряжения, например, если мы зафиксировали заполнение на 50% и меняем Vin от 20 до 40В, то на выходе напряжение будет так же меняться от 10 до 20В.


Я думаю у вас начала прорисовываться общая картина и принцип работы, давайте теперь ее закрепим и посмотрим на реальные осциллограммы и проверим данное соотношение на практике. У меня собран макет buck-а, который нагружен светодиодом на 10 Вт. Я задействовал 3 канала осциллографа, которые включены в следующие точки:

xopdbyfozm6wgh3fgz8pdeuojum.png

Опыт №1 — Входное напряжение (Vin) постоянное 20В, изменяется коэффициент заполнения

  • Vin = 20V, D = 25%, Vout = D * Vin = 0,25×20V = 5V

    i35kp5uw2m0tsofihsydvow6xws.png

  • Vin = 20V, D = 50%, Vout = D * Vin = 0,5×20V = 10V

    lgztbbg8ztwdqwwni9zfgzrdyg4.png


Как вы можете видеть на осциллограммах — соотношение между выходным напряжение и коэффициентом заполнения верное. Конечно же это был «идеализированный» эксперимент, в реальности напряжение на входе не бывает стабильным и плавает в достаточно широком диапазоне. Давайте теперь посмотрим какова будет зависимость от входного напряжения при фиксированном заполнение.

Опыт №2 — Входное напряжение (Vin) изменяется, коэффициент заполнения постоянный и равен 50%

  • Vin = 15V, D = 50%, Vout = D * Vin = 0.5×15V = 7.5V

    erat_kgnli3usl6pf2gnvs4tgky.png

  • Vin = 20V, D = 50%, Vout = D * Vin = 0.5×20V = 10V

    u7_1ekajdvcyhccqmttgiiiqbzy.png

  • Vin = 30V, D = 50%, Vout = D * Vin = 0.5×30V = 15V

    ak1znaux-gyaj1o6uxx49ewcisu.png


Теперь мы на практике убедились, что выходное напряжение так же линейно зависит от входного при фиксированном коэффициенте заполнения. Поняли уже как будет стабилизировать выход? Принцип стабилизации простой как сама формула — Vout равно 12В и константа, коэффициент заполнения мы можем менять с помощью микроконтроллера, значит если Vin увеличивается, то увеличивается и напряжение выхода и в этот момент мы уменьшаем коэффициент заполнения (duty) пока опять не станет 12В. Соответственно при уменьшение Vin мы начинаем увеличивать коэффициент заполнения пока опять же напряжение Vout не станет 12В.

На что еще хотелось бы обратить внимание в теоретическом разделе… Ах, да! Наверняка вам интересно, как ШИМ с амплитудой 20В после транзистора в итоге превратился в постоянное напряжение с мизерными пульсациями? Действительно, если мы поставим красный щуп осциллографа в исток транзистора VT1, зеленый щуп после LC-фильтра, то увидим такую картину:

pe3ooxj5ghth4p2ibxtpubt-rg8.png

Вы можете видеть, как LC-фильтр «смазывает» напряжение переменное в постоянное, а дело все в том, что энергия запасенная в индуктивности и емкости не может мгновенно израсходоваться, следовательно и напряжение не может мгновенно измениться. Получаем, что в момент, когда ШИМ перед дросселем стал 0В напряжение на выходе обеспечивается запасенной в фильтре энергией, которая не рассасывается мгновенно и ее хватает чтобы поддерживать напряжение в момент закрытия VT1. Это все на пальцах разумеется, если интересно углубиться, то как всегда советую для начал книгу Б.Ю. Семенова «Силовая электроника: от простого к сложному», там целая глава по buck (чопперу).

Борьба за КПД


Как я чуть ранее писал — это был базовый вариант топологии. Основной ее минус — высокие потери на запирающем диоде. Какой ток в несложных системах работающих на МК и CPLD? Обычно в пределах 1А, иногда 2А, если имеется какой-то TFT дисплей. В таком случае потери даже при использовании диода Шоттки составят 0,4В * 2А = 0,8 Вт. В принципе терпимо, рассеивать столько на корпусе SMA/SMB можно без проблем, хотя при напряжение 3.3В и 2А потери 0.8В — это все таки 12% КПД!

Теперь представим себе случай, когда ток у нас 20А. Это может быть и MPPT контроллер, и система питания большой FPGA и много чего еще. В таком случае потери составят 0,4В * 20А = 8 Вт! Что это значит? Например, в случае MPPT у вам будет меньше запасаться энергии в АКБ, в случае питания FPGA это будут дополнительные 8 Вт тепла, которые надо куда-то рассеивать и в обоих случаях это несомненно потеря общего КПД. Что можно сделать? А давайте заменим диод VD1 на еще один N-канальный Mosfet и получим вот такую схему:

nbom7baf8horcmhuevpeeelxkoc.png

Теперь транзистор VT2 выполняет роль диода, то есть проводит ток, когда VT1 закрыт. Диод, который был в базовой версии не требовал управления, сейчас же за улучшение характеристик мы вынуждены заплатить дополнительным каналом управления с ШИМ сигналом.

Для начала давайте посчитаем насколько мы уменьшили потери. Сопротивление канала современного mosfet-а составляет несколько мОм. В качестве примера давайте возьмем транзистор из моего силового модуля о котором я рассказывал в прошлых статьях — IPP083N10N5AKSA1 с сопротивление канала 8.3 мОм. Получаем статические потери равные 0,0083×20А * 20А = 3,32 Вт. Еще разумеется будут динамические потери, которые с адекватно спроектированным драйвером составят не более 20%, то есть суммарные потери у нас составят 4 Вт. Получаем, что переход от обычного buck-а к синхронному позволяет вдвое уменьшить потери на диоде.

Давайте теперь разберем усложнившееся управление. Как мы уже поняли запирающий диод проводил ток когда был закрыт VT1. Из этого следует, что VT2 должен быть закрыт когда открыт VT1 и соответственно VT2 открыт когда закрыт VT1. Если проще — транзисторы работают попеременно: или один открыт иди другой, если оба транзистора откроются, то возникнет сквозной ток, т.к. они замкнут между собой VIN и GND. Давайте посмотрим какой должен быть сигнал, где «желтый канал» — транзистор VT1 и «зеленый канал» — транзистор VT2:

wubcmogqwk-__w6eroszeyozsv0.png

Как видите, если в желтой канале (на VT1) установлена логическая »1», то в это время обязательно должен быть установлен логический »0» в зеленом канале (на VT2). Получаем, что VT1 накачивает энергию в LC-фильтр, а VT2 замыкает контур на стадии разрядки.

Есть еще один момент о которым вы уже ранее слышали или читали выше — сквозной ток. Дело в том, что реальный, а не идеальный транзистор (mosfet) имеет на затворе определенную емкость, то есть в реальности он не мгновенно переходит из лог.0 в лог.1, да и энергия в транзисторе не рассасывается мгновенно, в результате чего транзисторы на короткое время в момент переключения могут оказаться оба открыты. Это может привести в лучшем случае к повышенным потерям, а значит нагреву и в худшем случае в бабаху, т.к. сквозной ток это обычное короткое замыкание (КЗ). Чтобы этого избежать между выключением одного транзистора и включением другого вводят задержку или так называемый dead-time. Выглядит это следующим образом:

u8wgifnybpzrkjg1gfxua-w0gye.png

Думаю вы заметили, что на границе переключения сигнала есть небольшой пробел. Я установил его заведомо большой (около 3%), чтобы вы могли его увидеть, в реальности он значительно меньше. Вообще dead-time (далее dt) устанавливается как можно короче, но при этом достаточный чтобы транзисторы успели закрыться. Его можно рассчитать, а можно подобрать опытным путем, лично я считаю и тот и тот вариант нормальным, но бородатые джедаи наверняка скажут вам: «Нужно считать обязательно, а лучше моделировать!». Это конечно правильно, но решайте сами — если не лень моделируйте в LTspice с учетом паразитных индуктивностей и емкостей проводников и компонентов.

Для стенда в данной статья я установил dt равный ~100 мкс (на самом деле 104). Мой модуль позволяет установить его значительно меньше, т.к. драйвер очень суровый применен, но наверняка многие из вас будут собирать свой макет без моего модуля, а значит там с большой долей вероятностью будут сопли. Вот чтобы не бахнуло из-за соплей оставлю dt с запасом и если у вас нормальная разводка на плате, то вы сами можете его уменьшить — дальше в главе посвященной коду вы увидите как, а пока смотрим действительно ли есть dt:

b-tmftfkzmq7xezwdbbd67gaxf4.png

Тут видно, что dt длится 2,5 деления и каждое деление 40 мкс — значит длительность составляет ~100 мкс как и было задумано. Надеюсь вы поняли зачем нужен dt, сколько он должен быть по длительности и как вообще работает преобразователь по топологии buck. Если не поняли, то как обычно вопросы в комментариях, лс и на почту принимаются, пока вроде отвечаю всем.

Глава 2. Расчет основных компонентов


В этом части статьи я покажу как быстро и просто рассчитать основные силовые компоненты для синхронного buck-преобразователя, а именно: дроссель, входной и выходной конденсаторы, транзисторы.

Напомню вводные данные:

  • Входное напряжение: 15…30В
  • Выходное напряжение: 12В
  • Номинальный выходной ток: 2А
  • Частота коммутации: 100 кГц


Выходное напряжение 12В выбрано, т.к. в качестве нагрузки планирую использовать светодиод 12В 20Вт, который оказался под рукой и является весьма наглядной нагрузкой. Предвидя вопросы «экспертов» в комментариях — да, я в курсе, что светодиоду нужна стабилизация тока, но мы то делаем стабилизатор напряжения и светодиод просто нагрузка.

Входное напряжение выбрано от балды, можно и 15…60В сделать, поэтому если вам интересен другой диапазон, то можете посчитать для него сами значение компонентов. Номинальный ток 2А выбран чтобы получить мощность на выходе 12В * 2А = 24 Вт, то есть чуть больше, чем нужно для светодиода. Сам светодиод при 12В потребляет около 1,82…1,9А.

Остался самый интересный параметр — рабочая частота преобразователя. Какая она должна быть? Ответить тут придется вам самим, в моем случае это 100 кГц. Выбор основывается на двух тезисах:

  • Увеличение частоты приводит к уменьшению необходимой индуктивности дросселя, входного и выходного конденсатора. Если говорить проще — с увеличением частоты уменьшаются габариты устройства. С уменьшением частоты габариты увеличиваются.
  • Уменьшение частоты приводит к увеличению КПД, т.к. динамические потери при переключение транзисторов уменьшаются. Увеличение частоты увеличивает динамическую составляющую транзисторов и соответственно уменьшает КПД.


Сейчас рассуждать о выборе частоты я не буду, просто примем, что 100 кГц. После того, как я покажу методику расчетов мы вернемся к этому вопросу, т.к. по формулам будет более наглядно видна зависимость номиналов основных компонентов от рабочей частоты.

Шаг 1. Выбор транзисторов

Нас в основном будут интересовать 3 параметра: максимальное напряжение «сток-исток», сопротивление канала в открытом состоянии и емкость затвора. К транзистору прикладывается весь потенциал источника напряжения (Vin), а так же присутствуют выбросы в момент переключения. У вас есть 2 варианта: взять транзистор VT1 и VT2 с запасом по напряжению или повесть RC-снаббер на VT2. В моем случае на силовом модуле стоят транзисторы на 100В, а при входном 30В это огромный запас по напряжению, даже 60В хватило чтобы обойтись без снабберов и обезопасить транзистор от пробоя.

Сопротивление канала — тут чем меньше, тем лучше, но есть одно НО. При уменьшение сопротивления канала мы уменьшаем статические потери (I2*R), но технология такова, что увеличивается емкость затвора, а это приводит к увеличению динамических потерь. Вам предстоит найти золотую середину между «сопротивление канала» и «емкость затвора». Для напряжение до 100В советую обратить внимание на транзисторы серии OptiMOS от Infineon, на большие напряжения уже смотрите сами по параметрическому поиску или даже в сторону IGBT-транзисторов. Последние так же поддерживаются моим силовым модулем и не требуют никаких изменений в драйвере.

Шаг 2. Расчет индуктивности дросселя

Необходимо посчитать минимальное значение индуктивности, которая позволит работать нашему dc/dc преобразователю в режиме неразрывных токов (Lmin):

mjnp-jzmvy7qfodji_da3ryjeya.png

По переменным я думаю понятно все, кроме — kind. Это допустимые пульсации тока в дросселе, обычно выбирают значение 20…50%, я же практически всегда задаю 30%. Чем меньше пульсация тока, тем дальше мы будем от границы насыщения сердечника на котором намотан дроссель, но как видно из формулы — понадобится большая индуктивность дросселя.

Теперь посчитаем минимальное значение индуктивности, которая понадобится для моих вводных данных, пульсации я заложу 30% как уже выше писал:

rit92hfsubagcqaozaebmcl7alw.png

Стоит понимать, что это минимальная индуктивность, требующаяся для работы buck-преобразователя в режиме неразрывных токов, но опять есть нюанс. В процессе увеличения тока, действующего в обмотке, несколько уменьшается проницаемость сердечника и индуктивность дросселя БЕЗ тока и С током несколько отличается, у разных материалов это зависимость разная. Чтобы не возникла ситуация, когда при увеличение тока в дросселе индуктивность уменьшилась ниже Lmin и dc/dc не ушел в режим разрывного тока, необходимо несколько увеличить индуктивность, то есть добавить парочку лишних витков при намотке. Увеличения индуктивности на 10–15% будет достаточно для материала Kool Mu, а мой дроссель будет именно на нем.

Шаг 3. Расчет и изготовление дросселя

Я хотел данную процедуру описать в разделе «макетирование», но тогда этап расчета индуктивности остался бы для вас менее понятным, да и по интересным картинкам наверное соскучились, поэтому опишу все здесь. Для изготовления дросселя я возьму дроссель R26/14/11 (R — это кольцо, а цифры — габариты) из материала Kool Mu с проницаемостью 60, скачать документацию на него и купить можно тут — Лэпкос.

kcmpe19wpeprrdiz0qznmnefxyk.jpeg

Теперь нужно посчитать сколько витков и каким проводом надо намотать. Начнем с количества витков пожалуй. В документации на сердечник есть такой удобный параметр — AL, который равен 75 нГн/виток2. Тут внимательно — витки в квадрате! Чтобы найти индуктивность сердечника необходимо умножить AL на количество витков в квадрате, отсюда формула для нахождения количества витков выглядит так:

lsdnzrojp7ab0aijmv46pxllh0q.png

Чтобы получить минимальную необходимую индуктивность необходимо намотать 40 витков, но как мы уже обсудили — необходимо немного увеличить индуктивность, допустим накинем +3 витка. Берем кольцо и наматываем 43 витка, получаем вот такой дроссель:

un5eijbi_ksbefygjbn4pkrckli.jpeg

Теперь ради интереса посчитаем какая индуктивность должна получиться:

rjylmmkynrrleoebfmoilq1oyzm.png

И для надежности проверяем индуктивность дросселя пинцетом:

tmzeqjuzno3yp3tkpkcmy8jozoa.jpeg

137 мкГн, прекрасно! Результаты сошлись, погрешность в пределах ±8% для AL. Тут стоит лишь заметить — если у вас нет возможности измерить индуктивность, то не покупайте сердечники на алиэкспресс, в ЧиДе, компэле, электронщике и прочих «забегаловках» — там есть вероятность получить сердечник из другого материала или не той проницаемостью, но при правильной маркировке — проверено. Без возможности измерить индуктивность вы не сможете проверить AL и сможете сильно намучиться в поисках причины «бабаха» вашего преобразователя.

Тут появится разумный вопрос — «а хватит ли нам сердечника и его габаритов? Может надо было больше?». Для материала Kool Mu предел магнитной индукции составляет 0.5 Тл, на практике лучше не вылезать за порог выше 0.45 Тл без явно необходимости. Получается, что обмотка намотанная на сердечник не должная создавать индукцию в каждой точке сердечника больше 0.45 Тл, так что проверим:

1wvfmenl-jqsxqbnhsj-itnzgoe.png

Как видим значение магнитной индукции 0,06 Тл сильно ниже, чем предельные 0,5 Тл. Из этого можно сделать 2 вывода: во-первых, дроссель не уйдет в насыщение, а во-вторых, сердечник сильно большой и мощно взять кольцо существенно меньшего размера. Я взял кольцо R26 просто потому, что у меня их цела коробка, никакого другого тайного смысла тут нет.

Осталось определить какое сечение провода взять для дросселя. Во-первых, провод с диаметром более 1…1,2 мм я вам брать настоятельно не советую при таких высоких частотах, т.к. скин-эффект уже оказывает существенное влияние и уменьшает эффективное сечение. Во-вторых, плотность тока в проводе нужно выбирать исходя из условий охлаждения и мощности. На малых мощностях (до 10–20 Вт) можно смело закладывать плотность тока 8…10 А/мм2 даже без обдува воздушным потоком. На мощностях до нескольких киловатт лучше закладывать плотность тока в интервале 5…6 А/мм2, а при мощностях от 10 кВт и далее разумно будет снизить плотность тока до 3…4 А/мм2.

У меня под рукой оказался лакированный провод с диаметром 0,8 мм. Его сечение соответственно составляет ~0,5 мм2. При токе в 2А получаем плотность тока в обмотке около 4 А/мм2. Я мог бы использовать провод и вдвое меньшего сечения, но у меня сердечник достаточно большой, поэтому провод большего сечения без проблем влез. Когда же вы оптимизируете свое устройство, то вам придется сначала считать, а потом закупать провод нужного сечения, тогда вы сможете получить оптимальные габариты дросселя.

Шаг 4. Расчет выходного конденсатора

На данном этапе, как и в случае с индуктивностью, мы будем считать минимальное значение емкости, которую необходимо установить в LC-фильтр на выходе buck-преобразователя. Соответственно если установите больше, то будет лучше и дальше увидите почему. Посчитаем емкость:

qn_vsfifikijddrrspohgtod9a8.png

Разумеется емкость необходимо так же ставить с некоторым запасом, особенно если вы используете только керамику на выходе, т.к. ее емкость сильно уменьшается в зависимости от приложенного к ней напряжения. Еще стоит обратить на зависимость от пульсаций — переменная Vpulse. Это максимальное значение пульсаций на выходе, то есть в идеале при емкости 147,8 мкФ амплитуда пульсаций будет 0,2В, то есть напряжение на выходе будет плавать в диапазоне 11,9…12,1В. Хотите уменьшить пульсации? Тогда уменьшайте их в формуле и значение полученной емкости соответственно увеличится, разумеется лабораторный блок питания вы не получите просто увеличивая выходную емкость. Так же необходимо учесть необходимость низкого ESR, для этого обычно ставят 1–2 электролита параллельно и параллельно им навешивают керамику на несколько мкФ с диэлектриком X7R желательно. Если позволяет бюджет, то можно заменить электролитический конденсатор на полимерный тантал (как в GPU) и так керамика не нужна, ESR у них и так мизерный.

Рассуждения о рабочей частоте

Теперь, как и говорил, вернемся к вопросу выбора рабочей частоты преобразователя. Давайте я разделю выводы на несколько мыслей:

  • Как видите в формуле фигурирует частота, чем выше рабочая частота, тем меньшее значение индуктивности дросселя будет требоваться и меньшее количество витков придется мотать — экономим на меди и упрощаем изготовление моточных изделий
  • В формуле вычисления магнитной индукции присутствует индуктивность и количество витков, правда как помните индуктивность имеет квадратичную зависимость от витков, а значит при снижение количества витков в 2 раза индуктивность уменьшится в 4 раза. Из этого следует, что при повышение частоты уменьшается индуктивность и значение магнитной индукции, а значит можно применить сердечник меньшего размера, то есть уменьшаем габариты
  • Теперь посмотрим на формулу выходной емкости, тут тоже все очевидно — она линейно зависит от индуктивности, то есть чем меньше индуктивность, тем меньшая емкость нужна. Габариты уменьшаются!
  • Теперь о плохом… Частота растет, а значит увеличиваются динамические транзисторов и это очевидно ведет к снижению общего КПД. На сколько нибудь значительной мощности разумный предел частоты для buck-преобразователя на mosfet-ах составляет 200 кГц и ниже. Хотите большую мощность (сотни ватт) и огромную частоту? Добро пожаловать в мир GaN транзисторов или резонансных топологий


Думаю из этих тезисов вам стало понятно на что влияет частота коммутации, теперь вам необходимо самостоятельно научиться находить «золотую середину» между потерями на транзисторах и габаритом устройства. В одной из следующих статей я научу вас оптимизировать рабочую частоту по максимальному КПД, главное не забыть, что собирался это сделать.

Глава 3. Собираем макет buck-преобразователя


Так, самая нудная, но важная, часть закончилась, теперь пойдет железо и код. Давайте соберем макет на котором будем реализовывать теоретические выкладки. Для этого понадобятся два модуля про которые я рассказывал в предыдущих статьях: силовой модуль и модуль управления на STM32F334. Так же вы можете сами на макетной плата собрать полумост из любого подручного мусора типа IR2110, а в качестве управления применить любой МК: STM32-Discovery, LaunchPad, Arduino и просто адаптировать логику работы и код под свой любимый МК, сложного ничего не будет, если вы поняли из первых двух глав как работает buck-преобразователь.

Теперь давайте сделаем нашу структурную схему buck-а более «реалистичной», добавив на нее номиналы всех компонентов и верно отразим количество конденсаторов, а так же отметим какую часть может реализовать мой силовой модуль:

boqwhxzou-myasxcamvspvq_oac.png

Как видно по схеме модуль уже содержит в себе полумост (два транзистора) для реализации синхронного buck-а и входной конденсатор, он кстати в модуле стоит с огромным запасом — там 3 электролита по 1000 мкФ и 100В, этого хватит чтобы спокойно собрать buck на 500–800 Вт. Нам остается добавить дроссель, который мы уже изготовили и выходные конденсаторы, последние тоже кстати с запасом, т.к. на низкое напряжение я нашел только 4700 мкФ 25В, но они китайские какие-то поэтому еще и решил парочку запараллелить. На самом деле там хватит и 470 мкФ одного, но у меня такой мелочи в выводном исполнение просто не оказалось. Получается вот такая конструкция:

sh_rkup3otnnyiokil-egegoena.jpeg

Как ранее было сказано, в качестве нагрузки используется мощный светодиод на 20 Вт. На сколько он светит не знаю, да и не очень интересно, но потребляет он при 12В как раз 21…22 Вт на которые и рассчитан мой buck-преобразователь. Сам светодиод обмазал КПТ-8 и прикрутил к радиатору, его конечно мало, но на 5–7 минут работы его хватает без проблем (греется до +40…50 oC), а большего мне и не нужно. Подключаем от модуля управления 2 сигнала HRPWM, GND и через делитель цепляем выход buck-а на АЦП, в итоге имеем такой стенд:

dlll9v0povwnn86na34l1z1nvtc.jpeg

Глава 4. Пишем ПО и запускаем преобразователь


Теперь у нас есть все необходимое, что начать писать код и оживить наш buck-преобразователь. Для начала давайте посмотрим на pin-out для микроконтроллера STM32F334R8T6, который стоит в модуле управления:

bw0iaobhw935ug8xttkq_q73uio.png

Теперь нам понятно, какие будут использоваться выводы микроконтроллера. На самом модуле мне понадобится всего 1 из 5 каналов для управления силовой части, использовать будем канал «А». У данного канала, как в прочем и у остальных, есть 2 выхода высокоточного ШИМа (HRPWM), 1 вход ошибки (его не используем), GND для объединения земли плат и 2 канала АЦП (будем использовать только один для напряжения).

Немного о HRPWM

В просторах русскоязычного сегмента интернета я практически не встречал каких-то обучающих материалов по HRPWM и не встречал совсем материалов о работе с HRPWM на базе микроконтроллеров STM32, а ведь это очень полезная периферия.

Я не буду в рамках данной статьи углубляться в теорию данной периферии, поэтому опишу суть. HRPWM или High Resolution PWM — это привычный нам ШИМ модуль, который обладает повышенным разрешением установки коэффициента заполнения (duty) и в дополнение обычно обладает более гибкими настройками.

mxkbctdf9dhgu2ssfv1briuowmm.png

  • У микроконтроллера STM32F334R8T6 имеется 10 каналов HRPWM, которые объединены в 5 групп по 2 канала. Эти 2 канала внутри группы могут работать как независимо, так образовывать комплементарную пару — последняя нам и нужна;
  • Внутри комплементарной пары между 2-мя сигналами ШИМ можно устанавливать аппаратный dead-time для защиты от сквозного тока;
  • Все 10 каналов тактируются от одного таймера — Master timer, благодаря этому они все синхронизируются между собой и вам не придется вручную настраивать цепочку из таймеров. Достаточно включить мастер и таймеры Timer A…E за тактируются от него;
  • Частота на HRPWM идет удвоенная, то есть при частоте ядра в 72 МГц на HRPWM идет 144 МГц после дополнительного множителя (х2) с PLL. Это дает возможность управлять преобразователями на частоте в сотни кГц;
  • Множество настроек для управления ШИМом, например, по мимо возможности привязать геренерацию ШИМа к началу и концу периода, есть еще 4 настраиваемых события (comp), которые позволяю перевести ШИМ в 0 или 1 в любой момент периода отличный от начала/конец периода;
  • Есть режимы для конкретных топологий, например, режим push-pull, который позволяет реализовать множество двухтактный топологий.


И это лишь малая часть особенностей, на схеме устройства HRPWM вы видите еще возможности синхронизации с кучей событий, ЦАПом, встроенными в МК компараторами, а по мимо данной блок-схемы есть еще множество задокументированных возможностей.

Остался последний вопрос, который нужно осветить — «почему этот ШИМ высокоразрядный?». Для этого рассмотрим простой пример. Представим, что решили использовать МК без HRPWM, допустим STM32F103C8T6, который так же работает на частоте 72 МГц. Нам нужно управлять полумостом на частоте 70 кГц, считаем какой шаг регулирования мы можем получить: 72 000 000 / 1025 шагов = 70 243 Гц. Ага, у нас 1025 шагов и мы можем при регулировке менять напряжение на выходе с теоретическим шагом 1/1025 = ~0,1%. Теперь берем STM32F334, при частоте тактирования 144 МГц и разрядности сдвига таймера в 32 бита мы получаем эквивалентную частоту 144 МГц * 32 = 4,608 ГГц. Для тех, кто испугался и усомнился в цифре:

7noto2gpr5ht4fnztxskohfhx-m.png

Нет, это не рабочая частота, это частота эквивалентная. Что нам это дает? Берем эквивалентную частоту 4 608 000 000 Гц / 70 300 Гц = 65 535 шагов. Теперь мы можем регулировать напряжение (или ток) на выходе с шагом 1 / 65 535 = ~0,001%, то есть в 100 раз точнее!

А теперь сделаем так — частота у нас 700 кГц, что является нормально для многофазного buck-а, например. У F103 получится 72 000 000 Гц / 700 000 Гц = 102 шага, что позволяет в лучшем случае получить регулирование 1%, но это 1% для duty, то есть в реальности с таким количество шагов у вас будет напряжение плавать на выходе как будто стабилизации и нет особо. Тогда как для F334 количество шагов будет примерно 6500, что все еще позволяет строить очень точный регулятор напряжения или тока. Получаем, что разрешение (шаг) установки скважности значительно выше/чаще, чем у обычного МК с стандартным ШИМ-модулем внутри.

Настройка системы тактирования

В качестве среды разработки в данной статье я использовал TrueSTUDIO, ибо бесплатная, не такая убогая как Keil или IAR да да, расскажите мне о его чудесном отладчике, кросс-платформенная и пожалуй лучшее решение для новичков и не только. В конце статьи будет архив с проектом именно для этой IDE. Как создавать и настраивать проект я 

© Habrahabr.ru