Энкодер

Тема в разделе "ESP8266, ESP32", создана пользователем TebEnkov2222, 15 авг 2018.

  1. TebEnkov2222

    TebEnkov2222 Гик

    --------------------------GND
    |
    -------------/------------D15 A
    |
    -------------/------------ D2 BUTTON
    |
    -------------/------------ D4 B
    ВСЁ ПОДКЛЮЧЕНО ЧЕРЕЗ ВСТРОЕННЫЕ РЕЗИСТОРЫ...
    (картинка не загружается..)
     
  2. parovoZZ

    parovoZZ Гуру

    Картинка велика, вот и не грузится.
     
  3. TebEnkov2222

    TebEnkov2222 Гик

    Так, Господа... Каким то неведомым мне боком, эта собака (извиняюсь за выражение) заработала.. В общем, я с сайта разраба скачал повторно скетч.. Не знаю, чем он отличается,. Но там почти все так же, как у меня.. Только у меня для проверки вставлен сериал.. Не более.. Код тот же, только мой не работает, а здесь работает...
     
  4. TebEnkov2222

    TebEnkov2222 Гик

    С телефона фоткал, до 100 процентов грузит, и все.. Так три точки и мигают весь день :D
     
  5. TebEnkov2222

    TebEnkov2222 Гик

    Для тех, кто с этим же столкнётся..
    (Паять ничего не надо, работает по встроенным резисторам)
    Код (C++):
    // Объявляем переменные

    int pinA = 4; // Пины прерываний
    int pinB = 15; // Пины прерываний

    volatile long pause    = 50;  // Пауза для борьбы с дребезгом
    volatile long lastTurn = 0;   // Переменная для хранения времени последнего изменения

    volatile int count = 0;       // Счетчик оборотов
    int actualcount    = 0;       // Временная переменная определяющая изменение основного счетчика

    volatile int state = 0;       // Статус одного шага - от 0 до 4 в одну сторону, от 0 до -4 - в другую

    volatile int pinAValue = 0;   // Переменные хранящие состояние пина, для экономии времени
    volatile int pinBValue = 0;   // Переменные хранящие состояние пина, для экономии времени


    void setup()
    {
      pinMode(pinA, INPUT_PULLUP);           // Пины в режим приема INPUT
      pinMode(pinB, INPUT_PULLUP);           // Пины в режим приема INPUT

      attachInterrupt(digitalPinToInterrupt(pinA), A, CHANGE);  // Настраиваем обработчик прерываний по изменению сигнала
      attachInterrupt(digitalPinToInterrupt(pinB), B, CHANGE);  // Настраиваем обработчик прерываний по изменению сигнала

      Serial.begin(9600);             // Включаем Serial
    }

    void loop()
    {
      if (actualcount != count) {     // Чтобы не загружать ненужным выводом в Serial, выводим состояние
        actualcount = count;          // счетчика только в момент изменения
        Serial.println(actualcount);
      }
    }

    void A()
    {
      if (micros() - lastTurn < pause) return;  // Если с момента последнего изменения состояния не прошло
      // достаточно времени - выходим из прерывания
      pinAValue = digitalRead(pinA);            // Получаем состояние пинов A и B
      pinBValue = digitalRead(pinB);

      cli();    // Запрещаем обработку прерываний, чтобы не отвлекаться
      if (state == 0  && !pinAValue &&  pinBValue || state == 2  && pinAValue && !pinBValue) {
        state += 1; // Если выполняется условие, наращиваем переменную state
        lastTurn = micros();
      }
      if (state == -1 && !pinAValue && !pinBValue || state == -3 && pinAValue &&  pinBValue) {
        state -= 1; // Если выполняется условие, наращиваем в минус переменную state
        lastTurn = micros();
      }
      setCount(state); // Проверяем не было ли полного шага из 4 изменений сигналов (2 импульсов)
      sei(); // Разрешаем обработку прерываний

      if (pinAValue && pinBValue && state != 0) state = 0; // Если что-то пошло не так, возвращаем статус в исходное состояние
    }
    void B()
    {
      if (micros() - lastTurn < pause) return;
      pinAValue = digitalRead(pinA);
      pinBValue = digitalRead(pinB);

      cli();
      if (state == 1 && !pinAValue && !pinBValue || state == 3 && pinAValue && pinBValue) {
        state += 1; // Если выполняется условие, наращиваем переменную state
        lastTurn = micros();
      }
      if (state == 0 && pinAValue && !pinBValue || state == -2 && !pinAValue && pinBValue) {
        state -= 1; // Если выполняется условие, наращиваем в минус переменную state
        lastTurn = micros();
      }
      setCount(state); // Проверяем не было ли полного шага из 4 изменений сигналов (2 импульсов)
      sei();

      if (pinAValue && pinBValue && state != 0) state = 0; // Если что-то пошло не так, возвращаем статус в исходное состояние
    }

    void setCount(int state) {          // Устанавливаем значение счетчика
      if (state == 4 || state == -4) {  // Если переменная state приняла заданное значение приращения
        count += (int)(state / 4);      // Увеличиваем/уменьшаем счетчик
        lastTurn = micros();            // Запоминаем последнее изменение
      }
    }
     
  6. AVGN

    AVGN Нуб

    Подскажите, что значит статус одного шага в Вашем коде?
     
  7. TebEnkov2222

    TebEnkov2222 Гик

    [​IMG]
    Вот.. У энкодера 4 состояния. эта переменная означает одно из этих 4 состояний