Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.96/26: Рейтинг темы: голосов - 26, средняя оценка - 4.96
Ktym
1

Проблема с таймером в Center Aligned Mode

17.09.2015, 02:32. Просмотров 4760. Ответов 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 для отдельных каналов?
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2015, 02:32
Ответы с готовыми решениями:

проблема с таймером
Добрый вечер. Начал недавно заниматься программированием микроконтроллеров (использую...

Проблема с таймером
Почему на Delphi XE4 в "Таймере" не работает следующий код: procedure TForm1.Timer1Timer(Sender:...

Проблема с таймером
Здравствуйте. Вылез подводный камень при работе с таймером. var timer = setTimeout(function...

Проблема с таймером
Здравствуйте. У меня проблемка. Есть такой код: using System; using System.IO; using...

15
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
17.09.2015, 10:15 2
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 3
А зачем отключать ШИМ таймеру? Не проще оставить ШИМ работающим, а отключить только ноги от шим?
0
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
17.09.2015, 11:28 4
Цитата Сообщение от Tistir500
А зачем отключать ШИМ таймеру? Не проще оставить ШИМ работающим, а отключить только ноги от шим?
По органзации,я пока таких тонкостей,не отличаю.Что это даст?Как электронщик,чисто интуитивно считаю,что выключенный таймер,будет меньше(хоть чуть чуть)потреблять.Устройство у меня будет-батарейное.
0
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 333
17.09.2015, 12:05 5
В ТЗ про электро экономию не указано.
0
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
17.09.2015, 12:15 6
Цитата Сообщение от Tistir500
В ТЗ про электро экономию не указано.
Сейчас тут,не совсем по теме.Но,всем известно,кто занимается электроникой,счётчик тикающий,потребляет больше,чем счётчик стоящий,тем больше,чем выше частота счёта.
0
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
17.09.2015, 12:17 7
Я однажды делал так:
Использовал два таймера с одинаковыми установками. в одном таймере записал начальное значение счётчика 0, во втором - половина максимального значения счётчика. Оба таймера в режиме ШИМ с нужным коэффициентом заполнения. В результате всегда были противофазные сигналы.
А для экономии нужно ещё и тактирование таймеров выключать., и пины переводить в обычный режим.
0
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
17.09.2015, 12:26 8
Цитата Сообщение от SOVO
Я однажды делал так:
Использовал два таймера с одинаковыми установками. в одном таймере записал начальное значение счётчика 0, во втором - половина максимального значения счётчика. Оба таймера в режиме ШИМ с нужным коэффициентом заполнения. В результате всегда были противофазные сигналы.
А для экономии нужно ещё и тактирование таймеров выключать., и пины переводить в обычный режим.
С последним согласен.А вот,с чего бы им быть противофазными?Может,я туплю,но на первом импульс просто должен быть длиннее в два раза чем на втором и в первой половине,они действительно противофазны,но во второй половине-равны.
Добавленно,после многократного прочтения....
Вы использовали не два канала одного таймера,а именно разные таймеры?Это уже более сложная зависимость,сложнее,чем у ТС.Возможно,что это не совпадение и так будет всегда,но это-не документированная возможность.Всё равно,спасибо за информацию.
ещё добавлю...
Впрочем,почему-не документированная.Получается диаграмма,которую мы запрограммировали...В течении долгого периода,всё должно быть так как запрограммировано.Но ведь у синхронизации есть своя погрешность?Не достигнет ли это сползание момента,когда будет сбой.Это ведь не контролируется.Если это происходит один раз на короткий период,то может не сгорит.Если это как у ТС-недопустимо,потому что пробьются транзисторы полумоста преобразователя,то я бы так не делал.
0
Ktym
17.09.2015, 13:05 9
Цитата Сообщение от Movysi
Хорошо бы,платформу,контроллер и ИДЕ указывать.Таймеры могут отличаться по "жирности".
Да, камень написал сначала, потом стёр зачем-то. Контроллер - stm32f417, таймер TIM4. Другой соответственно уже выбрать не получиться. Режим PWM пробовал - ситуация аналогичная.

Цитата Сообщение от Tistir500
А зачем отключать ШИМ таймеру? Не проще оставить ШИМ работающим, а отключить только ноги от шим?
Может и не нужно. Но мне ещё частоту нужно менять иногда и коэффициент заполнения. Могу я это сделать при работающем таймере?
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
17.09.2015, 13:18 10
Цитата Сообщение от Ktym
Но мне ещё частоту нужно менять иногда и коэффициент заполнения. Могу я это сделать при работающем таймере?
Да вроде бы,всё в Ваших руках,а вы RM смотрели,там даже рассматривается как оно применится,в зависимости от доп настроек,сразу или после окончания счёта.
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 553
17.09.2015, 13:37 11
Цитата Сообщение от Ktym
Могу я это сделать при работающем таймере?
Да, но следует учесть, что новые настройки вступят в силу только тогда, когда таймер закончит текущий счет. Если надо сразу, то нужно пнуть бит UEG.
0
Ktym
17.09.2015, 13:40 12
Да, референс смотрел, устал его смотреть :), регистры OCxPE и ARPE видел, ещё попробую в эту сторону. Но я тут чего-то подумал - мне наверно надо просто после окончания генерации ШИМ конфигурировать таймер в TIM_OCMODE_ACTIVE или TIM_OCMODE_INACTIVE, то бишь писать в OCxM биты регистра TIMx_CCMRx нужное значение. Если я правильно определил корень проблемы, то это должно её решить.
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
17.09.2015, 15:13 13
Цитата Сообщение от Movysi
Получается диаграмма,которую мы запрограммировали...В течении долгого периода,всё должно быть так как запрограммировано.Но ведь у синхронизации есть своя погрешность?Не достигнет ли это сползание момента,когда будет сбой.Это ведь не контролируется.Если это происходит один раз на короткий период,то может не сгорит.Если это как у ТС-недопустимо,потому что пробьются транзисторы полумоста преобразователя,то я бы так не делал.
У обоих таймеров один и тот же источник тактирования, одинаковый предделитель и одинаковый коэффициент пересчёта. Они запускаются в одно и тоже время. Отличаются значения счётчиков на пол периода. Конечно, нужно предусмотреть аварийные ситуации, но никакой погрешности синхронизации тут не накапливается.
Как это же сделать на одном таймере, я пока не знаю. Впрочем, это только мой опыт...
0
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
17.09.2015, 15:22 14
Цитата Сообщение от SOVO
У обоих таймеров один и тот же источник тактирования, одинаковый предделитель и одинаковый коэффициент пересчёта. Они запускаются в одно и тоже время. Отличаются значения счётчиков на пол периода. Конечно, нужно предусмотреть аварийные ситуации, но никакой погрешности синхронизации тут не накапливается.
Как это же сделать на одном таймере, я пока не знаю. Впрочем, это только мой опыт...
Ещё раз,спасибо!Я этот момент,запомнил.Возможно,придётся воспользоваться.
0
Ktym
18.09.2015, 01:55 15
В общем не знаю, как я пробовал, но действительно настройка таймера в режиме PWM работает. Проблема в целом решена. Остаётся проблема остановить ШИМ точно по спадающему фронту при большом коэффициенте заполнения, но она не так важна. Всем спасибо! :)
0 / 0 / 0
Регистрация: 12.10.2014
Сообщений: 164
20.09.2015, 14:21 16
возможно так, например канал СС1 - неинвертированный а СС2 - инвертированный, тогда они всегда будут в противафазе см(OCxM в регистре CCMRx)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.09.2015, 14:21

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Проблема с таймером =(
Я запускаю таймер в "Form1_load" пытаюсь остановить событии timer1_Tick, но условие не работает,...

проблема с таймером 1
написал прогу в которой работает таймер1 в реале не рабоает, почему не понятно #include...

Проблема с таймером на ассемблере
Всем доброго времени суток. Я только начал изучать ассемблер. До этого работал только на C. Вроде...

проблема с асинхронным таймером
Доброго времени суток. Это мой первый проект и во многом я еще не разобрался, помогите пожалуйста...

Проблема с таймером Timer
Всем доброго времени суток не понимаю почему обычный таймер не хочет работать первый раз заходит а...

Проблема с таймером TIM2
Добрый день! Нужна ваша помощь. Проблема в том, что в режиме отладки, сразу после включения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.