0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 278
1

Прерывание от энкодера

15.08.2017, 18:57. Показов 6903. Ответов 6
Метки нет (Все метки)

Всем привет. Понадобилось использовать энкодер в проекте. Подключил его к TYM1, все работает, значение регистра CNT меняется. Но вот только мониторить состояние энкодера постоянным чтением регистров так себе идея. Полез искать информацию про прерывания от энкодера и как-то не нашел (хотя, казалось бы, вполне логично сделать в МК оное). Попытался использовать обычные прерывания (по переполнению и т.п.), но в режиме энкодера они не работают. Неужели все так печально или это у меня руки кривые?)

Код
   GPIOA->CRH &= ~(GPIO_CRH_CNF8_0 | GPIO_CRH_CNF9_0);
GPIOA->CRH |= GPIO_CRH_CNF8_1 | GPIO_CRH_CNF9_1;

RCC->APB2ENR = RCC_APB2ENR_TYM1EN;

AFIO->MAPR |= AFIO_MAPR_TIM3_REMAP;

TYM1->CCMR1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0 | TIM_CCMR1_IC1F | TIM_CCMR1_IC2F;
TYM1->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P);
TYM1->SMCR |= TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1;
TYM1->ARR = 4;

TYM1->CR1 |= TIM_CR1_CEN;
TYM1->DIER |= TIM_DIER_UIE;

NVIC_EnableIRQ(TYM1_UP_IRQn);
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.08.2017, 18:57
Ответы с готовыми решениями:

Обработка энкодера
Имеется трёх импульсный энкодер (если это правильное название), т.е. датчик который имеет три линии...

Эмуляция энкодера.
Что бы проверить работу таймера в режиме энкодера я решил эмулировать на двух ножках AB сигналы....

Миландр и модуль энкодера
Народ, не в курсе, есть ли у Милиндра контроллеры с аппаратной обработкой энкодера?

Относительное значение с энкодера.
Есть энкодер и STM32F103. Настроен по таймеру. 1. Как получить значение относительное начала ...

6
0 / 0 / 0
Регистрация: 06.05.2015
Сообщений: 11
15.08.2017, 19:18 2
Прерывание по переполнению должно работать в любом случае.
Код
NVIC_EnableIRQ(TYM1_UP_IRQn);
NVIC_SetPriority(TYM1_UP_IRQn, 0);
TYM1->DIER |= TIM_DIER_UIE;

void TYM1_UP_IRQHomdler(void)
{
if ((TYM1->SR & TIM_SR_UIF) != 0) {
TYM1->SR = ~TIM_SR_UIF;
}
}
0
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 278
15.08.2017, 19:23 3
Все заработало. Это я ошибку сделал)
0
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
16.08.2017, 07:34 4
обычный энкодер цеплять на входе энкодера в таймере не ахти идея. Аппаратный антидребезг слишком короткий, микросекунды, бывают ложные срабатывания. Перешел на программный опрос. Частоты в 500 Гц вполне хватает.
0
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 278
17.08.2017, 17:11 5
Пока вроде нормально работает. На входах энкодера стоят кондеры 1мкФ. Если будет паршиво работать, переделаю на программный опрос.
0
0 / 0 / 0
Регистрация: 19.09.2012
Сообщений: 925
17.08.2017, 17:23 6
Цитата Сообщение от BORS_
Полез искать информацию про прерывания от энкодера и как-то не нашел (хотя, казалось бы, вполне логично сделать в МК оное).
Если желательна работа по прерываниям, то удобнее повесить энкодер на два пина и настроить прерывания от них на одну функцию. Обрабатывать можно как показано тут (самый первый пост). Один из плюсов данного подхода - свобода в выборе диапазонов и возможность работы в инкрементальном режиме (например, если энкодер используется для пользовательского интерфейса, то этот режим значительно удобнее абсолютного счета). Кстати, если есть RTOS, то события от энкодера можно ложить в очередь в прерывании, а в отдельном потоке обрабатывать эту очередь и рисовать пользовательский интерфейс. Я использовал подобное решение и оно отлично работает.
0
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 278
21.08.2017, 11:56 7
Цитата Сообщение от ivsy
Кстати, если есть RTOS, то события от энкодера можно ложить в очередь в прерывании, а в отдельном потоке обрабатывать эту очередь и рисовать пользовательский интерфейс. Я использовал подобное решение и оно отлично работает.
Ну у меня все куда проще. Идет управление простым GUI. Пока на таймере работает идеально, без сбоев) Но советы учту на будущее. Спасибо всем, кто откликнулся)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.08.2017, 11:56

Интерфейс для энкодера на STM32F107.
Мне нужно считать два инкриментальных АБ энкодера. Я так понял что есть таймеры которые можно...

STM32F0xx - таймер в режим энкодера требуется совет.
Привет! Вопрос по реализации счета на 32F0xx. Есть процедура инициализации Энкодера:...

Выбор контроллера STM32F373 для обработки данных с Энкодера
Приветствую! Комрады кто работал с нормальными энкодерами (от 100 импульсов на оборот) При...

Замена энкодера
Ребята! Некогда заниматься поиском даташитов на N-кодеры шаттл с номера1 по номер 15, да и,честно...


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

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

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