реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
georgfour
сообщение May 19 2016, 19:14
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 31-12-15
Пользователь №: 89 900



Добрый день!
Хотел спросить у знающих людей, дабы ткнули меня носом, а то я подзапутался - как сделать так, чтобы происходило прерывание при повороте ручки механического энкодера?
Какие конкретно нужно эвенты сконфигурировать и как это будет работать.
Заранее спасибо за помощь!

Я пробовал делать по переполнению, однако ничего не работает:
Я включил общие прерывани и прерывания по таймеру 2:
__enable_irq ();//enable common interrupts
NVIC_EnableIRQ(TIM2_IRQn);//enable TIMER2 interrupt
Потом при инициализации таймера поставил бит :
TIM2->DIER|=TIM_DIER_UIE;
и вот так выглядит обработчик прерываний:
void TIM2_IRQHandler(void)
{
NVIC_DisableIRQ(TIM2_IRQn);
shift_cursor(1);
TIM2->SR &= ~TIM_SR_UIF;
NVIC_EnableIRQ(TIM2_IRQn);
}

И вообщем ничего не работает.
Значения в счетном регистре CNT изменяются как и положено при вращении ручки энкодера.
В чем может быть проблема?
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение May 19 2016, 19:19
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Для ручки достаточно и просто прерываний по изменению состояния выводов.
Go to the top of the page
 
+Quote Post
georgfour
сообщение May 19 2016, 19:58
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 31-12-15
Пользователь №: 89 900



Ну так здесь входы сконфигурированы под использование таймером - разве получится назанчить внешние прерывания на эти ноги?
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение May 19 2016, 20:57
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Кем-то свыще? Отключите... да, к тому же, возможно что прерывания будут вне зависимости от того, к какому устройству подключено.
Go to the top of the page
 
+Quote Post
Ruslan-maniak
сообщение May 20 2016, 10:48
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 27-12-12
Из: Томск
Пользователь №: 74 999



У вас обычный инкрементальный энкодер? Тогда вам нужно просто сконфигурировать таймер в режиме работы с энкодером
Код
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    TIM_TimeBaseInitTypeDef timer_base;
    TIM_TimeBaseStructInit(&timer_base);
    timer_base.TIM_Period = encoder->period;
    timer_base.TIM_CounterMode = TIM_CounterMode_Down | TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &timer_base);
    
    TIM_SetCounter(TIM3, 0);

    TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge, TIM_ICPolarity_BothEdge);
    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
    TIM_Cmd(TIM3, ENABLE);


И просто периодически смотреть в счётчике таймера на сколько щелчков мы укрутили., забирать это значение и обнулять счётчик. Вот и всё. По сути прерывания не нужны. Единственное - по переполнению счётчика можно сделать таймер, но обычно это не требуется.
Go to the top of the page
 
+Quote Post
georgfour
сообщение May 20 2016, 11:10
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 31-12-15
Пользователь №: 89 900



Так уже сконфигурировал, и он работает нормально, я просто не хочу делать постоянные опросы в главном цикле или по тикам другого таймера в прерываниях, я хочу чтобы как только ручка повернулась, мы зашли в прерывание и считали значение бита направления DIR - это все что нужно, без каких либо привязок к счетному регистру и его значениям
Go to the top of the page
 
+Quote Post
Ruslan-maniak
сообщение May 20 2016, 11:27
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 27-12-12
Из: Томск
Пользователь №: 74 999



а если период сделать равным 1
Go to the top of the page
 
+Quote Post
georgfour
сообщение May 20 2016, 11:32
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 31-12-15
Пользователь №: 89 900



Вы имеете масимально значение регистра ARR?
Пробовал, у меня почему то не работают прерывания по переполнению, инициализацию выше приводил
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение May 20 2016, 14:04
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Цитата(georgfour @ May 20 2016, 14:10) *
Так уже сконфигурировал, и он работает нормально, я просто не хочу делать постоянные опросы в главном цикле или по тикам другого таймера в прерываниях, я хочу чтобы как только ручка повернулась, мы зашли в прерывание и считали значение бита направления DIR - это все что нужно, без каких либо привязок к счетному регистру и его значениям

Зачем Вам тогда таймер этот нужен? Настраиваете прерывание на один из пинов (куда подключен энкодер), состояние второго пина даст Вам направление и все дела...
Go to the top of the page
 
+Quote Post
Obam
сообщение May 21 2016, 16:11
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Если в TIMx_CR1 бит UDIS==1, то не будет ни какого UIF в TIMx_SR. Сам сейчас с таймерами "забавляюсь" - чумовые штуки (:


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 8th July 2025 - 18:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01421 секунд с 7
ELECTRONIX ©2004-2016