Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не работает Dead time в stm32f4 должным образом.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
sidy
Господа, добрый день.
Возникла проблема. Есть ШИМ частотой 5 кГц для управления транзисторным модулем для формирования синусоиды 50 Гц. С мертвым временем 5 мкс.
Получается что при выдаче ШИМа в комплиментарные выходы таймера TIM1 значения ШИМа вырождаются в постоянный сигнал,
Нажмите для просмотра прикрепленного файла
если они меньше мертвого времени и соответственно искажается синусоидальный сигнал.
Нажмите для просмотра прикрепленного файла
Т.е. получается что у STM32 нет минимального значения мертвого времени?
(Для примера привожу синусоиду сформированную без мертвого времени - искажений нет)
Нажмите для просмотра прикрепленного файла
Как же тогда с этим работать?
Timmy
По-моему, совершенно естественно, что если ставить ontime < deadtime, то deadtime полностью перекроет ontime, и неинверсный выход таймера включаться не будет. А как по-вашему, должен работать таймер?
sidy
Цитата(Timmy @ Nov 7 2017, 10:42) *
По-моему, совершенно естественно, что если ставить ontime < deadtime, то deadtime полностью перекроет ontime, и неинверсный выход таймера включаться не будет. А как по-вашему, должен работать таймер?

По моему должно сохраняться минимальное мертвое время. В противном случае не будет симметрии в сигнале.
dac
QUOTE (sidy @ Nov 7 2017, 18:53) *
По моему должно сохраняться минимальное мертвое время. В противном случае не будет симметрии в сигнале.

center aligned?
amaora
Цитата(sidy @ Nov 7 2017, 15:53) *
По моему должно сохраняться минимальное мертвое время. В противном случае не будет симметрии в сигнале.

Что значит "должно сохраняться минимальное мертвое время"? Ограничить заполнение так чтобы не задавать длительность импульса меньше DT, не подойдет?
serglg
Цитата(amaora @ Nov 8 2017, 02:48) *
Что значит "должно сохраняться минимальное мертвое время"? Ограничить заполнение так чтобы не задавать длительность импульса меньше DT, не подойдет?


Действительно, лично у меня всегда в стоит везде такое ограничение - как сверху, так и снизу.
Если DT=20, то при ШИМе импульс не короче 25 и не длиньше PERIOD-25.
sidy
Вернулся опять к данному вопросу. И выяснил что искажения выходной синусоиды происходят и в тех случаях когда мертвое время не превышает период ШИМа.
Вот формирование таблицы синуса:
for(i=0; i<SIZE; i++) {PWM_Tab[i]=sinf(6.283185f*i/SIZE);}
Вот вывод синуса в таймер:
Ampl=(TIM1->ARR)>>1;
TIM1->CCR1=TIM1->ARR-((Ampl)+K_A*(Ampl)*(PWM_Tab[iA])); iA++; if(iA>=SIZE) iA=0;
AVI-crak
Слишком долго считает.
Регистры TIM1->CCR1 не имеют теневых аналогов как у TIM1->ARR, записанное в них значение сразу начинает сравниваться.
Но выход есть, завести статическую переменную, в которую считать новое значение, и при прерывании переполнения (не сравнения!!!) - записывать в регистр значение статической переменной. Получится минимальная задержка обновления, и стабильная задержка на один отчёт - которую уже можно компенсировать.
sidy
Цитата(AVI-crak @ Nov 28 2017, 17:14) *
Слишком долго считает.
Регистры TIM1->CCR1 не имеют теневых аналогов как у TIM1->ARR, записанное в них значение сразу начинает сравниваться.
Но выход есть, завести статическую переменную, в которую считать новое значение, и при прерывании переполнения (не сравнения!!!) - записывать в регистр значение статической переменной. Получится минимальная задержка обновления, и стабильная задержка на один отчёт - которую уже можно компенсировать.

Частота переполнения таймера 5 кГц, соответственно и TIM1>CCR1 обновляется с такой же частотой.
SSerge
Цитата(AVI-crak @ Nov 28 2017, 21:14) *
Слишком долго считает.
Регистры TIM1->CCR1 не имеют теневых аналогов как у TIM1->ARR, записанное в них значение сразу начинает сравниваться.

Однако, есть. За это отвечают биты OCxPE в регистрах TIM1->CCMRx.
serglg
Цитата(AVI-crak @ Nov 28 2017, 20:14) *
Слишком долго считает.
Регистры TIM1->CCR1 не имеют теневых аналогов как у TIM1->ARR, записанное в них значение сразу начинает сравниваться.
Но выход есть, завести статическую переменную, в которую считать новое значение, и при прерывании переполнения (не сравнения!!!) - записывать в регистр значение статической переменной. Получится минимальная задержка обновления, и стабильная задержка на один отчёт - которую уже можно компенсировать.


Лично у меня так и делается. Есть переменная, которую гружу непосредственно в TIM1->CCR1
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.