sidy 1 3 ноября, 2017 Опубликовано 3 ноября, 2017 (изменено) · Жалоба Господа, добрый день. Возникла проблема. Есть ШИМ частотой 5 кГц для управления транзисторным модулем для формирования синусоиды 50 Гц. С мертвым временем 5 мкс. Получается что при выдаче ШИМа в комплиментарные выходы таймера TIM1 значения ШИМа вырождаются в постоянный сигнал, если они меньше мертвого времени и соответственно искажается синусоидальный сигнал. Т.е. получается что у STM32 нет минимального значения мертвого времени? (Для примера привожу синусоиду сформированную без мертвого времени - искажений нет) Как же тогда с этим работать? Изменено 3 ноября, 2017 пользователем sidy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 7 ноября, 2017 Опубликовано 7 ноября, 2017 · Жалоба По-моему, совершенно естественно, что если ставить ontime < deadtime, то deadtime полностью перекроет ontime, и неинверсный выход таймера включаться не будет. А как по-вашему, должен работать таймер? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sidy 1 7 ноября, 2017 Опубликовано 7 ноября, 2017 · Жалоба По-моему, совершенно естественно, что если ставить ontime < deadtime, то deadtime полностью перекроет ontime, и неинверсный выход таймера включаться не будет. А как по-вашему, должен работать таймер? По моему должно сохраняться минимальное мертвое время. В противном случае не будет симметрии в сигнале. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dac 0 7 ноября, 2017 Опубликовано 7 ноября, 2017 · Жалоба По моему должно сохраняться минимальное мертвое время. В противном случае не будет симметрии в сигнале. center aligned? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amaora 20 7 ноября, 2017 Опубликовано 7 ноября, 2017 · Жалоба По моему должно сохраняться минимальное мертвое время. В противном случае не будет симметрии в сигнале. Что значит "должно сохраняться минимальное мертвое время"? Ограничить заполнение так чтобы не задавать длительность импульса меньше DT, не подойдет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serglg 0 8 ноября, 2017 Опубликовано 8 ноября, 2017 · Жалоба Что значит "должно сохраняться минимальное мертвое время"? Ограничить заполнение так чтобы не задавать длительность импульса меньше DT, не подойдет? Действительно, лично у меня всегда в стоит везде такое ограничение - как сверху, так и снизу. Если DT=20, то при ШИМе импульс не короче 25 и не длиньше PERIOD-25. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sidy 1 28 ноября, 2017 Опубликовано 28 ноября, 2017 (изменено) · Жалоба Вернулся опять к данному вопросу. И выяснил что искажения выходной синусоиды происходят и в тех случаях когда мертвое время не превышает период ШИМа. Вот формирование таблицы синуса: 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; Изменено 28 ноября, 2017 пользователем IgorKossak бездумное самоцитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 28 ноября, 2017 Опубликовано 28 ноября, 2017 · Жалоба Слишком долго считает. Регистры TIM1->CCR1 не имеют теневых аналогов как у TIM1->ARR, записанное в них значение сразу начинает сравниваться. Но выход есть, завести статическую переменную, в которую считать новое значение, и при прерывании переполнения (не сравнения!!!) - записывать в регистр значение статической переменной. Получится минимальная задержка обновления, и стабильная задержка на один отчёт - которую уже можно компенсировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sidy 1 28 ноября, 2017 Опубликовано 28 ноября, 2017 (изменено) · Жалоба Слишком долго считает. Регистры TIM1->CCR1 не имеют теневых аналогов как у TIM1->ARR, записанное в них значение сразу начинает сравниваться. Но выход есть, завести статическую переменную, в которую считать новое значение, и при прерывании переполнения (не сравнения!!!) - записывать в регистр значение статической переменной. Получится минимальная задержка обновления, и стабильная задержка на один отчёт - которую уже можно компенсировать. Частота переполнения таймера 5 кГц, соответственно и TIM1>CCR1 обновляется с такой же частотой. Изменено 28 ноября, 2017 пользователем sidy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 28 ноября, 2017 Опубликовано 28 ноября, 2017 · Жалоба Слишком долго считает. Регистры TIM1->CCR1 не имеют теневых аналогов как у TIM1->ARR, записанное в них значение сразу начинает сравниваться. Однако, есть. За это отвечают биты OCxPE в регистрах TIM1->CCMRx. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serglg 0 29 ноября, 2017 Опубликовано 29 ноября, 2017 · Жалоба Слишком долго считает. Регистры TIM1->CCR1 не имеют теневых аналогов как у TIM1->ARR, записанное в них значение сразу начинает сравниваться. Но выход есть, завести статическую переменную, в которую считать новое значение, и при прерывании переполнения (не сравнения!!!) - записывать в регистр значение статической переменной. Получится минимальная задержка обновления, и стабильная задержка на один отчёт - которую уже можно компенсировать. Лично у меня так и делается. Есть переменная, которую гружу непосредственно в TIM1->CCR1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться