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

Материал из MIK32 микроконтроллер

Оптический энкодер — это электромеханическое устройство, которое формирует выходной электрический сигнал, пропорциональный линейному смещению линейной направляющей или угловому положению входного вала.

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

Современные устройства в основном представляют собой миниатюрные версии датчика приближения с использованием прерывания света. В энкодере сфокусированный луч света, направлен на совмещенный с излучателем фотоприемник, периодически прерывается вращающимся диском, расположенным между приемником и передатчиком света и закрепленный на валу контролируемого объекта. Диск может быть непрозрачным с отверстиями, либо прозрачным с нанесенным на него кодированным рисунком. По сравнению с более сложными преобразователями переменного тока, это простая схема кодирования реализует, по существу, цифровой вывод результатов с оптических датчиков в недорогой надежной конструкции с хорошей помехоустойчивостью.

Есть два основных типа оптических энкодеров: инкрементные и абсолютные. Инкрементный энкодер измеряет скорость вращения и может выдать относительное положение, в то время как абсолютный энкодер измеряет непосредственно угловое положение и на выходе дает скорость. Если не принимать во внимание изменение информации о местоположении, то с инкрементным энкодером, как правило, легче работать и он обеспечивает эквивалентное разрешение при гораздо более низкой стоимости, чем абсолютные оптические энкодеры.

Оптические поворотные инкрементные энкодеры, еще их называют датчиками угла поворота, стали наиболее популярным устройством для измерения угловой скорости и положения в моторах, на валу колеса или рулевого механизма. В мобильных роботах, энкодеры используются для контроля положения или скорости колес и других, управляемых при помощи моторов соединений. Из-за того, что энкодеры являются проприоцептивными датчиками, их оценка положения является лучшей в системе координат робота и, при решении задачи локализации робота.

Принцип действия инкрементного энкодера

Простейшим типом инкрементного энкодера является одноканальный тахометр, обычно состоящий из механического прерывателя света, производящего определенное количество прямоугольных или синусоидальных импульсов, при каждом обороте вала. Увеличение числа импульсов увеличивает разрешение (и стоимость) модуля. Разрешение энкодера измеряется в числе отсчетов на оборот.


Модуль считывания угловых скоростей FC-03 на базе ITR9608 (Энкодер)

Энкодер FC-03

Модуль считывания угловых скоростей, созданный на основе двойного компаратора LM393 и щелевого датчика предназначен для совместного использования со специальными дисками, которые одеваются на вал редуктора или электродвигателя. Таким образом, микроконтроллер получает информацию непосредственно от энкодера о количестве оборотов, проделанных двигателем, и так определяется его скорость.

Диски одеваются на вал редуктора или электродвигателя, чтобы микроконтроллер получал информацию непосредственно от энкодера о количестве оборотов проделанных двигателем.

В одном выступе корпуса расположен инфракрасный светодиод, направленный на фототранзистор находящийся в другом выступе. Если в щель между выступами внести непрозрачную пластину, то ИК излучение от светодиода перекрывается и фототранзистор закрывается. Такой компонент иногда называют фотопрерывателем, но он только фиксирует прерывание светового потока. Как показано на схеме с эмиттера транзистора сигнал поступает в схему прибора.Свет преграждает пластина, закрепленная на подвижной части контролируемого механизма. С помощью датчика определяют перемещение в крайние положения двигающейся плоскости, когда связанный с ней элемент конструкции входит в датчик. Измеряют параметры вращения различных механических деталей. Так происходит преобразование механических параметров в электрические величины и далее в программные значения.

Датчик скорости вращения FC-03 используется для измерения частоты вращения. Определить с его помощью направление вращения нельзя. На валу двигателя или шестерни редуктора устанавливается диск с отверстиями. Оптопара модуля имеет прорезь шириной 5 мм. При вращении диска постоянно в прорези чередуются отверстия и участки пластины. Датчик преобразует чередование элементов диска в электрические импульсы. Электроника модуля делает сигнал датчика пригодным для восприятия цифровыми логическими микросхемами или микроконтроллером.

Особенности:
  • Рабочее напряжение: 3.3 Вольт ~5.0 Вольт;
  • Ток потребления энкодера: 1.4 мА;
  • Ширина паза в щелевом датчике: 5 мм —  между передатчиком (инфракрасным светодиодом) и приемником (инфракрасным фототранзистором);
  • Используется микросхема: LM393 (двойной компаратор) с широким диапазоном питающего напряжения;
  • Форма выходного сигнала:
  • импульсы прямоугольной формы TTL  (0 и 1)
  • и аналоговый сигнал по величине чувствительности ;
  • Плата модуля: PCB (англ. printed circuit board) — печатная плата;
  • LED (светодиоды) индикаторы питающего напряжения и цифрового выходного сигнала: низкий уровень, светодиод горит, высокий уровень-светодиод гаснет;
  • Вес: 8 г ;
  • Размеры  (ДxШxВ) прибл.: 32 x 14 x 10 мм;
  • Диаметр отверстия для монтажа датчика оборотов: 3 мм;
  • Рабочая температура: от 0 ° C ~ + 70 ° C;
Подключение:
  • VCC: напряжение: + 3.3 Вольт ~5.0 Вольт;
  • DO: Цифровой выход;
  • AO: Аналоговый выход;
  • GND: напряжение: — 3.3 Вольт ~5.0 Вольт.

Пример кода для Arduino, который позволяет определить количество оборотов в минуту и выдает результаты в окно последовательного терминала.

#define PIN_DO 2 //установка контакта используемого в Arduino
volatile unsigned int pulses;
float rpm;
unsigned long timeold;
#define HOLES_DISC 15

void counter(){
  pulses++;
  }

void setup(){
  Serial.begin(9600);
  pinMode(PIN_DO, INPUT);
  pulses = 0;
  timaold = 0;
  attachInterrupt(digitalPinToInterrupt(PIN_DO), counter, FALLING);
  }

void loop(){
  if (millis(( - timeold >= 1000)){
    detachInterrupt(digitalPinToInterrupt(PIN_DO));
    rpm = (pulses * 60) / (HOLES_DISC);
    Serial.println(rpm);
    timeold = millis();
    pulses = 0;
    attachInterrupt(digitalPinToInterrupt(PIN_DO), counter, FALLING);
    }
  }