Тёмный
No video :(

Двухтактный (Push-pull) ШИМ STM32 

Паяльник в голове
Подписаться 1,7 тыс.
Просмотров 3 тыс.
50% 1

В этом видео я расскажу как сформировать ШИМ сигнал для двухтактных преобразователей push-pull, полумост (half-bridge), полный мост (full-bridge) в микроконтроллере STM32. Этот метод может быть использован для сдвинутых на произвольную фазу ШИМ сигналов, например многофазных step-down преобразователей. При этом для повышения разрядности ШИМ можно использовать DMA.

Опубликовано:

 

26 авг 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 41   
@nickolaysosnitsky3420
@nickolaysosnitsky3420 2 года назад
Очень интересно! С нетерпением ждём продолжения.
@Vellins
@Vellins 2 года назад
Огромное спасибо за видео! Отличная подача материала!
@user-wn1cm3mb6d
@user-wn1cm3mb6d Год назад
О чудо! Старуха 494 это умеет без прошивок 😁
@emmett980
@emmett980 Год назад
А как в процессе работы поменять частоту на обоих таймерах одновременно без рассинхрона (прерывания на перезагрузку как-то дорого по времени процессора), может же случиться так что один таймер во время изменения частоты уже досчитает до конца и перегрузиться когда второй установиться, к примеру раз в мс надо менять частоту плавно и непрерывно, в итоге будет происходить рассинхрон на 1, или 2 такта, но в долгой работе это может стать критично
@payalnik-v-golove
@payalnik-v-golove Год назад
Таймеры нужно запустить одновременно в STM есть такая возможность т.е. такт в такт. При инициализации таймера включить буферизацию регистра ARR и он будет обновляться только при обновлении таймера независимо от времени записи ну и записывать новую частоту сразу после обновления т.е. перед записью ожидать флага обновления таймера
@user-yt1td7qo4q
@user-yt1td7qo4q Год назад
А чем лучше специальных шим контроллеров?
@payalnik-v-golove
@payalnik-v-golove Год назад
проще реализовать нетрадиционные алгоритмы. Например если нужен реверс. Или например нужен не регулируемый преобразователь и в схеме уже есть МК. Кроме того выбор двухтактных шим контроллеров не велик их по сути всего 3 модели tl494, sg3525 и uc3825 и все много потребляют и требуют порядка 12В.
@victorlowlevel8063
@victorlowlevel8063 Год назад
А нельзя ли сделать на одном таймере в режиме BURST на одном канале DMA? Формируя скважности через 1? Первый тик давать скважность в OCR1, а в OCR2 давать ноль... Следующий тик давать в OCR2 скважность, а в OCR1 давать ноль? Или может два буфера DMA, по одному на каждый канал с пропусками скважности и сдвигом второго массива скважностей для второго кансла... Подробностей не помню просто можно ли так сделать. Но зато возможно получится экономия таймера. Скорее всего возможно так сделать! Суть в том чтобы в разные каналы давать нулевую скважность или требуемую через один, инвертируя для второго канала.
@payalnik-v-golove
@payalnik-v-golove Год назад
да в новой версии STM32 есть режим burst в котором можно записывать сразу несколько регистров таймера, этот режим удобно использовать и для частотной модуляции, например в LLC резонансном преобразователе где постоянное заполнение ШИМ и переменная частота. Я планировал сделать видео про этот режим, но как-то руки не дошли. Кроме того в последствии я понял, что нужные мне задачи обычным STM32 не выполнить, нужно использовать или STM32F334 или G474 с таймером HRTIM и встроенным FPU . На эту тему планирую цикл видео. Пока в части расчета аналоговых и цифровых регуляторов сделал небольшие письменные материалы, которые выложил на радиокоте radiokot.ru/forum/viewtopic.php?f=11&t=184740
@victorlowlevel8063
@victorlowlevel8063 Год назад
@@payalnik-v-golove А два канала DMA нельзя использовать для OCR1 и OCR2 в обычных M3 камнях? Там же можно настроить вроде по каналу DMA на каждый канал таймера! Тока что в кубе глянул. Определить два массива PWM_CH1[ ]={300,0}; PWM_CH2[ ]={0,300}; - скормить DMA и запустить циркуляр... Тока релоад таймера в два раза чаще должен быть для нужной частоты... преобразователя. Суть в том, что освобождается таймер и отпадает нужда в синхронизации и лучший контроль
@payalnik-v-golove
@payalnik-v-golove Год назад
@@victorlowlevel8063 можно конечно , я же этот метод и описал в видео. Или нет ?
@victorlowlevel8063
@victorlowlevel8063 Год назад
@@payalnik-v-golove Ну я понял что тут два таймера используются - вы же сделали их мастер-слейв! А я предложил использовать один таймер! Именно для двухтактного режима!
@payalnik-v-golove
@payalnik-v-golove Год назад
@@victorlowlevel8063 как Вы в старой версии STM32 сделаете на одном таймере фазовый сдвиг между каналами ? В новой версии есть режим комбинированного ШИМ и там так можно сделать.
@user-bi4ve1id8y
@user-bi4ve1id8y Год назад
Невозможно прочитать текст на экране, не могли бы Вы выкладывать ссылку на текст программы и её описания.
@payalnik-v-golove
@payalnik-v-golove Год назад
// пример под stm32g030k6 RCC->APBENR1 |= RCC_APBENR1_TIM3EN; RCC->APBENR2 |= RCC_APBENR2_TIM1EN; // CH1 CH3 - PWM Mode 1, CH2 PWM Mode 2 TIM1->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_0; TIM1->CCMR2 = TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1; // Разрешаем работу выхода ШИМ CH1 и CH3 TIM1->CCER = (TIM_CCER_CC1E | TIM_CCER_CC3E); // Частота ШИМ 40кГц TIM1->ARR = 1599; // Общее разрешение выходов ШИМ TIM1->BDTR = TIM_BDTR_MOE; // Режим мастер, формирование TRGO по OC2REFC TIM1->CR2 = TIM_CR2_MMS_0 | TIM_CR2_MMS_2; // Запрос в DMA по Updata TIM1->DIER = TIM_DIER_UDE; // фазовый сдвиг TIM1->CCR2 = 798; // начальные значения TIM1->CCR1 = 100; TIM1->CCR3 = 100; // CH2 CH4 - PWM Mode 1, CH2 PWM Mode 2 TIM3->CCMR1 = TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1; TIM3->CCMR2 = TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4M_1; // Разрешаем работу выхода ШИМ CH2 и CH4 TIM3->CCER = (TIM_CCER_CC2E | TIM_CCER_CC4E); // Частота ШИМ 40кГц TIM3->ARR = 1599; // Общее разрешение выходов ШИМ TIM3->BDTR = TIM_BDTR_MOE; // Бит MSM - разрешение синхронизации, биты TS - значение 0 ITR0 (TIM1), биты SMS - значение 0110 запуск по TRGO TIM3->SMCR = TIM_SMCR_MSM | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_2; // Запрос в DMA по Updata TIM3->DIER = TIM_DIER_UDE; // начальные значения TIM3->CCR2 = 100; TIM3->CCR4 = 100; TIM3->CR1 = (TIM_CR1_ARPE); TIM1->CR1 = (TIM_CR1_CEN | TIM_CR1_ARPE); // ----- DMA Init ----- // RCC->AHBENR |= RCC_AHBENR_DMA1EN; // TIM1_CH1 DMA1_Channel1->CCR = 0; DMA1_Channel1->CNDTR = 6; DMA1_Channel1->CPAR = (uint32_t)(&TIM1->CCR1); DMA1_Channel1->CMAR = (uint32_t)&TimDmaBuf; // 16 bit Memory DMA1_Channel1->CCR = DMA_CCR_MSIZE_0; // 16 bit Tim DMA1_Channel1->CCR |= DMA_CCR_PSIZE_0; // Memory ++ DMA1_Channel1->CCR |= DMA_CCR_MINC; // Circular mode DMA1_Channel1->CCR |= DMA_CCR_CIRC; DMA1_Channel1->CCR |= DMA_CCR_DIR; // TIM1 Updata DMAMUX1_Channel0->CCR = 25; // On DMA1->IFCR = 0xf; DMA1_Channel1->CCR |= DMA_CCR_EN; // TIM3_CH2 DMA1_Channel2->CCR = 0; DMA1_Channel2->CNDTR = 6; DMA1_Channel2->CPAR = (uint32_t)(&TIM3->CCR2); DMA1_Channel2->CMAR = (uint32_t)&TimDmaBuf; // 16 bit Memory DMA1_Channel2->CCR = DMA_CCR_MSIZE_0; // 16 bit Tim DMA1_Channel2->CCR |= DMA_CCR_PSIZE_0; // Memory ++ DMA1_Channel2->CCR |= DMA_CCR_MINC; // Circular mode DMA1_Channel2->CCR |= DMA_CCR_CIRC; DMA1_Channel2->CCR |= DMA_CCR_DIR; // TIM3 Updata DMAMUX1_Channel1->CCR = 37; // On DMA1->IFCR = 0xf; DMA1_Channel2->CCR |= DMA_CCR_EN;
@NoviSavvy
@NoviSavvy 10 месяцев назад
@@payalnik-v-golove а как сконфигурировать CubeMX под это? Очень много ошибок выдаёт из за него
@user-vd8gy1kw1y
@user-vd8gy1kw1y 2 года назад
Зависнет эта стм и преобразователю кирдык. Плис лучше использовать.
@payalnik-v-golove
@payalnik-v-golove 2 года назад
микроконтроллер это по сути та же плис. у всего свои задачи, на плис Вы замаетесь делать полноценное устройство, все равно будет нужен внешний МК. если делать все прямыми руками, то ничего не зависнет. и кстати на плис разрешение ШИМ ограничено частотой его такта, у МК за счет ДМА можно разрешение можно повысить. Ну и в МК есть встроенные средства обработки аварийных ситуаций даже на случай пропадания такта, ну а в плис этого нет. В этом плане надежность плис ниже.
@user-vd8gy1kw1y
@user-vd8gy1kw1y 2 года назад
@@payalnik-v-golove Как встроенными средствами МК железно ограничить максимальную длительность импульса, подаваемого на электронные ключи при пропадании тактовой частоты?
@payalnik-v-golove
@payalnik-v-golove 2 года назад
@@user-vd8gy1kw1y в новых сериях STM32 система тактирования при сбое формирует сигнал break, который асинхронно переводит выходы в заданное состояние: 0, 1 или Z. Ну и не нужно забывать про внешний вход break он также может по сигналу компаратора асинхронно т.е. независимо от системы тактирования перевести выводы в заданное состояние, понятно что для этого должна быть внешняя система компаратор+шунт, которые стоят не так много и если есть задача сделать максимально надежно, то так и делают. многие тысячи преобразователей частоты и пр. силовых преобразователей работают даже на примитивных МК где нет подобных систем защиты. А плис для силовых преобразователей плохо подходит, я не так давно прорабатывал этот момент. На сегодня более всего подходит серия STM32G4 с таймеров высокого разрешения, но в плане защиты у нее недостаток в том что нет внешнего выхода асинхронной аварии как у обычного таймера. Но новые серии STM32 даже совсем дешевые модели на 40-50 руб. за счет DMA и обновленных таймеров позволяют сделать почти любой dc-dc , я рассказал пока лишь об одном варианте и со временем буду дополнять.
@RogovAB
@RogovAB 2 года назад
Это все мифы от людей, которые сами никогда не делали преобразователи на контроллерах. Зависнет, пропадет частота... это все бред. Но тут в ролике тоже ежа с ужом скрещивает автор. Такая реализация чисто учебная, ибо нет ни дедтаймов, ни нормального останова и т.д. Нужно выбирать контроллер под задачу, а не колхозить.
@payalnik-v-golove
@payalnik-v-golove 2 года назад
@@RogovAB в чем колхоз ? И причем тут дел таймы , в пуш пуш ограничевается максимальное заполнение и все. Какой который ШИМ контроллер сделает мне двунаправленный преобразователь ?
@user-um3kk6kz9c
@user-um3kk6kz9c 2 года назад
Так же жду продолжения !!! ))) Сам строю мощный импульсный блок питания (правда пока в стадии проекта и подбора комплектующих)... Я понимаю что можно без проблем приобрести нужную мне версию вольтаж/ампераж, и есть свободные средства... Но нет, я строю своё !!! )))
@payalnik-v-golove
@payalnik-v-golove 2 года назад
у меня этот проект немного буксует, плату почти нарисовал, но задумался над внешним АЦП по результатам отладки других проектов. Сам проект будет очень объемный и готовых решений тут нет. Какие аспекты хотели бы чтобы я осветил в продолжении ? PS были мысли сделать видео как моделить импульсный БП в Matlab, цифровые регуляторы и пр. но не уверен что кто-то что-то поймет. тема сложная и я не очень умею понятно объяснять :-)
@user-um3kk6kz9c
@user-um3kk6kz9c 2 года назад
@@payalnik-v-golove конкретно у меня мысли о "стандартном" контроллере 494 или 594 как в первичном БП, так и во вторичном ДСДС регулируемом преобразователе. Управление хочу построить на СТМ32 в паре с сенсорным 5 или 7 дюймовом дисплеем, грубо говоря на мордочке устройства две кнопки, энкодер, порты и дисплей. Планируется 80 В и минимум 25, а лучше 35 А. Вариант мост с APFC.
@user-um3kk6kz9c
@user-um3kk6kz9c 2 года назад
@@payalnik-v-golove аспекты в продолжении... Почему полноценный МК ? Чем он лучше/хуже того же "стандартизированного" 494 например или подобных.
@payalnik-v-golove
@payalnik-v-golove 2 года назад
@@user-um3kk6kz9c в видео говорил у меня синхронное выпрямление по вторичной стороне, кроме того мне нужно сделать его двунаправленным т.е. чтобы умел качать энергию в обе стороны. На TL494 такое сделать проблема
Далее
Конденсаторы в ИИП
31:42
Просмотров 2,4 тыс.
Эффект Холла Часть 1
4:48
Просмотров 6 тыс.
один виток..
2:11
Просмотров 19 тыс.