Невозможно, но вы можете в самом обработчике прерывания переключать вывод микроконтроллера на фронт или спад. В практике я такое использовал.
К1921ВК01Т (арм Cortex-M4F)
Модераторы: ea, dav, bkolbov, Alis, pip, _sva_
-
- Сообщения: 7
- Зарегистрирован: 08 апр 2019, 18:59
- Предприятие: АО "СИ-ЭЛ"
- Откуда: Санкт-Петербург
- Контактная информация:
Re: К1921ВК01Т (арм Cortex-M4F)
Re: К1921ВК01Т (арм Cortex-M4F)
Какая последовательность действий должна быть чтобы остановить ШИМ?
На данный момент я настроил ШИМ на определенную частоту. Мне необходимо в произвольный момент остановить генерацию ШИМ.
Я попробовал изменить регистр TBCTL в режиме дебага (Keil 5) поле CTRMODE: было 0(счет вверх), записал 3(остановка).
Генерация на выходе прекратилась, но таймер все равно считает, регистр TBCTR изменяется.
Пробовал изменить поле FREE/SOFT в регистре TBCTL на зачение 0 (остановка счета на следующем такте), но это тоже не помогает.
Может я что-то упускаю?
На данный момент я настроил ШИМ на определенную частоту. Мне необходимо в произвольный момент остановить генерацию ШИМ.
Я попробовал изменить регистр TBCTL в режиме дебага (Keil 5) поле CTRMODE: было 0(счет вверх), записал 3(остановка).
Генерация на выходе прекратилась, но таймер все равно считает, регистр TBCTR изменяется.
Пробовал изменить поле FREE/SOFT в регистре TBCTL на зачение 0 (остановка счета на следующем такте), но это тоже не помогает.
Может я что-то упускаю?
- Лашкевич
- Сообщения: 373
- Зарегистрирован: 13 май 2015, 13:10
- Предприятие: ООО "НПФ Вектор"
- Откуда: Москва
- Контактная информация:
Re: К1921ВК01Т (арм Cortex-M4F)
Остановить ШИМ или остановить таймер? Это разные задачи. Обычно в задачах преобразовательной техники таймер ШИМ никогда не останавливают, а отключают именно генерацию ШИМ. Вот два способа на выбор:
1. Через регистр AQCSFRC, задавая на выходе конкретные значения, соответствующие выключенным ключам. Тут надо внимательно проверить, как дальше работает и настроен блок мёртвого времени, чтобы противоположный ключ не оставался включенным.
2. Через модуль TZ, а именно сгенерировать "аппаратную аварию" программно, TZFRC_bit.OST = 1. Тогда модуль ШИМ перейдёт в безопасное состояние, такое, какое настроено в модуле TZ. Тут есть тонкость, как в ПО отличать настоящую аппаратную аварию от программной, если по TZ настроено прерывание. Надо лишние флажки вводить.
1. Через регистр AQCSFRC, задавая на выходе конкретные значения, соответствующие выключенным ключам. Тут надо внимательно проверить, как дальше работает и настроен блок мёртвого времени, чтобы противоположный ключ не оставался включенным.
2. Через модуль TZ, а именно сгенерировать "аппаратную аварию" программно, TZFRC_bit.OST = 1. Тогда модуль ШИМ перейдёт в безопасное состояние, такое, какое настроено в модуле TZ. Тут есть тонкость, как в ПО отличать настоящую аппаратную аварию от программной, если по TZ настроено прерывание. Надо лишние флажки вводить.
Re: К1921ВК01Т (арм Cortex-M4F)
с предыдущим вопрос по мере возможностей разобрался и настроил работу ШИМ. Однако, возникла другая проблема.
Я настроил прерывания ШИМ по условию достижения таймера необходимого порога.
Теоретически, как мне кажется, срабатывание должно быть идентичным, как на обычном таймере. Т.е. таймер досчитал, инвертировал на выходе уровень ШИМ и зашел в прерывание. В прерывании я сбрасываю флаг,делаю какие-нибудь действия и выхожу из прерывания. И снова жду пока таймер не дощелкает.
По факту, судя по всему, в прерывание заходит циклически постоянно, то есть выйдет и снова залетает в прерывание, как-будто вызвавший его флаг и не сбрасывается. Либо я невнимателен и пропускаю какое-то действие, либо выполняю неправильную очередность инициализации, лиюо это какой-то хитрый баг(что наименее вероятно)
Код инициализации и прерывания прикладываю
Я настроил прерывания ШИМ по условию достижения таймера необходимого порога.
Теоретически, как мне кажется, срабатывание должно быть идентичным, как на обычном таймере. Т.е. таймер досчитал, инвертировал на выходе уровень ШИМ и зашел в прерывание. В прерывании я сбрасываю флаг,делаю какие-нибудь действия и выхожу из прерывания. И снова жду пока таймер не дощелкает.
По факту, судя по всему, в прерывание заходит циклически постоянно, то есть выйдет и снова залетает в прерывание, как-будто вызвавший его флаг и не сбрасывается. Либо я невнимателен и пропускаю какое-то действие, либо выполняю неправильную очередность инициализации, лиюо это какой-то хитрый баг(что наименее вероятно)
Код инициализации и прерывания прикладываю
- | Показать
- Disona
- Сообщения: 81
- Зарегистрирован: 06 дек 2016, 11:18
- Предприятие: НПФ Вектор
- Откуда: Москва
- Контактная информация:
Re: К1921ВК01Т (арм Cortex-M4F)
Вы в прерывании для сброса прерывания вызываете функцию "PWM_ITStatusClear".
Мне кажется, не хватает ещё одной функции - "PWM_ITPendClear".
Их нужно вызывать вместе. Не уверен, правда, какую сначала, а какую потом.
С уважением, Дмитрий Шпак
ООО "НПФ Вектор"
ООО "НПФ Вектор"
Re: К1921ВК01Т (арм Cortex-M4F)
спасибо, помогло. Очередность похоже не имеет значения.
Re: К1921ВК01Т (арм Cortex-M4F)
судя по документации, при возникновении прерывания ШИМ по событию порога срабатывания (CMPA/CMPB), нет отдельных флагов для этих событий? Т.е. для всех событий ШИМ, которые вызвали прерывание один общий флаг? В таком случае, как корректно определять причину прерываний (CMPA или CMPB)? сравнивать с текущим значением таймера?
- Disona
- Сообщения: 81
- Зарегистрирован: 06 дек 2016, 11:18
- Предприятие: НПФ Вектор
- Откуда: Москва
- Контактная информация:
Re: К1921ВК01Т (арм Cortex-M4F)
Видимо, да. Но только нужно быть уверенным, что между событием и прерыванием не вклинилось другое, более приоритетное прерывание.BogatovNA писал(а): ↑16 июл 2021, 15:24 судя по документации, при возникновении прерывания ШИМ по событию порога срабатывания (CMPA/CMPB), нет отдельных флагов для этих событий? Т.е. для всех событий ШИМ, которые вызвали прерывание один общий флаг? В таком случае, как корректно определять причину прерываний (CMPA или CMPB)? сравнивать с текущим значением таймера?
Также можно смотреть на TBSTS.bit.CTRDIR, если вы знаете, что у вас события происходят при разных направлениях счёта.
Впрочем, лучше дождаться ответа от НИИЭТ на этот вопрос.
С уважением, Дмитрий Шпак
ООО "НПФ Вектор"
ООО "НПФ Вектор"
Re: К1921ВК01Т (арм Cortex-M4F)
А как вы настраиваете ШИМ, чтобы он по обоим совпадениям выходил в прерывание?BogatovNA писал(а): ↑16 июл 2021, 15:24 судя по документации, при возникновении прерывания ШИМ по событию порога срабатывания (CMPA/CMPB), нет отдельных флагов для этих событий? Т.е. для всех событий ШИМ, которые вызвали прерывание один общий флаг? В таком случае, как корректно определять причину прерываний (CMPA или CMPB)? сравнивать с текущим значением таймера?
Я так понял, что в регистре ETSEL можно выбрать один из источников в поле INTSEL для PWM_INT. А PWM_SOCA/B относятся к АЦП.
Re: К1921ВК01Т (арм Cortex-M4F)
Здравствуйте. Интересная ситуация. На микроконтроллерах серии 1822 (на серии 2037 все хорошо) в морозе не запускается микроконтроллер. Супервизора питания нет, потому повесили могучий конденсатор на вход RST после резистора. Задержки хватает, чтобы при нормальной температуре все запускалось. Увеличение RC цепочки не приводит к результатам в минусе. Все питания в норме. МК запускается при касании пальцем в районе ножек 9-14. Причем, если заморозить включенный МК, работа продолжается, лишь при включении беда. Не подскажите куда копать?