Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/36: Рейтинг темы: голосов - 36, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 183
1

таймеры мешают друг другу?

28.06.2012, 14:45. Просмотров 6591. Ответов 12
Метки нет (Все метки)

Коллеги
задействую два таймера в программе. stm32f103, 72 МГц
Код
TIM_TimeBaseStructInit(&timer_base);
timer_base.TIM_Period= 18000;
TIM_TimeBaseInit(&timer_base);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

TIM_TimeBaseStructInit(&timer_base);
timer_base.TIM_Period= 18000;
TIM_TimeBaseInit(&timer_base);
TIM_OCStructInit(&timer_ch);
timer_ch.TIM_Pulse =14500;
TIM_OC1Init(TIM3,&timer_ch);

TIM_ITConfig(TIM3, TIM_IT_Update | TIM_IT_CC1, ENABLE);

TIM_Cmd(TIM2, ENABLE);
TIM_Cmd(TIM3, ENABLE);
Соответственно есть прерывания:
TIM2 считает в прерывании переменную инкрементом. приоритет 1.
TIM3 выдает на ногу передний и задний фронты импульса. В прерываниях, т.к еще кое-что выдает на SPI , поэтому прямая выдача имульса в канал не подходит. Приоритет -0.

проблема в том, что при подключении обоих таймеров, на ноге от TIM3 появляется дребезг в плюс-минус 2 мкс. Причем ,наличие прерываний от SPI или UART этот дребезг не дает - только разборки между таймерами.
Ни у кого нет идей, как бы мне избавиться от дребезга?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.06.2012, 14:45
Ответы с готовыми решениями:

Статистическая переменная и метод друг другу мешают. Как все исправить?
Привет! У меня вопрос. Есть главный класс и дополнительный класс к этому классу. В главном классе...

Они как-то мешают друг-другу или нет?Ошибка - "No suitable method found to override"
Они как-то мешают друг-другу или нет? Я просто не вижу больше причин ошибки!! protected...

Все ли подходит друг другу?
Процессор Intel Core i5-6600K Tray Охлаждения DEEP COOL GAMMAXX S40 Материнская плата ASUS Z170...

Привязка 2 окон друг к другу
Всем привет, вот задался таким вопросом, есть основное диалоговое окно, есть немодальное окно...

12
0 / 0 / 0
Регистрация: 21.04.2010
Сообщений: 1,890
28.06.2012, 15:33 2
А вывод порта на какую частоту запрограммирован?
0
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 183
28.06.2012, 15:53 3
Цитата Сообщение от hordikor
А вывод порта на какую частоту запрограммирован?
50МГц
проверила с остальными частотами - разницы нет
перевела задачу TIM2 на CC2 от TIM3- так дребезга нет. Конечно., кто бы сомневался...
Но как повесить два независимых счетчика на один таймер ?
0
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 183
28.06.2012, 16:47 4
господа, прошу помощи зала..
. два таймера. на обоих прерывания по UPDATE. В прерывании каждый дергает ножкой GPIO(одной и той же или разной-не суть).
Вопрос- насколько стабильны фронты? Проверьте, кто может, пожалуйста

у меня получается, что только при равных значениях TIM.Period фронты стабильны. При произвольных значениях периода - регулярно дребезжат.....
0
0 / 0 / 0
Регистрация: 21.04.2010
Сообщений: 1,890
29.06.2012, 12:00 5
Они мешать могут только если вызов прерывание одного таймера иногда попадает на фронт другого, тогда фронт будет дребезжать.
А что ты в прерывании делаешь? Код покажи.
И приоритеты попробуй поставить на 1 и -0, а например 3 и 2.
Что- то не понял, у тебя обработка прерывания с каждого таймера происходит?
У меня стабильный фронт, если и вижу джиттер, то порядка десятка наносекунд, на уровне чувствительности осциллографа.
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
29.06.2012, 16:24 6
вы не путаете дребезг и джиттер?
0
0 / 0 / 0
Регистрация: 21.04.2010
Сообщений: 1,890
30.06.2012, 19:50 7
Гм, да, я всё время имел ввиду джиттер.
А вот если всё-таки дребезг - однозначно включен режим мастер-слейв.
0
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 183
01.07.2012, 10:56 8
Цитата Сообщение от Ymk
вы не путаете дребезг и джиттер?
путаю. Теперь знаю, что это джиттер и есть.
Цитата Сообщение от Oryimto
А что ты в прерывании делаешь? Код покажи.
А что ты в прерывании делаешь? Код покажи.
вроде, ничего тяжелого
Код
   /* Enable omd confikure TYM1 IRQ channel */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable omd confikure TIM2 IRQ channel */
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//   NVIC_Init(&NVIC_InitStructure);
/* Enable omd confikure TIM3 IRQ channel */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//триггер
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

void  TIM2_IRQHomdler()  //
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESIT)
{
TIM2->SR =(uint16_t)~TIM_IT_Update;
Peleng++;
//   if(Peleng>=4096)
//   {
//       Peleng=0;
//   }
}
}

void TIM3_IRQHomdler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESIT)
{
TIM_ClearITPendingByt(TIM3, TIM_IT_CC1);
//  SPI_I2S_SendData(SPI1, Peleng | 0x8000 );//старт выдачи тактов и кода пеленга
GPIOD -> BSRR =GPIO_BSRR_BR2;//задний фронт ТРИГГЕРа
}

if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESIT)
{
TIM_ClearITPendingByt(TIM3, TIM_IT_Update  );
GPIOD -> BSRR =GPIO_BSRR_BS2;//передний фронт ТРИГГЕРа
}

}
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
02.07.2012, 01:53 9
я не в курсе всей проблемы (лень перечитывать), но если понимаю правильно, джиттер будет ВСЕГДА, если частоты не очень кратные. происходит вот что: срабатывает 1й таймер, начинает выполняться его обработчик, в это время приходит прерывание 2го таймера. как бы там ни было (прервет оно 1й обработчик или нет), кто-то будет ожидать своей очереди, чтобы дернуть ногу - вот он, джиттер.
0
0 / 0 / 0
Регистрация: 21.04.2010
Сообщений: 1,890
02.07.2012, 19:49 10
Это-то понятно. просто как я понял первый таймер имеет более высокий приоритет, поэтому пока его прерывание не отработает - обработчик другого таймера стоит в очереди.
Тут может быть другой эффект - если прерывание первого таймера возникает когда работает обработчик прерывания второго таймера, тогда процу надо больше действий совершить чтобы переключить контекст, чем просто при вызове обработчика первого таймера. Что-то не могу найти книжку где это описано было подробно, поэтому надо бы уточнить.
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
02.07.2012, 21:16 11
если у какого-то таймера приоритет выше И вложенные прерывания разрешены - ЭТОТ таймер джиттера иметь не должен. если они оба дребезжат, значит какое-то условие не выполняется.

на счет больше действия на переключение контекста - фигня какая-то...
0
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 183
03.07.2012, 10:54 12
Цитата Сообщение от hordikor
Это-то понятно. просто как я понял первый таймер имеет более высокий приоритет, поэтому пока его прерывание не отработает - обработчик другого таймера стоит в очереди.
Тут может быть другой эффект - если прерывание первого таймера возникает когда работает обработчик прерывания второго таймера, тогда процу надо больше действий совершить чтобы переключить контекст, чем просто при вызове обработчика первого таймера. Что-то не могу найти книжку где это описано было подробно, поэтому надо бы уточнить.
угу, зрительно припоминаю картинку...
нашла. Это в The insider"s guide to the STM32 Написано, что"обработка прерывания с меньшим приоритетом останавливается, новый стековый фрейм сохраняется за стандартные 12 циклов, после чего запускается обработчик прерывания с бОльшим приоритетом"
0
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 183
03.07.2012, 16:31 13
может я приоритеты неправильно задаю?
вот этого достаточно для обозначения приоритета или нужно что-то еще?
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//триггер
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2012, 16:31

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

Все ли подходит друг к другу?
Всем привет, собственно, сабж Прошу оценить совместимость компонентов, в первую очередь на...

Равны ли строки друг другу
Пользователь вводит две строки если они равны друг другу значит вывести YES иначе NO

Подойдут ли к друг другу комплектующие?
Здравствуйте, пытаюсь апгрейдить свой 8-летний ПК, вот подобрал некоторые комплектующие: ОЗУ:...

Привязка селекторов друг к другу
Здравствуйте! $('#production_1, #production_2, #production_3, #production_4').submit(function...


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

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

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