Оптический датчик скорости вращения двигателя

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

Модули FC-03 и HC-020K

Оптический датчик скорости FC-03 — это дешевый модуль кодера колес, широко используемый для измерения скорости двигателя. Его можно подключить к любому микроконтроллеру 3,3 В/5 В с помощью набора стандартных перемычек. Модуль часто используется с диском с прорезями.

Оптический датчик скорости вращения двигателя

Есть и еще один дешевый модуль оптического датчика скорости, который называется энкодер HC-020K.

Оптический датчик скорости вращения двигателя

Кодер колеса, измеряющий величину вращения, обычно использует диск разделенный на сегменты-прорези. Диск энкодера крепится к вращающейся части, либо на самом колесе, либо на валу двигателя. Когда колесо вращается, то также вращает диск энкодера.

Оптический датчик скорости вращения двигателя

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

Модуль HC-020K имеет 3 контакта — один для питания (VCC/5 В), второй для заземления (GND/0 В) и третий для выхода сигнала (OUT). Для каждого перехода выходной сигнал меняется либо от высокого к низкому, либо от низкого к высокому (H > L / L > H).

Основными элементами оптического пропускающего датчика, также известного как фотопрерыватель, являются излучатель (передатчик света) и фотодетектор (приемник света). Обычно используются IRED (инфракрасный диод) и фототранзистор, а излучатель располагается напротив детектора. Пропускной датчик подходит для небольших расстояний и узких объектов. Оптическим пропускающим элементом, используемым в модуле HC-020K, является фотоэлектрический датчик WYC-H206.

Оптический датчик скорости вращения двигателяМодуль HC-020K работает с напряжением 5 В постоянного тока и выдает цифровой выходной сигнал в диапазоне от 0 В до 5 В. Он обеспечит выходной сигнал 5 В, когда луч прерывается, и выходной сигнал 0 В, когда луч проходит. Большинство микроконтроллеров могут считывать последовательность выходных импульсов, чтобы рассчитать, какое расстояние и с какой скоростью проехал двигатель. Данный модуль энкодера также оснащен красным светодиодом, указывающим активность выходного импульса.

Обратите внимание, что выходные импульсы обычно подаются на вход прерывания (INT) микроконтроллера для подсчета импульсов и расчета скорости вращения. Просто посмотрите в транспортном средстве известна ли окружность прикрепленного колеса, тогда скорость движения можно легко вычислить.

Но при тестах возникла проблема. Когда напрямую подключили выходной сигнал модуля к Arduino Uno, оказалось что оно считывает больше импульсов, чем видит, и отображает неправильные показания частоты вращения.

При использовании небольшого мотор-редуктора с напряжением 5 В в качестве тестового двигателя, измерили частоту примерно 19 Гц на выводе OUT модуля энкодера. Результирующее значение числа оборотов в минуту будет около 57 (это двигатель со скоростью 60 об/мин). Но Arduino показывала сомнительные значения оборотов. Причем столкнулись с той же проблемой и с упомянутым ранее модулем FC-03. Пришлось подключить конденсатор емкостью 100 нФ между контактом вывода сигнала (OUT) и контактом заземления (GND) модуля HC-020K. После этого модуль стал выдавать хороший цифровой выходной сигнал TTL, которого достаточно для подачи на цифровой вывод ввода-вывода микроконтроллера.

Оптический датчик скорости вращения двигателя

Судя по всему, конструкция модуля HC-020K основана на микросхеме LM393 и не имеет гистерезиса. Вот почему компаратор становится нестабильным в точке перехода.

Оптический датчик скорости вращения двигателя

Другой аналогичный модуль дает более стабильный выходной сигнал без какого-либо дрожания, поскольку в нем используется микросхема инвертора с одним триггером Шмитта — SN74LVC1G14 (КОД SMD = CF5).

Оптический датчик скорости вращения двигателя

Микросхема функционирует как независимый инвертор с входом триггера Шмитта, поэтому он имеет разные входные пороговые уровни для положительного (VT+) и отрицательного (VT-) сигналов, что обеспечивает гистерезис и что делает устойчивым к медленному или шумному входному сигналу.

HC-020K и Arduino UNO

Тут вызывается фрагмент простого кода Arduino, чтобы без особых усилий протестировать настройку энкодера HC-020K. Приведенный код сможет отображать значения числа оборотов в минуту на последовательном мониторе Arduino.

#define encoder_pin 2 //Encoder Signal Input = D2 encoder_pin 2 //Encoder Signal Input = D2
unsigned int rpm;unsigned int rpm;
volatile byte pulses;volatile byte pulses;
unsigned long TIME;unsigned long TIME;
unsigned int pulse_per_turn = 20; //Encoder Disc Resolution = 20 slots!unsigned int pulse_per_turn = 20; //Encoder Disc Resolution = 20 slots!
void count() {void count() {
pulses++;++;
}}
void setup() {void setup() {
rpm = 0;= 0;
pulses = 0;= 0;
TIME = 0;= 0;
Serial.begin(9600);Serial.begin(9600);
pinMode(encoder_pin, INPUT);(encoder_pin, INPUT);
attachInterrupt(digitalPinToInterrupt(encoder_pin), count, FALLING);(digitalPinToInterrupt(encoder_pin), count, FALLING);
}}
void loop() {void loop() {
if (millis() — TIME >= 100) {if (millis() — TIME >= 100) {
detachInterrupt(digitalPinToInterrupt(encoder_pin));(digitalPinToInterrupt(encoder_pin));
rpm = (60 * 1000 / pulse_per_turn) / (millis() — TIME) * pulses;= (60 * 1000 / pulse_per_turn) / (millis() — TIME) * pulses;
TIME = millis();= millis();
pulses = 0;= 0;
Serial.print(«RPM: «);Serial.print(«RPM: «);
Serial.println(rpm);Serial.println(rpm);
attachInterrupt(digitalPinToInterrupt(encoder_pin), count, FALLING);(digitalPinToInterrupt(encoder_pin), count, FALLING);
}}
}}

Также обратите внимание, что каждый импульс представляет собой сегмент на диске кодера. Поскольку диск кодера имеет 20 равноотстоящих друг от друга сегментов, каждый импульс указывает, что диск повернулся на 18 градусов, то есть на 360 градусов разделенных на 20.

Оцените полезность информации:

5 / 5. Голосов: 2

Расскажите, что надо исправить?