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
|
|
28.06.2012, 14:45 | |
Статистическая переменная и метод друг другу мешают. Как все исправить?
Все ли подходит друг другу? Привязка 2 окон друг к другу |
|
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 |
![]() проверила с остальными частотами - разницы нет перевела задачу 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 |
![]() ![]() Код
/* 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 |
![]() нашла. Это в 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
|
03.07.2012, 16:31 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Все ли подходит друг к другу? Равны ли строки друг другу Подойдут ли к друг другу комплектующие?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |