Энкодер, передающий значение между шагами
Я пытаюсь подключить кодер и дисплей 1602 i2c. Кажется, мой кодер выдает выходные данные между шагами.
Я постарался сделать свой код максимально простым и вывожу, вращался ли энкодер по часовой стрелке или против часовой стрелки в последовательный порт. Когда я поворачиваю ручку на один физический шаг по часовой стрелке, на последовательный монитор выводится «++» (разделенный новой линией), тогда как я ожидаю только «+». То же самое происходит при вращении против часовой стрелки, за исключением «--» вместо «++».
Детали:
- Совет разработчиков ESP32
- Поворотный энкодер
Код:
#define enc1 32
#define enc2 33
#define button 25
#define led 2;
int oldPos1;
int newPos1;
int newPos2;
void setup() {
pinMode(enc1, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(enc1),encRead,CHANGE);
pinMode(enc2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(enc2),encRead,CHANGE);
Serial.begin(115200);
oldPos1 = digitalRead(enc1);
}
void encRead(){
newPos1 = digitalRead(enc1);
newPos2 = digitalRead(enc2);
if(oldPos1 != newPos1){
if (newPos1 == newPos2){
Serial.println("+");
}
else{
Serial.println("-");
}
}
oldPos1 = newPos1;
}
void loop() {
delay(10);
}
@John Engelman, 👍2
Обсуждение2 ответа
Лучший ответ:
Подобная ситуация может случиться, если вы покупаете дешевые детали, которые
приходят без какой-либо документации: вы не знаете, как они
должно работать! Многие поворотные энкодеры имеют два фиксатора на импульс: если
вы поворачиваете их на один фиксатор, вы получаете один переход на каждом
приколоть. При использовании такого кодировщика вы действительно ожидаете одного +
или
-
печатается для каждого фиксатора. А как насчет энкодера, который ты купил? Ты не можешь
скажите, раз документации нет!
К счастью, один полезный человек оставил полезный отзыв на страница продукта, на которую вы дали ссылку. Это может служить эрзацем таблицы данных:
Каждое движение шпинделя от одного фиксатора к следующему приводит к контакты энкодера1 и энкодера2 проходят несколько переходов, а не один (как и следовало ожидать).
Предполагая, что вы подключили контакты энкодера к (скажем) 5 В с помощью резистор, вращение между фиксаторами, произведет набор энкодера переходы. Например: 11 10 00 01 11 (по часовой стрелке) или 11 01 00 10 11. (против часовой стрелки).
Это объясняет ваше поведение.
Примечание: как пишет jsotola в комментарии, вам следует
удалите enc2
attachInterrupt()
. В качестве обработчика прерываний
явно игнорирует переходы в enc2
(он ничего не делает, если только enc1
изменилось), нет смысла прерывать работу процессора для тех,
игнорируются переходы.
К сожалению, вы не предоставили ссылку на техническое описание кодера.
Одно физическое нажатие ручки может вызвать изменения на обоих контактах. А поскольку вы назначили процедуру обслуживания прерываний на оба контакта, она вызывается два раза для каждого физического шага.
Другая возможная причина — "подпрыгивание" механических контактов в этом энкодере. Это означает, что при переключении между открытием и закрытием генерируется несколько импульсов. Следовательно, прерывания по изменению или по фронту являются правильным решением только в том случае, если вы принимаете во внимание отскок.
Чтобы разобраться в этой проблеме, вы можете добавить переключатели контактов порта в свою процедуру обработки прерываний. Например, установите контакт при входе и сбросьте его при выходе. Затем подключите осциллограф или логический анализатор и сравните входные сигналы и этот выход.
О, и никогда не стоит помещать последовательный вывод в программу обслуживания прерываний. В зависимости от объема отправленных данных и выбранной скорости передачи данных этот вывод будет блокировать процедуру на несколько миллисекунд. В течение этого времени одно и то же прерывание не обслуживается и может быть пропущено в случае нескольких триггеров.
- Считывание нескольких поворотных энкодеров
- Использование поворотных энкодеров с прерываниями смены контактов
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
- Взаимодействие с датчиком SSI?
- Будет ли простой RC-фильтр работать с механическим поворотным энкодером или понадобится триггер Шмитта?
- Проблема с преобразованием выходного сигнала поворотного энкодера в угол.
- Чтение двух квадратурных кодировщиков с помощью одного ардуино
- Поворотный энкодер KY-040 пропускает шаги
удалите enc2
attachInterrupt
, @jsotola