Инкрементный поворотный энкодер отправляет данные, когда вал не трогается
Я пытаюсь создать проект Arduino, который подсчитывает импульсы, отправленные кодировщиком.
Я купил Omron E6B2-CWZ5B-2 2000P/R и столкнулся с проблемой: он безостановочно отправляет импульсы, даже когда я к нему не прикасаюсь. Код, который я использую, взят из этого видео.
Я подумал, что проблема в самом кодере, и купил два кодера, как на видео выше (LPD3806-400BM-G5-24C), но столкнулся с той же проблемой.
Когда я подключаю энкодер к портам Arduino 5 В и GND, энкодер как будто вообще не работает (на видео работает без всяких резисторов и т.п.). Мне пришлось использовать другой источник питания — лабораторный блок питания, напряжение которого я установил примерно на 6 В.
Я подключил выход A к цифровому контакту 2, а выход B — к цифровому контакту 3 моего Arduino Uno. Проблема в том, что значения просто начинают увеличиваться и уменьшаться с безумной скоростью, даже если я не прикасаюсь к энкодеру. Если я подключаю только выход A, они идут так, как будто я сильно кручу его влево, если я подключаю только выход B, они идут так, как будто я сильно кручу его вправо. Если я подключу их оба, это будет просто бойня данных, как будто я безумно быстро вращаю их влево и вправо.
Еще одна вещь, которую я заметил: если я подключаю блок питания моей лаборатории до 12 В и выше, кажется, что кодер отправляет еще больше данных в секунду.
Мне удалось заставить его работать должным образом только один раз, и сейчас я не могу это повторить. Я сделал следующее:
Я подключил LPD3806 напряжением 5,5 В от внешнего источника (лабораторный источник питания), взял заземляющий экран энкодера и плотно прижал его к USB-порту Arduino Uno. Спам данных прекратился, и энкодер работал нормально, когда я крутил вал. Но сейчас я не могу повторить это.
Очевидно, что проблема связана с заземлением, но мне интересно, как это исправить, чтобы правильно его использовать. И мне до сих пор интересно, как автор видео выше добился результатов вообще без использования заземляющего щита.
Итак, вопрос — как это исправить и где я ошибся?
Вот несколько схем. Я не знаю, как их правильно делать, поэтому сделал их с помощью Вокви. Итак, читая это, имейте в виду, что:
Я пометил выходные кабели A и B моего кодера LPD3806 как CLK и DT на поворотном кодере с wokwi.com
Символы VCC и GND в самом верху некоторых схем обозначают + и - моего лабораторного источника питания
Я пометил свой заземляющий экран как SW на третьей схеме, чтобы показать, где я его держал, чтобы он работал.
Вот как я попытался запитать его от самого Arduino. Это просто не началось. Нет сигнала; ничего.
Поэтому я запитал его от лабораторного источника питания. Теперь энкодер запустился, но это был просто спам номеров. Когда я увеличил напряжение, спам стал быстрее.
И вот как я однажды заставил его работать, плотно прижав заземляющий экран к USB-порту Arduino (имейте в виду, что в моей схеме я пометил на энкодере заземляющий экран как SW).
Вот код, который я использую:
volatile unsigned int temp, counter = 0; // Эта переменная будет увеличиваться или уменьшаться в зависимости от вращения энкодера
void setup() {
Serial.begin (9600);
pinMode(2, INPUT_PULLUP); // внутренний подтягивающий входной контакт 2
pinMode(3, INPUT_PULLUP); // внутренний подтягивающий входной контакт 3
// Настройка прерывания
//Нарастающий импульс от энкодера активирует ai0(). AttachInterrupt 0 — это цифровой контакт № 2 на большинстве плат Arduino.
attachInterrupt(0, ai0, RISING);
// Нарастающий импульс B от энкодера активирует ai1(). AttachInterrupt 1 — это цифровой контакт № 3 на большинстве плат Arduino.
attachInterrupt(1, ai1, RISING);
}
void loop() {
// Отправляем значение счетчика
if (counter != temp) {
Serial.println (counter);
temp = counter;
}
}
void ai0() {
// ai0 активируется, если цифровой вывод № 2 переключается с LOW на HIGH
// Проверяем контакт 3, чтобы определить направление
if (digitalRead(3)==LOW) {
counter++;
} else {
counter--;
}
}
void ai1() {
// ai0 активируется, если цифровой вывод № 3 переключается с LOW на HIGH
// Проверка с помощью контакта 2, чтобы определить направление
if (digitalRead(2)==LOW) {
counter--;
} else {
counter++;
}
}
Жду ваших ответов и заранее спасибо!
@Do I Care, 👍0
Обсуждение1 ответ
Из технического описания: энкодер E6B2-CWZ5B 2000P/R 0,5M имеет выходную схему. который описывается как открытый коллектор PNP. То есть выходной сигнал колеблется от любого напряжения, на котором работает энкодер (от 12 В до 24 В), до высокого импеданса:
Возможно, вы захотите подключить его к Arduino (5 В?) таким образом. Резисторный делитель балансирован на ~12 В:
Ваш loop()
мог бы быть лучше структурирован, чтобы избежать неатомарных операций чтения, поскольку кажется, что вы используете 8-битный Arduino, а int — 16-битный. Поэтому существует риск того, что ISR повредит счетчик переменных, пока вы пытаетесь прочитать его в loop()
:
void loop() {
// Отправляем значение счетчика
noInterrupts() ;
int counter_copy = counter ;
interrupts() ;
if (counter_copy != temp) {
Serial.println (counter_copy);
temp = counter_copy;
}
}
Спасибо за Ваш ответ! Но дело в том, что раньше я пробовал это с Omron, питая его от адаптера 12 В. Сейчас пробую с LPD3806-400BM-G5-24C, который 5-24В. Как показано на видео выше, он может питаться от Arduino, но, похоже, это не работает. Что я сделал сейчас — я подключил его к внешнему напряжению 5,5 В, и однажды он заработал правильно. Как я это сделал: я взял заземляющий экран и плотно прижал его к USB-порту Arduino Uno. Данные прекратились и работали только тогда, когда я кручу вал. Но я не могу повторить это сейчас. Понятно, что проблема с заземлением, но интересно, как это исправить., @Do I Care
@DoICare. ХОРОШО. Второе устройство, которое у вас есть, LPD3806-400BM-G5-24C, по-видимому, имеет выход с открытым коллектором (NPN), поэтому оно подключено иначе, чем первое, поэтому подключение его к выводу Arduino (на каждую фазу) и использование внутреннего подтягивающего напряжения является правильным. . Энкодер может работать при более высоком напряжении, чем Arduino. Однако также важно, чтобы между Arduino и энкодером была общая земля. В любом случае, покажите схему подключения. Это ближайшее описание данных, которое я нашел с помощью быстрого поиска: domoticx.com/sensor-lpd3806-optical-rotary-encoder, @6v6gt
Я только что посмотрел видео. Красный провод от энкодера можно подключить к Arduino только в том случае, если вы питаете энкодер напряжением 5 В только от Arduino. В противном случае красный провод энкодера должен идти к внешнему источнику питания, и все заземления снова должны быть общими., @6v6gt
Спасибо за ваш ответ еще раз! Я обновил свой вопрос некоторыми схемами, было бы здорово, если бы вы это проверили. Я новичок в электронике, и мне трудно понять, как найти общий язык. Опять же, когда я попытался сделать это, прижав заземляющий экран к USB-порту Uno, это сработало, но только на некоторое время., @Do I Care
Даже если вы используете лабораторный источник питания, все заземления должны быть соединены вместе. То есть земля источника питания, земля Arduino и земля энкодера (а также 0 В и экран, если они есть у энкодера). Таким образом, ваши последние две фотографии установки Uno явно неверны, потому что нет общей точки зрения. Можете ли вы найти лучший технический паспорт для этого кодера LPD3806-400BM-G5-24C?, @6v6gt
- Считывание нескольких поворотных энкодеров
- Инкрементный кодер
- Считывание выходных данных энкодера с помощью оптрона
- Как выбрать входной контакт 600 кГц, разделить его на 4 и сгенерировать низкочастотный сигнал на выходном контакте Arduino
- подсчет оборотов инкрементного энкодера
- Сможет ли Arduino Uno считывать 3-кратные инкрементальные энкодеры?
- Многооборотный потенциометр - это боль, стоит ли вместо этого использовать инкрементный энкодер?
- Необъяснимое поведение int в кодировщике/светодиодном проекте
добавьте пожалуйста схему подключения, @jsotola
Судя по описанию, это похоже на плавающую булавку, хотя у вас уже активированы внутренние подтягивания. Вы написали, что используете внешний источник питания для энкодера. Вы подключили заземление этого источника питания и Arduino? Пробовали ли вы добавить более сильные внешние подтягивающие резисторы (например, от 1 до 4,7 кОм)? На сайте продавца, который я нашел с этим энкодером, утверждается, что его можно подключить напрямую к контакту 5 В Arduino. Хотя вполне возможно, что ваше напряжение находится в нижней части допустимого диапазона напряжения питания энкодера (4,8 В). Напряжение USB может легко снизиться до 4,5 В., @chrisl
@chrisl Я попробовал это с внешними подтягивающими резисторами - не помогло. Но я продвинулся немного вперед! Я сделал все, как и раньше - запитал LPD3806 внешним напряжением 5,5 В, и один раз он заработал нормально. Как я это сделал: я взял заземляющий экран энкодера и крепко прижал его к USB-порту Arduino Uno. Данные прекратились, и энкодер работал правильно только тогда, когда я крутил вал. Но я не могу повторить это сейчас. Понятно, что проблема в заземлении, но интересно, как это исправить, чтобы нормально пользоваться. И мне до сих пор интересно, как автор видео добился результатов вообще без заземляющего щита., @Do I Care
Вам обязательно необходимо подключить все заземления. В вашей электрической схеме отсутствует соединение между землей внешнего источника питания и землей Arduino., @chrisl