2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-13 06:58
Угловой энкодер - это электромеханическое устройство, которое преобразует вращательное движение в цифровую или аналоговую информацию. Он может вращаться по часовой стрелке или против часовой стрелки. Есть два типа угловых энкодеров: абсолютные и относительные (инкрементальные) энкодеры.
В то время как абсолютный энкодер выдает значение, пропорциональное текущему углу вала, инкрементальный энкодер выдает шаг вала и его направление (в этом случае у нас есть инкрементальный энкодер).
Поворотные энкодеры становятся все более популярными, потому что вы можете использовать две функции в одном электрическом модуле: простой переключатель для подтверждения операций и поворотный энкодер для навигации, например через меню.
Инкрементальный датчик угла поворота генерирует два выходных сигнала, пока его вал вращается. В зависимости от направления один из сигналов опережает другой. (см. ниже)
Шаг 1: понимание выходных данных
Как вы можете видеть, когда вал энкодера начинает вращаться по часовой стрелке, сначала выход A падает до LOW, а выход B следует за ним. При вращении против часовой стрелки операция меняется на противоположную.
Теперь нам просто нужно реализовать это в нашем µController (я использовал Arduino Nano).
Шаг 2: Постройте схему
Как я описал ранее, выходы создают ВЫСОКИЙ и НИЗКИЙ фланки. Чтобы получить чистый HIGH на выводах A и B данных µController, мы должны добавить резисторы Pull-Up. Общий контакт C идет прямо на землю для НИЗКОГО фланга.
Для получения информации о внутреннем переключателе (кнопочном) мы будем использовать два других контакта. Один из них идет в VCC, а другой - на контакт данных µController. Мы также должны добавить резистор Pull-Down к выводу данных, чтобы получить чистый НИЗКИЙ уровень.
Также можно использовать внутренние резисторы Pull-Up и Pull-Down вашего µController!
В моем случае распиновка выглядит так:
- +3, 3V => +3, 3V (Arduino) (также возможно + 5V)
- GND => GND (Ардуино)
- A => Pin10
-
B =>
Штырь
11
- C => GND
-
SW =>
Штырь
12
Шаг 3: Написание кода
int pinA = 10; // внутренний переключатель A int pinB = 11; // внутренний переключатель B int pinSW = 12; // переключение (нажатый кодировщик) int encoderPosCount = 0; // начинается с нуля, измените, если хотите
int positionval;
bool switchval; int mrotateLast; int mrotate;
void setup () {
int mrotateLast = digitalRead (pinA); Serial.begin (9600); задержка (50); }
недействительный цикл () {readencoder (); если (readswitch () == 1) {Serial.println ("Switch = 1"); }}
int readencoder () {
mrotate = digitalRead (pinA); if (mrotate! = mrotateLast) {// ручка вращается if (digitalRead (pinB)! = mrotate) {// переключатель A изменился первым -> вращение по часовой стрелке encoderPosCount ++; Serial.println («повернут по часовой стрелке»); } else {// сначала изменился переключатель B -> энкодер вращающийся против часовой стрелкиPosCount--; Serial.println («повернут против часовой стрелки»); }
Serial.print ("Позиция кодировщика:"); Serial.println (encoderPosCount); Serial.println (""); } mrotateLast = mrotate; return encoderPosCount; } bool readswitch () {
if (digitalRead (pinSW)! = 0) {// переключатель нажат
while (digitalRead (pinSW)! = 0) {} // переключатель в данный момент нажат switchval = 1; } else {switchval = 0;} // переключатель не нажат return switchval; }
Теперь вы можете повернуть энкодер, и переменная encoderPosCount будет отсчитывать вверх, если вы вращаете по часовой стрелке, и обратный отсчет, если вы вращаете против часовой стрелки.
Вот и все! Просто и полезно.
Не стесняйтесь изменять и выполнять код. Вы можете реализовать это в своем проекте.
Я также загружу проект светодиода, в котором я использовал кодировщик, чтобы установить яркость своих светодиодов.