Съдържание:

Прост ротационен декодер: 4 стъпки
Прост ротационен декодер: 4 стъпки

Видео: Прост ротационен декодер: 4 стъпки

Видео: Прост ротационен декодер: 4 стъпки
Видео: Проверка перепада высот ленточного фундамента ротационным нивелиром ADA Rotary 500 HV Servo 2024, Ноември
Anonim
Image
Image
Прост ротационен декодер
Прост ротационен декодер

Тази инструкция описва прост метод за декодиране на последователен въртящ се енкодер, използващ Arduino Uno R3.

Компактните софтуерни процедури се използват за преброяване на броя на преходите, премахване на скачането на контактите и определяне на посоката на въртене. Не се изискват допълнителни компоненти и справочни таблици.

Предоставят се версии на кода с непрекъсване и непрекъсване.

Версията на прекъсване на кода изисква само един щифт за прекъсване.

Изображения:

  • Първата снимка показва сглобения енкодер.
  • Снимката на екрана показва кода за версията на прекъсване и броя, когато валът на енкодера се завърти по посока на часовниковата стрелка и обратно на часовниковата стрелка.
  • Видеото показва броя при бързо въртене.

Стъпка 1: Електрическа схема

Електрическа схема
Електрическа схема

Схемата на свързване на енкодера е показана на фиг.1.

Проводниците на джъмпера са запоени директно към щифтовете на енкодера.

Разменете двата сини проводника, ако посоката на броене е обърната.

Стъпка 2: Списък на частите

Следните части са получени от

  • 1 само Arduino UNO R3 с USB кабел.
  • 1 само последователен въртящ се енкодер (EC11 или еквивалентен) с превключвател.
  • 1 само копче, за да отговаря на вала.
  • 3 само джъмперни проводници от мъжки към мъжки Arduino.

Стъпка 3: Теория

Теория
Теория

Последователните въртящи се енкодери генерират две квадратни вълни, всяка от които е изместена с 90 градуса, както е показано на фиг.1.

Логическите модели при контакт А и контакт В са различни, когато валът се завърта по посока на часовниковата стрелка (CW) и обратно на часовниковата стрелка (CCW) през позиции 1 до 6.

Общите методи за определяне на посоката на въртене включват:

  • хардуер
  • близнаци прекъсва
  • таблици за търсене на шаблони

Този проект използва софтуерен метод, който не изисква справочни таблици. [1]

Посока

Вместо да разглеждаме изходните модели от контакт А и контакт В, нека се съсредоточим върху контакт А.

Ако изпробваме контакт B след всеки преход на контакт A, отбелязваме, че:

  • Контакт А и контакт В имат противоположни логически състояния, когато енкодерът се завърти CW
  • Контакт А и контакт В имат едно и също логическо състояние, когато енкодерът е завъртян CCW

Действителен код:

// ----- Брой преходи

CurrentStateA = stateContactA (); if (CurrentStateA! = LastStateA) {CurrentStateB = digitalRead (ContactB); if (CurrentStateA == CurrentStateB) Count ++; if (CurrentStateA! = CurrentStateB) Брой-; LastStateA = CurrentStateA; }

Този метод предлага следните предимства:

  • таблици за търсене не са необходими
  • е необходим само един ред за прекъсване

Дебаунс

Всички механични енкодери страдат от „отскачане на контакт“.

Ако контактът на превключвателя не направи/прекъсне чисто, логическото му състояние ще се колебае бързо от ВИСОКО до НИСКО, докато контактът на превключвателя не се установи. Това води до фалшиво преброяване.

Един метод за потискане на отскачането на контакти е добавянето на малък кондензатор към всеки контакт на превключвателя. Кондензаторът и свързаният с него резистор за издърпване образуват интегратор, който ефективно къси високи честоти и позволява на напрежението на превключвателя да се покачва/пада грациозно.

Недостатъкът на този подход е, че може да се пропуснат преходи, ако валът на енкодера се завърти бързо.

Деблокиране на софтуер

Този метод използва два брояча (отворен, затворен), които са настроени на нула. [2]

След като бъде открит преход в контакт А:

  • Постоянно анкетиране Контакт А.
  • Увеличете отворения брояч и нулирайте затворения брояч, винаги когато контакт А е ВИСОК.
  • Увеличете затворения брояч и нулирайте отворения брояч, винаги когато контакт А е НИСКИ.
  • Излезте от цикъла, когато един от броячите достигне предварително определен брой. Ние ефективно търсим стационарен период след всяко отскачане на контакт.

Действителен код:

// ----- Дебаунс контакт А

while (1) {if (digitalRead (ContactA)) {// ----- ContactA е отворен затворен = 0; // Празен противоположен интегратор Open ++; // Интегрирайте if (Open> MaxCount) return HIGH; } else {// ----- ContactA е затворен Open = 0; // Празен противоположен интегратор Затворен ++; // Интегриране if (Затворено> MaxCount) връщане LOW; }}

Няма нужда да се отказвате от контакт B, тъй като преходите контакт A и контакт B не съвпадат.

Преброяване

Механичното „задържане“ефективно удвоява вашия брой, тъй като между броя се регистрират два броя (виж фиг. 1).

Броят на „задържащите“може да се определи, като се използва аритметика по модул 2, както е показано по -долу.

Действителен код:

// ----- Брой "детенти"

if (Брой % 2 == 0) {Serial.print ("Брой:"); Serial.println (Брой / 2); }

Препратки

Допълнителна информация може да бъде намерена на:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Стъпка 4: Софтуер

Този проект изисква нова версия на Ardino Uno R3 IDE (интегрирана среда за разработка), която е достъпна от

Изтеглете всяка от следните две скици на Arduino (приложено)

  • rotary_encoder_1.ino (версия за допитване)
  • rotary_encoder_2.no (версия за прекъсване)

Щракнете двукратно върху предпочитаната от вас версия и следвайте инструкциите на екрана.

Наслади се …

Щракнете тук, за да видите другите ми инструкции.

Препоръчано: