Цифровой источник питания Buck-Boost с синхронным выпрямлением на базе STM32 — открытый исходный код
Подключение к VIN- необходимо для того, чтобы входной ток проходил через токоизмерительный резистор, благодаря чему даже при подключении только USB2 можно измерить входной ток.
Автор, при написании программ вы использовали событие fault модуля HRTIM? Я с помощью компаратора реализовал аппаратное отключение MOSFET, когда ток дросселя превышает заданное значение, но во время плавного пуска заметил, что выход PWM будто бы отключается. Мне кажется, это происходит из-за слишком большого зарядного тока конденсатора, который достигает заданного порога и приводит к отключению PWM. Хотелось бы узнать, как настроить HRTIM в STM32 для реализации режима Cycle-by-Cycle, чтобы во время плавного пуска при достижении максимального заданного тока дросселя выход PWM немедленно отключался, но в следующем цикле автоматически включался снова?
Откалибрована ли ваша измерительная схема? Спроектированная вами печатная плата будет иметь множество паразитных параметров, которые приводят к небольшим изменениям коэффициента усиления измерительной схемы. Её необходимо откалибровать, прежде чем она сможет относительно точно выдавать правильные значения.
Изменялось ли программное обеспечение, проверьте, нет ли проблем со схемой выборки.
Гуру, я добавил аппаратную защиту по току (циклическое ограничение тока), а также замедлил плавный пуск в разомкнутом контуре (сейчас 500 Гц, шаг 0.001). Внутренний контур по току я не добавлял, так как считаю, что лучше сначала закончить с разомкнутым контуром, а потом переходить к замкнутому.
-
При тестировании на плате я обнаружил, что в режиме холостого хода схема работает нормально, но после подключения нагрузки 20 Ом (выходное напряжение Vo установлено на 30 В) MOSFET снова выходит из строя. Какая может быть причина?
-
Схема и код для режима холостого хода и работы под нагрузкой абсолютно одинаковы, почему же тогда происходит выход MOSFET из строя?
-
Что делать дальше? Уменьшить выходной конденсатор? Потому что раньше, когда выходной конденсатор был меньше, схема нормально работала под нагрузкой, но после того как я увеличил выходной конденсатор и подал питание, MOSFET сгорел. Если я снова уменьшу выходной конденсатор, будет ли схема работать нормально? Почему так происходит?
Эта проблема очень типична: пусковой ток при зарядке выходного конденсатора во время плавного пуска действительно часто вызывает ложное срабатывание защиты по току. Если вы используете режим HRTIM Fault с защелкой (Latched), то после срабатывания он будет оставаться выключенным, пока программа вручную не сбросит его — это и есть эффект «полного отключения ШИМ», который вы наблюдаете.
Чтобы реализовать Cycle-by-Cycle (ограничение тока цикл за циклом), основная идея такова: Fault должен отключать только текущий цикл, а в следующем цикле автоматически восстанавливаться. Аппаратная часть HRTIM полностью поддерживает эту функцию, нет необходимости программно сбрасывать флаг в каждом цикле.
Вот несколько ключевых моментов настройки, просто настройте по регистрам или через HAL:
1. Настройка источника Fault в режиме «автоматического восстановления»
В HRTIM_FLTINR1/2 найдите канал Fault, к которому подключен компаратор (например, Fault1), обратите внимание на эти биты:
- FLTxP[1:0] (Fault Polarity): настройте в соответствии с полярностью выхода компаратора, обычно активный высокий уровень.
- FLTxSRC[1:0] (Fault Source): выберите внешний вход (COMPx_OUT или внешний пин).
- FLTxF[3:0] (Fault Filter): рекомендуется добавить фильтр на несколько нс, чтобы предотвратить ложное срабатывание от глитчей компаратора.
Самое главное — бит FLTxRSM (Fault Reset Mode) в регистре HRTIM_FLTxR:
- Настройте на 0: Immediate —— после исчезновения сигнала Fault ШИМ немедленно восстанавливается.
- Не настраивайте на Latched (с защелкой), это для защиты от неисправностей, а не для ограничения тока цикл за циклом.
2. Настройка реакции на Fault на уровне Timer
В регистре HRTIM_TIMxFLTR (x соответствует вашему таймеру, например, TIMA/B/C/D):
- FLTxEN: включить соответствующий канал Fault.
- FLTLCK: во время плавного пуска лучше пока не блокировать, сохранить автоматическое восстановление.
- Состояние выхода при защите Fault: настройте на «неактивный уровень выхода» (в активном состоянии выключает MOSFET), в зависимости от того, является ли драйвер верхнего/нижнего ключа активным высоким или низким уровнем. Выход Fault в HRTIM можно независимо настраивать в состояния Set/Reset.
3. Ключевой момент: бланкинг (Blanking) или временное повышение порога во время плавного пуска
При плавном пуске ток зарядки пустого конденсатора I = C × dV/dt, если коэффициент заполнения нарастает слишком быстро, этот бросок легко превышает вашу обычную рабочую точку ограничения тока. Помимо изменения режима HRTIM, рекомендуется системная поддержка:
Вариант A: добавление бланкинга по току (Current Blanking) во время плавного пуска
HRTIM сам по себе поддерживает Fault Blanking Window, который маскирует вход Fault в течение некоторого времени после включения ШИМ. Но это больше подходит для маскирования коммутационных помех, для процесса зарядки длительностью в десятки мс при плавном пуске этого недостаточно.
Вариант B: поэтапное ограничение тока при плавном пуске (рекомендуется)
- В первые 50 мс~100 мс плавного пуска временно повысьте порог компаратора (например, при обычном ограничении 10 А, во время плавного пуска установите 15 А или 20 А).
- Когда выходное напряжение достигнет примерно 80% от заданного значения, переключитесь обратно на нормальный порог ограничения тока цикл за циклом.
- Это переключение можно сделать с помощью взаимодействия HRTIM с DMA или программного таймера, не занимая циклы CPU.
Вариант C: использование режима Delayed Protection в HRTIM
Если вы используете HRTIM в G474, таймер поддерживает Delayed Protection (настраивается в HRTIM_OUTxR), можно настроить так, чтобы при срабатывании Fault не происходило немедленного полного отключения, а только ограничивался коэффициент заполнения, но это больше подходит для режима Hiccup (хиккап), а не для строгого Cycle-by-Cycle.
4. Пример HAL на уровне кода (для справки)
// Предполагается использование Fault1, подключенного к COMP1_OUT, активный высокий уровень
HRTIM_FaultCfgTypeDef pFaultCfg = {0};
pFaultCfg.Source = HRTIM_FAULTSOURCE_DIGITALINPUT;
pFaultCfg.Polarity = HRTIM_FAULTPOLARITY_HIGH;
pFaultCfg.Filter = HRTIM_FAULTFILTER_NONE; // или добавить фильтр на 2-3 такта
pFaultCfg.Lock = HRTIM_FAULTLOCK_READWRITE; // не блокировать
HAL_HRTIM_FaultConfig(&hhrtim, HRTIM_FAULT_1, &pFaultCfg);
// Ключевой момент: настройка на режим автоматического восстановления
HAL_HRTIM_FaultResetConfig(&hhrtim, HRTIM_FAULT_1, HRTIM_FAULTRESETMODE_IMMEDIATE);
// Включение реакции на Fault1 для Timer A
HAL_HRTIM_TimerFaultConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_FAULT_1, HRTIM_TIMFAULTENABLE_FAULT1);
Затем в прерывании (если вы используете прерывания) или в главном цикле не нужно вручную сбрасывать флаг Fault, аппаратное обеспечение автоматически восстановит ШИМ, когда выход компаратора станет низким. Единственное, за чем нужно следить: если Fault срабатывает N циклов подряд, это означает реальную перегрузку по току, и тогда программа должна вмешаться, чтобы снизить коэффициент заполнения или отключить.
5. Рекомендации по отладке
Сравните три осциллограммы:
- Ток дросселя (или напряжение на токоизмерительном резисторе)
- Выход компаратора (напрямую посмотреть на пин HRTIM Fault)
- Выход ШИМ HRTIM
Если после отключения ШИМ выход компаратора стал низким, но ШИМ не восстановился → это значит, что FLTxRSM не настроен на Immediate, а все еще находится в Latched.
Если ШИМ в каждом цикле ненадолго отключается и снова включается → это значит, что Cycle-by-Cycle работает, просто пусковой ток при плавном пуске действительно слишком велик, и нужно использовать Вариант B для временного повышения порога.
Резюме: нужный вам Cycle-by-Cycle — это режим автоматического восстановления Fault + отсутствие защелки, аппаратная часть HRTIM изначально поддерживает это. Проблему ложного срабатывания при плавном пуске рекомендуется решать в комбинации с динамической регулировкой порога компаратора на этапе плавного пуска, это надежнее, чем просто изменение HRTIM.
Твоя проблема очень типична: на холостом ходу работает, а под нагрузкой взрывается. Это значит, что твой плавный пуск в разомкнутом контуре вообще не прошел проверку на «токовый стресс».
Сразу отвечу на твои три вопроса:
-
На холостом ходу работает, а при 20 Ом взрывается, потому что при пуске под нагрузкой ток дросселя = ток заряда выходного конденсатора + ток нагрузки. На холостом ходу дросселю нужно только заряжать конденсатор, ток небольшой; при нагрузке 20 Ом (1.5 А) при том же шаге коэффициента заполнения дросселю нужно дополнительно выдерживать эту постоянную составляющую в 1.5 А, и пиковый ток легко пробивает точку насыщения твоего дросселя в 12 А. Как только дроссель насыщается, он превращается в кусок провода, 58 В напрямую ложатся на Rds(on) MOSFET-а и сопротивление дорожек, ток мгновенно достигает десятков ампер. Твой «поэлементный токовый лимит» либо имеет неправильную точку измерения, либо скорость отклика не успевает за скоростью нарастания тока после насыщения, и он тебя вообще не спасает.
-
Код тот же, но режимы работы кардинально отличаются. Разомкнутая система управления — это слепец, ей плевать, холостой ход сзади или полная нагрузка, она толкает коэффициент заполнения фиксированными шагами. Пуск на холостом ходу — это «прогулка», пуск под нагрузкой — «подъем в гору с грузом», ты заставляешь схему бежать в одном и том же темпе, пиковый ток дросселя под нагрузкой может быть в несколько раз больше, чем на холостом ходу, неудивительно, что она взрывается.
-
Уменьшение выходного конденсатора действительно может временно спасти от взрыва, потому что в момент пуска требуется меньший заряд, пиковый ток дросселя снижается, и он остается дальше от точки насыщения. Но это лишь самообман — ты же не будешь в будущем продукте использовать только маленькие конденсаторы? Коренная причина в том, что в твоей системе управления нет ограничения тока. Следующий шаг — не играться с конденсаторами, а немедленно впаять последовательно с дросселем шунтовый резистор (или использовать токовый щуп) и с помощью осциллографа снять осциллограмму тока при пуске под нагрузкой, чтобы посмотреть, до какого значения реально доходит пик.
Конкретный анализ и рекомендации:
Сейчас ты, по сути, работаешь «наполовину голым» — есть аппаратная OCP, но нет замкнутого токового контура, шаг плавного пуска 0.001 звучит мягко, но при пуске с большим конденсатором + нагрузкой пиковый ток дросселя уже давно превышает 12 А. CSD19534Q5A хоть и выдерживает импульсный ток 100 А, но это при условии, что дроссель не насыщен, а ток контролируется. Как только дроссель насыщается, ток выходит из-под контроля, и транзистор за несколько микросекунд проплавляет кремний, замыкая GDS накоротко.
Почему вылетает только сторона Buck?
В режиме Buck верхний ключ Buck является главным ключом, который напрямую сталкивается с 58 В входного напряжения и «почти коротким замыканием» насыщенного дросселя. Верхний ключ стороны Boost постоянно открыт, через него протекает только относительно стабильный ток нагрузки, у него нет такого двойного дебаффа, как у верхнего ключа Buck: жесткое высокочастотное переключение + удар от насыщения. Энергия идет со входа, верхний ключ Buck — первая преграда, совершенно нормально, что он умирает первым.
Что делать дальше (по приоритету):
-
Сними осциллограмму, чтобы подтвердить причину смерти: верни выходной конденсатор обратно на 470 мкФ, нагрузи на 20 Ом, впаяй последовательно с дросселем шунт 0.1 Ом (или используй токовый щуп) и посмотри пусковой ток осциллографом. Спорим, пусковой пик превысит 15 А. Если после уменьшения конденсатора пик упадет до 10 А и пуск пройдет нормально, это подтвердит, что транзистор взорвался из-за насыщения пусковым током.
-
Проверь свою аппаратную OCP: где находится точка измерения для поэлементного ограничения тока? Если измеряется ток нижнего ключа Buck (в период протекания), то ты вообще не видишь токовый пик во время открытия верхнего ключа, и есть мертвая зона длительностью как минимум в один коммутационный период. Насыщение дросселя часто происходит именно при открытом верхнем ключе, и к моменту, когда при открытом нижнем ключе будет обнаружена перегрузка по току, верхний ключ уже превратится в шлак. Рекомендации:
- Установи предел ограничения тока на 8~9 А (оставь запас более 3 А, не ставь вплотную к 12 А)
- Убедись, что общая задержка от обнаружения перегрузки до отключения PWM составляет < 500 нс
- Если используется измерение на нижнем плече (low-side), подумай о переходе на измерение на шине или на верхнем плече дросселя (high-side), или, как минимум, добавь компаратор для аппаратного быстрого отключения
-
Хватит упорствовать с разомкнутым контуром: ты уже дважды доказал, что пуск под нагрузкой без обратной связи нежизнеспособен. Срочно добавляй внутренний токовый контур, пусть даже в виде самого примитивного ограничения пикового тока — добавь ограничитель после выхода контура напряжения, зафиксируй уставку по току в пределах 10 А, а при превышении сразу руби PWM. Это работает лучше, чем любой шаг плавного пуска. Двойной замкнутый контур (внешний по напряжению + внутренний по току) — это минимум для Buck-Boost, а не опция.
-
Дроссель уже убит: ты говоришь, на дросселе есть следы подгорания, значит, этот дроссель уже ненадежен. У кольцевого сердечника из алсифера (Fe-Si-Al) после глубокого насыщения магнитная проницаемость необратимо падает, и в следующий раз он может насытиться уже при 8 А. Рекомендую заменить дроссель на такой, у которого ток насыщения более 20 А, или хотя бы поставить новый того же типа. Не экономь на этом, очередной взорвавшийся MOSFET обойдется дороже.
-
Выходной конденсатор можно увеличить, но при пуске обязательно нужно ограничивать ток: большие конденсаторы — не проблема, но при пуске они должны заряжаться постоянным током. Во всех зрелых решениях сначала ограничивают ток дросселя (например, до 5 А), а когда выходное напряжение достигает целевого значения, переключаются на замкнутый контур постоянного напряжения. Твой текущий плавный пуск без ОС по сути является «слепым тыканьем с постоянным коэффициентом заполнения»: угадал — выжил, переборщил — взорвался.
Итог: уменьшение выходного конденсатора позволит тебе временно запустить схему для экспериментов, но пока ты используешь разомкнутый контур + пуск с большой нагрузкой, взрыв транзистора — лишь вопрос времени. Самое срочное — снять осциллограмму тока, чтобы подтвердить точку насыщения, а затем внедрить внутренний токовый контур. Не зацикливайся на емкости конденсатора, это лишь симптом, а отсутствие звена в системе управления — корень проблемы.
Я переделал плату, и в итоге SW-пин на buck-стороне стал вот таким (желтая линия). Я еще раз проверил осциллограмму драйвера верхнего ключа (красная линия), что мне нужно изменить? Бутстрепный конденсатор? Или что-то еще? В прошлых ревизиях такой проблемы не было, из-за чего она могла возникнуть?
Что изменили?
Посмотри на макет
На обратной стороне находится MOS-драйвер, я заменил резистор на 8R, но ситуация не изменилась (до этого я использовал 4R)
RC-цепочка и диод, подключенные параллельно MOSFET, не запаяны
Первая — моя принципиальная схема, вторая — осциллограмма VS со стороны BUCK-преобразователя относительно земли и тока дросселя при тестировании на напряжении выше 20 В, третья — увеличенный фрагмент второй, четвертая — VS и ток дросселя при напряжении ниже 20 В. Мой ШИМ — 100 кГц, фиксированный коэффициент заполнения 0,5.
-
Почему увеличение входного напряжения приводит к снижению частоты пульсаций тока дросселя, и почему при втором открытии MOSFET на VS возникает сигнал в виде острых пиков, а не прямоугольный импульс?
-
Как мне решить эту проблему?
Подскажите, в режиме постоянного напряжения при выходе 5 В: если электронная нагрузка выключена, выходное напряжение равно 5 В; при установке тока нагрузки 0,5 А электронная нагрузка показывает выходное напряжение 4,91 В; при токе 1,5 А — 4,74 В; при токе 2,5 А — 4,56 В. Но во всех этих случаях выходное напряжение, измеряемое микроконтроллером, всегда равно 5 В. В чем может быть причина?
Падение напряжения из-за потерь в линии. Не слишком ли тонкие провода, которыми ты подключаешь электронную нагрузку?
Действительно, это связано с потерями в линии. Я использую провод сечением 14 AWG. Судя по видео с вашей демонстрацией, кажется, в вашем случае потери в линии никак не повлияли. Как вы этого добились?
Тогда проверь, не падает ли напряжение на клеммной колодке платы питания.
Дружище, глянул твои принципиальные схемы и осциллограммы. Это явление — просто классика при разработке цифровых источников питания на STM32 (особенно если собираешь дискретный драйвер для Buck-Boost сам).
Раз ты захардкодил в прошивке фиксированный коэффициент заполнения ШИМ 50% (0.5), то теоретически МК должен железно выдавать меандр с равной шириной импульса. То, что ты видишь на рис. 3 (>20В) — «один широкий, один узкий», «сбой частоты пульсаций тока дросселя (Pulse Skipping / чередование больших и малых импульсов)» и «появление ультраузких выбросов на узле VS», по сути означает, что управляющий сигнал в этом цикле был аварийно прерван.
Опираясь на свой опыт, помогу тебе разобрать причины и пути решения:
1. Почему это явление возникает при повышении напряжения?
При повышении входного напряжения с <20В до >20В самое наглядное изменение — значительное увеличение dv/dt и di/dt при коммутации транзисторов, что влечет за собой несколько фатальных последствий:
-
Помехи / Ground Bounce (дрожание земли) приводят к сбоям логики МК или драйвера: С ростом напряжения высокочастотные помехи (EMI) в момент коммутации усиливаются. Эти помехи легко наводятся на ШИМ-дорожки МК или вызывают сильные колебания потенциала опорной земли. Если на логическом входе драйвера считывается глитч, или таймер микроконтроллера подвергается воздействию помехи, это приводит к преждевременному отключению ШИМ, который должен был длиться полпериода, и вы получаете тот самый «выброс».
-
Сбой бутстрап-цепи или чрезмерное отрицательное напряжение на VS: На твоей схеме используется драйвер верхнего и нижнего ключей с бутстрап-конденсаторами (С25, С27, судя по всему, 100 нФ). При повышении напряжения во время мертвого времени ток дросселя продолжает течь, что вызывает глубокий отрицательный звон на узле VS (ниже PGND). Если просадка ниже нуля слишком глубока, она мгновенно высосет заряд из бутстрап-конденсатора или вызовет срабатывание внутренней защиты драйвера от пониженного напряжения (UVLO). Как только бутстрап-напряжение проседает, верхний ключ сразу же отключается, что и выглядит как ультраузкий выброс.
-
Ложное срабатывание аппаратной защиты (если она есть): Если на твоей плате есть аппаратная защита от перегрузки по току или компаратор на ОУ, основанный на считывании тока (например, резисторы R27, R28 номиналом 5 мОм на схеме), то при повышении напряжения «выброс на фронте (Leading Edge Spike)» в момент коммутации тоже увеличивается. Это запросто может вызвать ложное переключение компаратора, который принудительно обрежет текущий ШИМ-импульс.
-
Дроссель приближается к насыщению: Хотя это и не главная причина, повышение напряжения приводит к росту пикового тока. Если запас по току дросселя недостаточен, скачок тока с сопутствующими выбросами только усилит описанные выше шумовые помехи.
2. Как решить проблему и провести диагностику?
Не спеши кардинально переделывать плату. При поиске багов в цифровых источниках питания важно действовать методично («идти по следу»), рекомендую придерживаться следующих шагов:
Шаг 1: Вычисляем «виновника» (самое важное!)
Сейчас ты измеряешь только узел VS. Тебе нужно взять двухканальный осциллограф и одновременно измерить выходной вывод ШИМ STM32 и узел VS (или затвор (Gate) верхнего ключа).
-
Случай А: Если на выводе микроконтроллера осциллограмма уже представляет собой чередование широких и узких импульсов (полный хаос), значит, силовая часть дает помехи на МК. Тебе нужно проверить, насколько стабильно питание STM32, правильно ли разведены земли сильноточной и слаботочной частей (соединены ли они в одной точке), или попробовать добавить небольшой RC-фильтр на дорожку ШИМ поближе к драйверу (например, резистор в несколько десятков Ом последовательно и конденсатор 22 пФ на землю).
-
Случай Б: Если на выводе микроконтроллера идеальный меандр 50%, а на узле VS всё равно выбросы, значит, проблема в драйвере, и нужно переходить к шагу 2.
Шаг 2: Оптимизация драйвера
Если проблема кроется в драйвере, скорее всего, она вызвана бутстрапом или слишком высокой скоростью коммутации:
-
Увеличить бутстрап-конденсатор: У тебя стоят С25 и С27 по 100 нФ, при частоте 100 кГц под большой нагрузкой или высоким напряжением этого может не хватать. Рекомендую поставить параллельно MLCC на 1 мкФ, чтобы у верхнего ключа было достаточно заряда для поддержания открытого состояния.
-
Подавить звон в коммутационном узле (важно!): Увеличь масштаб осциллограммы и посмотри на спадающий фронт: не уходит ли узел VS в -2В или еще ниже? Если да, рекомендую поставить RC-снаббер (RC-демпфер) между VS1 и землей, а также между VS2 и землей — например, последовательно резистор в несколько Ом и конденсатор в несколько сотен пФ, чтобы погасить звон.
-
Немного снизить скорость коммутации: Можно поставить небольшой резистор последовательно с затвором (Gate) верхнего ключа (если есть место, судя по схеме там напрямую). Чуть пожертвуй потерями на коммутацию, снизь dv/dt, и система станет намного стабильнее.
-
Проверь обратное восстановление диода: В качестве бутстрап-диодов у тебя стоят SS14 (диоды Шоттки) на 40В. При входном напряжении >20В с учетом звона запаса по обратному напряжению может не хватить. Рекомендую заменить их на диоды с более высоким пробивным напряжением и ультрабыстрым восстановлением, а также добавить последовательно резистор примерно на 2.2 Ом для ограничения пикового зарядного тока.
Для начала померяй ШИМ прямо на ноге микроконтроллера — определи, то ли источник гонит помехи, то ли драйвер не справляется, и тогда уже сможешь действовать точечно. Удачи в отладке!
Посмотрел твои осциллограммы и схему, это явление довольно типичное, главная причина в том, что при повышении входного напряжения дроссель перешел в режим прерывистого тока (DCM).
1. Почему при увеличении входного напряжения «уменьшается частота» пульсаций, а при втором открытии VS наблюдается острый импульс, а не прямоугольный сигнал?
Частота ШИМ на самом деле не изменилась и составляет те же 100 кГц, это просто визуальный эффект, вызванный искажением формы сигнала тока.
Сейчас у тебя разомкнутый контур с фиксированным коэффициентом заполнения 50%, в чистом режиме Buck выходное напряжение примерно равно половине входного. При повышении входного напряжения пульсация тока дросселя ΔI = (Vin-Vout)×D/(L×f) линейно возрастает. Когда размах пульсаций превышает двойной средний выходной ток, провал тока опускается до 0, и происходит переход из CCM в DCM.
После перехода в DCM:
- На этапе закрытия ток дросселя рано падает до 0, диод свободного хода запирается, узел VS переходит в высокоимпедансное состояние, и в нем возникают свободные колебания паразитного LC-контура, поэтому напряжение больше не фиксируется на уровне прямоугольного сигнала.
- В следующем цикле при повторном открытии MOSFET ток дросселя равен 0, что означает жесткую коммутацию — MOSFET напрямую заряжает и разряжает паразитную емкость узла коммутации, скорость нарастания тока di/dt получается очень большой, что выбивает острый импульс напряжения. Но поскольку непрерывный ток дросселя отсутствует, выброс быстро спадает, поэтому он выглядит как узкий импульс, а не как прямоугольная площадка.
- Так называемое «уменьшение частоты пульсаций» на самом деле возникает из-за того, что ток большую часть цикла находится на нуле (с небольшими колебаниями от резонанса), а полезная треугольная волна занимает лишь небольшой участок, визуально создавая впечатление снижения частоты; в серьезных случаях также может возникнуть явление пропуска импульсов, когда энергия передается только через такт.
Кроме того, у тебя используется верхний NMOS с бутстрап-драйвером, в режиме DCM потенциал VS долго не опускается к земле, бутстрап-конденсатор C7 не заряжается, драйверная способность падает, и форма сигнала открытия будет только ухудшаться — на твоей схеме у C7 указано 100 пФ, это тоже слишком мало, бутстрап-конденсаторы обычно начинаются от сотен нФ.
2. Как решить проблему?
Несколько направлений, в порядке приоритета:
① Вернуться в CCM (устранение причины)
- Поставить дроссель большей индуктивности: рассчитай по максимальному входному напряжению, чтобы размах пульсаций не превышал 30%~40% от среднего тока, заложи достаточный запас. Это самый прямой метод.
- Увеличить нагрузку: повысь средний выходной ток, чтобы «поднять» минимум тока от нулевой отметки, это позволит быстро проверить, заключается ли проблема в DCM.
- Снижение частоты коммутации также может уменьшить пульсации, но 100 кГц — вполне разумное значение, не стоит пытаться решить проблему изменением частоты.
② Подавление выбросов и звона (снижение нагрузок и улучшение ЭМС)
- Добавь RCD-снаббер (например, резистор 100 Ом + конденсатор 1 нФ + диод с быстрым восстановлением) между узлом VS и землей, либо простой RC-снаббер (десятки Ом + сотни пФ), это позволит заметно подавить выбросы и звон.
- При разводке постарайся максимально уменьшить площадь меди узла коммутации, сделай путь драйверной петли как можно короче, чтобы уменьшить паразитные параметры.
③ Улучшение способа управления
- Разомкнутый контур с фиксированным коэффициентом заполнения сам по себе не очень подходит для такой топологии, как Buck-Boost. Рекомендую перейти на замкнутый контур по напряжению, чтобы коэффициент заполнения автоматически регулировался при изменении входного напряжения; это позволит и стабилизировать напряжение, и смягчить проблему DCM.
- Если обязательно нужно работать в разомкнутом контуре, тогда пересчитай параметры дросселя по максимальному входному напряжению, чтобы гарантировать работу в CCM во всем диапазоне.
Подводя итог: суть в том, что при высоком напряжении и легкой нагрузке схема падает в DCM, а выбросы — это результат жесткой коммутации при нулевом токе. Можешь для начала временно подключить тяжелую нагрузку и попробовать; если осциллограмма вернется к прямоугольному сигналу + треугольной волне, как при низком напряжении, значит, это точно проблема DCM, и дальше достаточно будет поставить дроссель большей индуктивности.
По измерениям мультиметром напряжение тоже проседает, это не ровно 5В. Но сопротивление провода, измеренное мультиметром, около 180 мОм, что сходится с величиной просадки напряжения при увеличении тока.










