P2baron
Ср 30 мая 2018 г. 8:49
Может ли кто-нибудь указать мне на работающую библиотеку Rotary Encoder, которая работает с Bluepil Board ICM A-040 Encoder?
Спасибо
Спасибо
Пито
Ср 30 мая 2018 г., 10:30
В этом энкодере KY -040 нет ничего особенного - это стандартный дешевый энкодер, используемый многими здесь.
Поиск "Encoder" дает вам 280 совпадений..
Поиск "Encoder" дает вам 280 совпадений..
Мадиас
Ср 30 мая 2018 г. 15:59
Вы можете попробовать мой код, который я написал несколько лет назад
ViewTopic.PHP?F = 18&t = 15&P = 21
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
Вы можете найти больше иллюстраций здесь http: // olliesworkshops.блог.com/201 ... ведьма.HTML
Пито
Ср 30 мая 2018 г., 17:06
@Ollie: Crosstalls - это трудно поверить, что «перекрестные помехи» можно увидеть с помощью кодера.
Как вы это измеряли?
Мы используем гораздо более быструю передачу сигналов (то есть SPI, I2C) с аналогичными кабелями, без проблем перекрестных помех, не упомянутых в прошлом..
Как вы это измеряли?
Мы используем гораздо более быструю передачу сигналов (то есть SPI, I2C) с аналогичными кабелями, без проблем перекрестных помех, не упомянутых в прошлом..
Олли
Ср 30 мая 2018 г., 17:29
Пито,
Вы можете измерить его с помощью осциллографа или логического анализатора. Пожалуйста, посмотрите на скриншоты Logi Analyzer в моем блоге, где продемонстрированы наблюдения.
Вы можете измерить его с помощью осциллографа или логического анализатора. Пожалуйста, посмотрите на скриншоты Logi Analyzer в моем блоге, где продемонстрированы наблюдения.
Мэнни
Ср 30 мая 2018 г., 20:05
[Олли - Ср 30 мая 2018 г. 16:37] - Метод прерывания не работает с механическими кодерами из-за шума и перекрестных разговоров. Фильтр RC может быть использован для решения этого, но может быть трудно найти баланс между фильтрацией и пропущенными высокоскоростными реальными импульсами. Мой собственный вывод заключается в том, что только программный фильтр с избирательными работами. В F103C8 мое приложение проводит опрос на скорости 10 кГц, не вызывая заметной нагрузки ЦП.У меня никогда не было пропущенного чтения с этим кодом и KY-040, я поставил пару конденсаторов с низкой стоимостью тантала в качестве страховки.
Вы можете найти больше иллюстраций здесь http: // olliesworkshops.блог.com/201 ... ведьма.HTML
Пито
Ср 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 являются входными данными):
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, я думаю, что они будут работать довольно хорошо, даже с довольно медленным или нерегулярным опросом
P2baron
Чт 31 мая 2018 г., 19:39
Код Мэнни работает как очарование! Спасибо, Мэнни!