Юрий, привет. Я следую тему с интересом и здесь, и у cqham фроум. Спасибо за конструкции и за идеи!
Я хочу предложить чтобы попытаться использовать реализации алгоритма и библиотеки управления мех. енкодера
Ben Buxton: Rotary encoder handler for arduino. v1.1 / http://www.buxtronix.net/2011/10/rotary-encoders-done-properly.html
Впервые я встречал это lib 1 год назад в експериментах с DDS AD9850 VFO на AD7C. Потом я смотрел использование при JA2NKD (на Arduino). Много DDS-ов используют ее тоже.
Для мех. енкодер (KY-040, 24 ст.) я только ее използую в разнородние конструкции. Отказов нет, ошибки нет даже тогда, когда енкодер имеет механические проблемы вследствие експлоатации - код просто пропускает неправильная комбинация: сегодня мой первой тестовой енкодер на 1 г и 3 месяца (много експериментов! ), от 24 ст. "осталось" 20 шаги - енкодер работает практически правильно как при старта, только без 4 шагов. Конденсаторов / RC-цепочки нет.
Смотрите как работает, там в линки Ben Buxtonа есть видео.
2 недели назад я "перешел" на STM32F103C8T6, естествено (для меня) "по легкой путь": на STM32duino. Для експеримента, хорошая "игрушка". Наряду с "переводом" за все мои "запасние" библиотеки (как мои инструментов) решил подчинить ето lib для STM32F103C8T6.
Была "потеря времени" с MCU-прерывание STM32, но сработало хорошо. Могу сказать, что енкодер работает все почти-так, как и у Arduino, только Pull-up Resistors я измененил на 680-1k.
Мой фрагмент кода для теста:
attachInterrupt(PA15, rotary_encoder, CHANGE); // RISING, FALLING?
attachInterrupt(PB3, rotary_encoder, CHANGE); // RISING, FALLING?
void rotary_encoder() {
unsigned char result = r.process();
if (result) {
ch_flag = true;
if (result == DIR_CW) {
rx += 1000;
// Serial.println("RIGHT");
}
else {
rx -= 1000;
// Serial.println("LEFT");
}
}
}
думаю легче приспособите для свое использование. Меня любопитно как работает у вашем DDS.
73! LZ2WSG