Инкрементный поворотный энкодер отправляет данные, когда вал не трогается

Я пытаюсь создать проект 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. Это просто не началось. Нет сигнала; ничего.

Я пытался запитать его от самого 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++;
  }
}

Жду ваших ответов и заранее спасибо!

, 👍0

Обсуждение

добавьте пожалуйста схему подключения, @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


1 ответ


0

Из технического описания: энкодер 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