[Решенная] библиотека роторного энкодера для Keyes KY-040

P2baron
Ср 30 мая 2018 г. 8:49
Может ли кто-нибудь указать мне на работающую библиотеку Rotary Encoder, которая работает с Bluepil Board ICM A-040 Encoder?
Спасибо

Пито
Ср 30 мая 2018 г., 10:30
В этом энкодере KY -040 нет ничего особенного - это стандартный дешевый энкодер, используемый многими здесь.
Поиск "Encoder" дает вам 280 совпадений..

Мадиас
Ср 30 мая 2018 г. 15:59
Вы можете попробовать мой код, который я написал несколько лет назад
ViewTopic.PHP?F = 18&t = 15&P = 21

Мэнни
Ср 30 мая 2018 г., 16:15
enum { PinA=PB4, PinB=PB5, IPINMODE=INPUT_PULLUP }; static byte abOld; // Initialize state volatile int count; // current rotary count int old_count; // old rotary count void setup() { pinMode(PinA, IPINMODE); pinMode(PinB, IPINMODE); attachInterrupt(PinA, pinChangeISR, CHANGE); // Set up pin-change interrupts attachInterrupt(PinB, pinChangeISR, CHANGE); abOld = count = old_count = 0; Serial.begin(115200); Serial.println("Starting Rotary Encoder Test"); } // On interrupt, read input pins, compute new state, and adjust count void pinChangeISR() { enum { upMask = 0x66, downMask = 0x99 }; byte abNew = (digitalRead(PinA) << 1) | digitalRead(PinB); byte criterion = abNew^abOld; if (criterion==1 || criterion==2) { if (upMask & (1 << (2*abOld + abNew/2))) count++; else count--; // upMask = ~downMask } abOld = abNew; // Save new state } void loop() { if (old_count != count) { Serial.print(millis()); Serial.print(" "); Serial.println(count); old_count = count; } }

Олли
Ср 30 мая 2018 г., 16:37
Метод прерывания не работает с механическими кодерами из-за шума и перекрестных разговоров. Фильтр RC может быть использован для решения этого, но может быть трудно найти баланс между фильтрацией и пропущенными высокоскоростными реальными импульсами. Мой собственный вывод заключается в том, что только программный фильтр с избирательными работами. В F103C8 мое приложение проводит опрос на скорости 10 кГц, не вызывая заметной нагрузки ЦП.

Вы можете найти больше иллюстраций здесь http: // olliesworkshops.блог.com/201 ... ведьма.HTML

Пито
Ср 30 мая 2018 г., 17:06
@Ollie: Crosstalls - это трудно поверить, что «перекрестные помехи» можно увидеть с помощью кодера.
Как вы это измеряли?
Мы используем гораздо более быструю передачу сигналов (то есть SPI, I2C) с аналогичными кабелями, без проблем перекрестных помех, не упомянутых в прошлом..

Олли
Ср 30 мая 2018 г., 17:29
Пито,

Вы можете измерить его с помощью осциллографа или логического анализатора. Пожалуйста, посмотрите на скриншоты Logi Analyzer в моем блоге, где продемонстрированы наблюдения.

Мэнни
Ср 30 мая 2018 г., 20:05
[Олли - Ср 30 мая 2018 г. 16:37] - Метод прерывания не работает с механическими кодерами из-за шума и перекрестных разговоров. Фильтр RC может быть использован для решения этого, но может быть трудно найти баланс между фильтрацией и пропущенными высокоскоростными реальными импульсами. Мой собственный вывод заключается в том, что только программный фильтр с избирательными работами. В F103C8 мое приложение проводит опрос на скорости 10 кГц, не вызывая заметной нагрузки ЦП.

Вы можете найти больше иллюстраций здесь http: // olliesworkshops.блог.com/201 ... ведьма.HTML
У меня никогда не было пропущенного чтения с этим кодом и KY-040, я поставил пару конденсаторов с низкой стоимостью тантала в качестве страховки.

Пито
Ср 30 мая 2018 г., 8:21 вечера
Кстати, даже самые большие продюсеры, такие как Rigol, Siglent Cope с кодерами постоянно.. Люди говорят, что создать хорошо работающий энкодер HW/SW - нелегкая задача даже для меньших игроков, таких как Tek, Keysight, Lecroy и другие :)

Fredbox
Ср 30 мая 2018 г. 11:04
Я использовал Systick Interrupt, чтобы опросить энкодер один раз за миллисекунду с государственной машиной, чтобы сказать, какой и как быстро он движется. Никаких конденсаторов не требовалось. Это отлично сработало для громкости и настройки на радио, которое я построил пару лет назад. Я получил идею штата из машины от здесь Но я не использовал часть ускорения его кода.

Пито
Чт 31 мая 2018 г., 6:41
Я построил несколько DDS VFOS (около 2000 года) на PIC16F628 и PIC16F675/6, с кодерами Bourns (с контентом и без цикла 1/4 и полного цикла на заряд), без фильтрационных конденсаторов. Это работало с опросом внутри 3.Прерывание 9 кГц и с ускорением. Кодировано в ассемблере или C. Это сработало нормально. У меня все еще есть 2 работа.
http: // www.бурнс.COM/DOCS/DATA PRODUCT ... F8C470F5_1

Вот пример, как были сделаны опросы и решение об изменении (ENA и ENB являются входными данными): encstat = rl (encstat); // shift encstat two bits left to get previous... encstat = rl (encstat); // ...encoder sample in bits 3..2 encstat &= 0b00001100; // strip garbage other than bits 3..2 // encstat_tmp = 0b00000000; encstat_tmp.0 = ENA; encstat_tmp.1 = ENB; // encstat |= encstat_tmp & 0b00000011; // put current encoder sample in bits 1..0 if (ENC_TYPE_QD) { switch (encstat){ case 0b0000: goto enc_done; // 00 -> 00 = no change case 0b0001: goto enc_inc; // 00 -> 01 = increment case 0b0010: goto enc_dec; // 00 -> 10 = decrement case 0b0011: goto enc_done; // 00 -> 11 = illegal, ignore case 0b0100: goto enc_dec; // 01 -> 00 = decrement case 0b0101: goto enc_done; // 01 -> 01 = no change case 0b0110: goto enc_done; // 01 -> 10 = illegal, ignore case 0b0111: goto enc_inc; // 01 -> 11 = increment case 0b1000: goto enc_inc; // 10 -> 00 = increment case 0b1001: goto enc_done; // 10 -> 01 = illegal, ignore case 0b1010: goto enc_done; // 10 -> 10 = no change case 0b1011: goto enc_dec; // 10 -> 11 = decrement case 0b1100: goto enc_done; // 11 -> 00 = illegal, ignore case 0b1101: goto enc_dec; // 11 -> 01 = decrement case 0b1110: goto enc_inc; // 11 -> 10 = increment case 0b1111: goto enc_done; // 11 -> 11 = no change } }

P2baron
Чт 31 мая 2018 г., 11:30
Спасибо за предложения, ребята. Интересные примеры и статьи.
[Мадиас - Ср 30 мая 2018 г. 15:59] - Вы можете попробовать мой код, который я написал несколько лет назад
ViewTopic.PHP?F = 18&t = 15&P = 21
Спасибо, Мадиас, я уже видел твой пост и попробовал его, но не смог заставить его работать. Но это, вероятно, связано с отсутствием навыков кодирования.
[Мэнни - Ср 30 мая 2018 г., 16:15] - enum { PinA=PB4, PinB=PB5, IPINMODE=INPUT_PULLUP }; ...... old_count = count; } }

AG123
Чт 31 мая 2018 г. 14:16
Мне понравились реализации на основе машины Fredbox и Pito, я думаю, что они будут работать довольно хорошо, даже с довольно медленным или нерегулярным опросом : D

P2baron
Чт 31 мая 2018 г., 19:39
Код Мэнни работает как очарование! Спасибо, Мэнни!