|
Ktym
|
|
Проблема с таймером в Center Aligned Mode17.09.2015, 02:32. Показов 5379. Ответов 15
Метки нет (Все метки)
День добрый! Нужна помощь, два дня не могу решить проблему. Задача - с двух ног генерить ШИМ на частоте около 500кГц. При чём ШИМ должен быть в противофазе. Нельзя, чтобы на обоих каналах был одновременно высокий уровень. Коэффициент заполнения, соответственно на каждом из каналов меняется от 5 до 45%. Время генерации ШИМ - 10мс, затем 100мс пауза, потом повторяем цикл. Использую HAL.
Соответственно настраиваю таймер в OC режиме - TIM_OCMode_Toggle. Перед каждым циклом генерации я настраиваю TIM_CCRx на нужных каналах, полярность, ARR и.т.д. Запускаю генерацию - первый цикл проходит отлично. ШИМ получается, такой какой-нужен. Затем пытаюсь остановить генерацию на 100 мс. Делаю примерно так - по другому таймеру я включаю прерывания TIM_IT_CC и в нём пытаюсь остановить генерацию ШИМ и отключить эти прерывания. Тут я пробовал разные варианты - и выключал счётчик через CEN, и деинициализировал таймер, и ловил прерывания для каждого канала отдельно, а потом выключал через HAL_TIM_OC_Stop(&tim, channel). Сейчас наверное это не суть. В общем дальше суть проблемы - ШИМ на отдельных каналах (при последующих запусках генерации) переодически получается инвертированный относительно того, который должен быть. Причём такая проблема сильно проявляется, когда большой коэффициент заполнения на обоих каналах - т.е. время, когда на обоих ногах низкий уровень, очень мало. При низком коэффициенте заполнения (когда обе ноги в низком уровне находятся продолжительное время) проблемы вроде не наблюдалось. Подскажите, как я могу полностью сбросить состояние таймера? Может ошибаюсь, но как мне кажется, у меня не получается остановить в нужный момент одновременно два канала и OCxREF на каждом из каналов остаётся в каком-то произвольном уровне. Дальше, т.к. я при старте ШИМ предполагаю, что для обоих каналов OCxREF находятся в одинаковом конкретном состоянии - получается та ботва, которую я описал. Я извиняюсь, что описал проблему без кода - сейчас нет под рукой. При необходимости завтра выложу куски кода. Просто я не давно программирую stm и не понимаю тонкостей, может решение лежит на поверхности? Можно ли как-нибудь сбросить OCxREF для отдельных каналов? |
|
| 17.09.2015, 02:32 | |
|
Ответы с готовыми решениями:
15
Проблема с таймером Проблема с таймером
|
|
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
|
|
| 17.09.2015, 10:15 | |
|
Ktym,
Здравствуйте! Хорошо бы,платформу,контроллер и ИДЕ указывать.Таймеры могут отличаться по "жирности". Я тоже новичёк и Си и в STM32.У меня Nucleo STM32F401RE.Из за ограниченных возможностей по Си,таймер глубоко не копал пока,ограничился пролистыванием RM и DS.Сделал на TIM3-подсветку и контраст для своего LCD.Там у меня используется режим PWM.Мне кажется,что этот режим и Вам тоже подошёл бы.Вроде бы ОС,для более "тонкого" управления выходом. А если нужно просто управлять заполнением,то PWM-подходит.А чтобы не связываться с разными каналами,почему бы не взять TYM1-продвинутый таймер,который может-выходы в противофазе и "мёртвое время" между импульсами. Состояние выходов,простое и "аварийное"-там можно настроить,судя по описанию,но я этого не делал.Только включал и выключал вывод ШИМ(подсветку и BEEP). HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); //Запуск ШИМ подсветки с начальным значением HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); //Запуск ШИМ контраста с начальным значением Это для LCD,и вот так для BEEP. //------------------------------------------------------------------------------------------------- // Функция вывода Beep //------------------------------------------------------------------------------------------------- void Beep(void) { HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3); //Запуск ШИМ для Beep HAL_Delay(1000); HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_3); // Останов ШИМ для Beep }
0
|
|
|
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 333
|
|
| 17.09.2015, 11:17 | |
|
А зачем отключать ШИМ таймеру? Не проще оставить ШИМ работающим, а отключить только ноги от шим?
0
|
|
|
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
|
||
| 17.09.2015, 11:28 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 333
|
|
| 17.09.2015, 12:05 | |
|
В ТЗ про электро экономию не указано.
0
|
|
|
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
|
||
| 17.09.2015, 12:15 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
|
|
| 17.09.2015, 12:17 | |
|
Я однажды делал так:
Использовал два таймера с одинаковыми установками. в одном таймере записал начальное значение счётчика 0, во втором - половина максимального значения счётчика. Оба таймера в режиме ШИМ с нужным коэффициентом заполнения. В результате всегда были противофазные сигналы. А для экономии нужно ещё и тактирование таймеров выключать., и пины переводить в обычный режим.
0
|
|
|
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
|
||
| 17.09.2015, 12:26 | ||
Добавленно,после многократного прочтения.... Вы использовали не два канала одного таймера,а именно разные таймеры?Это уже более сложная зависимость,сложнее,чем у ТС.Возможно,что это не совпадение и так будет всегда,но это-не документированная возможность.Всё равно,спасибо за информацию. ещё добавлю... Впрочем,почему-не документированная.Получается диаграмма,которую мы запрограммировали...В течении долгого периода,всё должно быть так как запрограммировано.Но ведь у синхронизации есть своя погрешность?Не достигнет ли это сползание момента,когда будет сбой.Это ведь не контролируется.Если это происходит один раз на короткий период,то может не сгорит.Если это как у ТС-недопустимо,потому что пробьются транзисторы полумоста преобразователя,то я бы так не делал.
0
|
||
|
Ktym
|
|||
| 17.09.2015, 13:05 | |||
|
|||
|
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
|
||
| 17.09.2015, 13:18 | ||
0
|
||
|
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 553
|
||
| 17.09.2015, 13:37 | ||
0
|
||
|
Ktym
|
|
| 17.09.2015, 13:40 | |
|
Да, референс смотрел, устал его смотреть :), регистры OCxPE и ARPE видел, ещё попробую в эту сторону. Но я тут чего-то подумал - мне наверно надо просто после окончания генерации ШИМ конфигурировать таймер в TIM_OCMODE_ACTIVE или TIM_OCMODE_INACTIVE, то бишь писать в OCxM биты регистра TIMx_CCMRx нужное значение. Если я правильно определил корень проблемы, то это должно её решить.
|
|
|
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
|
||
| 17.09.2015, 15:13 | ||
Как это же сделать на одном таймере, я пока не знаю. Впрочем, это только мой опыт...
0
|
||
|
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
|
||
| 17.09.2015, 15:22 | ||
0
|
||
|
Ktym
|
|
| 18.09.2015, 01:55 | |
|
В общем не знаю, как я пробовал, но действительно настройка таймера в режиме PWM работает. Проблема в целом решена. Остаётся проблема остановить ШИМ точно по спадающему фронту при большом коэффициенте заполнения, но она не так важна. Всем спасибо! :)
|
|
|
0 / 0 / 0
Регистрация: 12.10.2014
Сообщений: 164
|
|
| 20.09.2015, 14:21 | |
|
возможно так, например канал СС1 - неинвертированный а СС2 - инвертированный, тогда они всегда будут в противафазе см(OCxM в регистре CCMRx)
0
|
|
| 20.09.2015, 14:21 | |
|
Помогаю со студенческими работами здесь
16
проблема с таймером Проблема с таймером проблема с таймером 1 Проблема с таймером Проблема с таймером =( Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
в-строка - входное арифметическое выражение в инфиксной(обычной). . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|