Оптические энкодеры

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем AlexTeos, 26 окт 2014.

  1. AlexTeos

    AlexTeos Нерд

    Приобрел вот такие оптические энкодеры, что бы контролировать передвижения робота[​IMG]

    Подключил к 2 и 3 пину для работы с помощью прерываний (драйвер двигателя ни к чему не подключен)
    [​IMG] [​IMG] [​IMG]
    Код (Text):
    int enc_l_count,enc_r_count;
    boolean changed;

    void l_inc(){
      enc_l_count++;
      changed = true;
    }

    void r_inc(){
      enc_r_count++;
      changed = true;
    }

    void setup() {              
      Serial.begin(9600);

      enc_l_count = 0;
      enc_r_count = 0;
      //Encoders
      attachInterrupt(0, r_inc, RISING);
      attachInterrupt(1, l_inc, RISING);

      changed = false;
    }

    bool write(){
      Serial.print("Left: ");
      Serial.print(enc_l_count);
      Serial.print("  Right: ");
      Serial.println(enc_r_count);
    }

    void loop() {
      if (changed){
        write();
        changed = false;
      }
    }
    В итоге получаются такие результаты
    [​IMG]

    Показания крайне не стабильные, шаг всегда разный, часто происходят огромные скачки, в чем может быть причина?
     
    Последнее редактирование: 26 окт 2014
  2. geher

    geher Гуру

    Для начала перед int enc_l_count,enc_r_count; вроде как лучше добавить volatile для предотвращения изменения переменной в функции обработки прерывания при обращении к ней в основной программе.
    перед boolean changed; тоже.
     
  3. ANV

    ANV Гуру

    Схематику датчиков или фото крупным планом выложите.
    Проблема может быть в паразитной засветке фотодиода и если у датчика нет триггера Шмидта, тогда на один фронт может быть выдана целая пачка ложных.
     
  4. AlexTeos

    AlexTeos Нерд

    [​IMG] [​IMG]
    http://www.aliexpress.com/store/pro...-intelligent-barrowload/803038_875509122.html
     
  5. AlexTeos

    AlexTeos Нерд

    К сожалению ничего не изменилось