Перейти к содержанию
    

Не работает Dead time в stm32f4 должным образом.

Господа, добрый день.

Возникла проблема. Есть ШИМ частотой 5 кГц для управления транзисторным модулем для формирования синусоиды 50 Гц. С мертвым временем 5 мкс.

Получается что при выдаче ШИМа в комплиментарные выходы таймера TIM1 значения ШИМа вырождаются в постоянный сигнал,

post-41333-1509726287_thumb.jpg

если они меньше мертвого времени и соответственно искажается синусоидальный сигнал.

post-41333-1509726340_thumb.jpg

Т.е. получается что у STM32 нет минимального значения мертвого времени?

(Для примера привожу синусоиду сформированную без мертвого времени - искажений нет)

post-41333-1509726317_thumb.jpg

Как же тогда с этим работать?

Изменено пользователем sidy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По-моему, совершенно естественно, что если ставить ontime < deadtime, то deadtime полностью перекроет ontime, и неинверсный выход таймера включаться не будет. А как по-вашему, должен работать таймер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По-моему, совершенно естественно, что если ставить ontime < deadtime, то deadtime полностью перекроет ontime, и неинверсный выход таймера включаться не будет. А как по-вашему, должен работать таймер?

По моему должно сохраняться минимальное мертвое время. В противном случае не будет симметрии в сигнале.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По моему должно сохраняться минимальное мертвое время. В противном случае не будет симметрии в сигнале.

center aligned?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По моему должно сохраняться минимальное мертвое время. В противном случае не будет симметрии в сигнале.

Что значит "должно сохраняться минимальное мертвое время"? Ограничить заполнение так чтобы не задавать длительность импульса меньше DT, не подойдет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что значит "должно сохраняться минимальное мертвое время"? Ограничить заполнение так чтобы не задавать длительность импульса меньше DT, не подойдет?

 

Действительно, лично у меня всегда в стоит везде такое ограничение - как сверху, так и снизу.

Если DT=20, то при ШИМе импульс не короче 25 и не длиньше PERIOD-25.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вернулся опять к данному вопросу. И выяснил что искажения выходной синусоиды происходят и в тех случаях когда мертвое время не превышает период ШИМа.

Вот формирование таблицы синуса:

for(i=0; i<SIZE; i++) {PWM_Tab=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;

Изменено пользователем IgorKossak
бездумное самоцитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Слишком долго считает.

Регистры TIM1->CCR1 не имеют теневых аналогов как у TIM1->ARR, записанное в них значение сразу начинает сравниваться.

Но выход есть, завести статическую переменную, в которую считать новое значение, и при прерывании переполнения (не сравнения!!!) - записывать в регистр значение статической переменной. Получится минимальная задержка обновления, и стабильная задержка на один отчёт - которую уже можно компенсировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Слишком долго считает.

Регистры TIM1->CCR1 не имеют теневых аналогов как у TIM1->ARR, записанное в них значение сразу начинает сравниваться.

Но выход есть, завести статическую переменную, в которую считать новое значение, и при прерывании переполнения (не сравнения!!!) - записывать в регистр значение статической переменной. Получится минимальная задержка обновления, и стабильная задержка на один отчёт - которую уже можно компенсировать.

Частота переполнения таймера 5 кГц, соответственно и TIM1>CCR1 обновляется с такой же частотой.

Изменено пользователем sidy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Слишком долго считает.

Регистры TIM1->CCR1 не имеют теневых аналогов как у TIM1->ARR, записанное в них значение сразу начинает сравниваться.

Однако, есть. За это отвечают биты OCxPE в регистрах TIM1->CCMRx.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Слишком долго считает.

Регистры TIM1->CCR1 не имеют теневых аналогов как у TIM1->ARR, записанное в них значение сразу начинает сравниваться.

Но выход есть, завести статическую переменную, в которую считать новое значение, и при прерывании переполнения (не сравнения!!!) - записывать в регистр значение статической переменной. Получится минимальная задержка обновления, и стабильная задержка на один отчёт - которую уже можно компенсировать.

 

Лично у меня так и делается. Есть переменная, которую гружу непосредственно в TIM1->CCR1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...