Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/132: Рейтинг темы: голосов - 132, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 21.02.2015
Сообщений: 52

Энкодер через прерывания / зараза дребезг

16.04.2015, 22:09. Показов 26680. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Делаю обработчик сигнала с инкрементального двухфазного энкодера . Алгоритм следующий: <ul>1) на одну фазу сажаю прерывание, что позволяет вести счет тактов
2) т.к. одна фаза отстает/обгоняет другую на полшага, то в обработчике прерывания смотрю вторую фазу для определения направления вращения, если вторая фаза 0 - значит обратный ход, если 1 - значит вперед</ul>Вроде бы все прсто и красиво, но вот проблема - дребезг! Имеется дребез который создает ложные прерывания. Как от него можно избавиться?
Знаю что у STM32 есть аппаратный обработчик энкодера(пользовался и умею настраивать), но в данном случае его использовать не могу. К триггеру Шмитта и другм аппаратным решениям прибегать не хочеться. Можно ли как-то решить эту проблему програмно?

Спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.04.2015, 22:09
Ответы с готовыми решениями:

Задержки на SysTick внутри обработчика прерывания, дребезг
Доброго времени суток. 1. Пытаюсь прикрутить delay на SysTick. При вызове из main все работает корректно, но стот же вызвать из...

Энкодер влияет на прерывания, хотя напрямую не подключен.
Attiny2313, к INT1 подключена оптопара в сборе как в мышке и пара резисторов на ней, если окно открыто - на выходе 1, если закрыто - о ....

Графика через прерывания на Borland С++ 3.1
Здравствуйте форумчане! Подскажите пожалуйста, может я чего-то не понимаю. Но есть ли в С++ под DOS графические прерывания? Суть...

24
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 25
20.04.2015, 22:43
Студворк — интернет-сервис помощи студентам
У меня проблема - делаю обработку энкодера по функции таймера. Не могу понять увелививается-уменьшается значение всегда на цифру 2.
0
dyokym
21.12.2016, 07:44
Цитата Сообщение от MoxymS
Всем привет!
Делаю обработчик сигнала с инкрементального двухфазного энкодера . Алгоритм следующий: <ul>1) на одну фазу сажаю прерывание, что позволяет вести счет тактов
2) т.к. одна фаза отстает/обгоняет другую на полшага, то в обработчике прерывания смотрю вторую фазу для определения направления вращения, если вторая фаза 0 - значит обратный ход, если 1 - значит вперед</ul>Вроде бы все прсто и красиво, но вот проблема - дребезг! Имеется дребез который создает ложные прерывания. Как от него можно избавиться?
Знаю что у STM32 есть аппаратный обработчик энкодера(пользовался и умею настраивать), но в данном случае его использовать не могу. К триггеру Шмитта и другм аппаратным решениям прибегать не хочеться. Можно ли как-то решить эту проблему програмно?

Спасибо!
Надо прерывание генерить и по фронту и по спаду. Например, если прошло прерывание по фронту, то инкремент и ждем прерывание по спаду. И пока его не будет (допустим пропустили, пока обрабатывали прерывание по фронту), то счета не будет. А если будет при том же состоянии другой фазы, то декремент и счет будет болтаться +-1.

зы. Не подскажите пример кода для аппаратной обработки? А то на валу быстро крутится )


<Изображение удалено>
0 / 0 / 0
Регистрация: 11.10.2013
Сообщений: 326
22.12.2016, 20:43
Цитата Сообщение от dyokym
зы. Не подскажите пример кода для аппаратной обработки? А то на валу быстро крутится )
"Для STM32F0"
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
void Encoder_Init (void)
{
//--------- Включили тактирование - GPIOA-----------------------------------------------
RCC->AHBENR     |= RCC_AHBENR_GPIOAEN;
//---------Настраиваем выводы 6 и 7 на Альтернативный режим работы---------------
GPIOA->MODER    |= GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1;
//---------Оставляем режим Push_Pull------------------------------------------------------
GPIOA->OTYPER    &=~(GPIO_OTYPER_OT_6 | GPIO_OTYPER_OT_7);
//-------- Настраиваем входа 6 и 7  на работу в режиме Moxymum speed 50MHz-----
GPIOA->OSPEEDR    |= GPIO_OSPEEDR_OSPEEDR6 | GPIO_OSPEEDR_OSPEEDR7;
//-------- Выводы  6 и 7 - настраиваем в режим PullUp mode.--------------------------
GPIOA->PUPDR    |= GPIO_PUPDR_PUPDR6_0 | GPIO_PUPDR_PUPDR7_0;
// --------Настраиваем выводы 6 и 7 на Алтернативную Функцию AF1 (работа с таймером TIM3)--
GPIOA->AFR[0]    |= 0x01 << (6 * 4); //GPIO_AFRL_AFR6  - AF1
GPIOA->AFR[0]    |= 0x01 << (7 * 4); //GPIO_AFRL_AFR7  - AF1
//-------------Настройки таймера--------
//---------Включаем тактирование таймера  TIM3
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
//Настраиваем период счета для режима работы с инкрементальным энкодером, у нас может быть 4
//состояния (1 - (A="0", B="0"), 2 - (A="1", B="0"), 3 - (A="1", B="1"), 4 - (A="0", B="1")) ;
TIM3->ARR = 3;
//-------------------------------Предделитель не используем------------------------------
TIM3->PSC = 0;
// ------------------------------Предзагрузка не используется----------------------------
TIM3->CR1 &=~(TIM_CR1_ARPE);
// ------------------------------Тактирование без предделителя--------------------------
TIM3->CR1 &= ~TIM_CR1_CKD;
//--------------------------------Считываем с обоих каналов -----------------------------
//Направление счета вверх и вниз
TIM3->SMCR |= TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1;
//----------------------------------Режим захвата  "0"--------------------------------------
TIM3->CCMR1    |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0;
//-----------------------------полярность сигнала  - по спаду "0"-------------------------
TIM3->CCER &=~(TIM_CCER_CC1P | TIM_CCER_CC2P);
//-----------------------------полярность сигнала для сравнения "0"---------------------
TIM3->CCER &=~(TIM_CCER_CC1NP | TIM_CCER_CC2NP);
//------------------------------ Обнуляем счетчик------------------------------------------
TIM3->CNT=0;
//------------------------------- разрешили прерывание от таймера----------------------
TIM3->DIER |= TIM_DIER_UIE;
//------------------------------- Запуск таймера--------------------------------------------
TIM3->CR1  |= TIM_CR1_CEN;
//--------------------------------Настройка прерывания от переполнения счетчика----
NVIC_EnableIRQ(TIM3_IRQn);
NVIC_SetPriority(TIM3_IRQn,0x01);
//----------выставляем значение счетчика по умолчанию на 1000
uint16_t Counter=1000;
}
Обработчик прерывания

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 void TIM3_IRQHomdler(void)
{
// ------------------Запрещаем прерывания пока находимся в обработчике---------------------------
TIM3->DIER &= ~(TIM_DIER_UIE);
if( TIM3->SR & TIM_SR_UIF )  // если сработало прерывание по переполнение счетчика
 
{ TIM3->SR &= ~(TIM_SR_UIF); // сбрасываем флаг прерывания
// по состоянию регистра - определяем направление и соответственно или прибавляем или убавляем
// состояние счетчика
if ((TIM3->CR1 & TIM_CR1_DIR)) Counter++;
else {if (Counter) Counter--;}
}
// разрешаем прерывания перед выходом из обработчика
TIM3->DIER |= TIM_DIER_UIE;
}
0
0 / 0 / 0
Регистрация: 10.04.2014
Сообщений: 879
23.12.2016, 00:09
А вы знаете что дребезг только при замыкании контактов? При размыкании контактов дребезга нет. Мне это как то помогло
0
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
22.02.2017, 12:16
Работаю с энкодером. Возможно я что-то не так понял, но нигде не увидел запрета установки предделителя, который PSC.
Работаю с STM32F103T8U6 (VFQFPN36), TIM4 каналы 1 и 2, PCLK1 = 36 МГц, энкодер PEC11R-4220F-S0024, внешняя подтяжка 10к на 3.3. Случайно установил PSC, дернул из старого проекта инициализацию, рассчетное CK_INT вышло около 2000 КГц. В итоге энкодер работает только до тех пор, пока не перейду границу ARR или 0. Затем CNT останавливается на последнем значении либо показывает белиберду. А вот если установить PSC в 0, то все отлично работает. И это странно, т.к. по сути таймер в slave режиме с тактированием от энкодера (входы 1 и 2). В errata упоминаний не нашел.
Фильтры ICxF тактируются от CK_INT, либо, если настроить делитель CKD в регистре CR1, то можно еще понизить частоту fDTS в 2 и 4 раза, относительно входной. И выходит, что максимальную длительность антидебезга можно настроить при 72 МГц тактовой :1/(36 000 000(PCLK1) /(4(CKD)*32*8(IC1F = 1111))) = 28мкс? Какой смысл такого антидребезга, дребезг на 2-3 порядка дольше длится. По схеме Fig.100, RM0008, page 362, на вход Trigger контроллера, поступают сигналы TI1FP1, TI1FP2 до мультиплексора ICx, однако при настройке регистров CCMRx, мы указываем куда подавать сигналы после входного фильтра (биты CCxS). Не совсем понятно, зачем это делать, если по схеме мы сигналы берем прямо с выхода входного фильтра, а что там дальше нас особо не волнует. RM0008, page 386 явно говорит, что надо устанавливать биты CCxS (причем с опечаткой, выделил красным), однако и без этого работает.
Кто детально разбирался, укажите где я неправ или ошибаюсь. Иначе придется опрашивать энкодер по старинке, с прерываниями со своим, адекватным антидребезгом. Толку от такого аппаратного нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.02.2017, 12:16
Помогаю со студенческими работами здесь

Прерывания звука через Bluetooth устройства
Столкнулся с проблемой прерывания звука на Bluetooth устройствах примерно в январе-феврале. Прерываться звук по bluetooth стал в нескольких...

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

Формирование задержек в PIC через прерывания
Не могу понять почему период задержки формируемый микроконтроллером на выходе всегда больше в 4 раза чем период срабатывания Timer0....

ATtiny 2313. Бегущие огни через прерывания
Помогите пожалуйста отредактировать/исправить код на авр студио. Задание было таково: - &quot;Создать новую программу&quot;бегающих...

Оценка быстродействия через функцию прерывания типа 21
На языке Си разработать функцию, которая реализует алгоритм пузырьковой сортировки. Оценить быстродействие реализованного алгоритма...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru