Mündəricat:

Sadə Rotary Dekoder: 4 addım
Sadə Rotary Dekoder: 4 addım

Video: Sadə Rotary Dekoder: 4 addım

Video: Sadə Rotary Dekoder: 4 addım
Video: Насадка Для Tриммера, Все Гениальное и Просто! 2024, Iyul
Anonim
Image
Image
Sadə Rotary Dekoder
Sadə Rotary Dekoder

Bu təlimat, Arduino Uno R3 istifadə edərək ardıcıl dönən bir kodlayıcının kodunu açmağın sadə bir üsulunu təsvir edir.

Kompakt proqram rutinləri keçid sayını saymaq, təmas sıçrayışını aradan qaldırmaq və fırlanma istiqamətini təyin etmək üçün istifadə olunur. Əlavə komponentlər və axtarış cədvəlləri tələb olunmur.

Kodun fasilə və fasiləsiz versiyaları verilir.

Kodun kəsilmə versiyası yalnız bir kəsmə pininə ehtiyac duyur.

Şəkillər:

  • Açılış fotoşəkili yığılmış kodlayıcıyı göstərir.
  • Ekran görüntüsü, kəsmə versiyasının kodunu və enkoder şaftı saat yönünde və saat əqrəbinin əksinə döndüyündə sayını göstərir.
  • Videoda sürətli fırlanma zamanı sayım göstərilir.

Addım 1: Dövrə Şeması

Dövrə diaqramı
Dövrə diaqramı

Enkoderin bağlama diaqramı şəkil 1 -də göstərilmişdir.

Atlama telləri birbaşa kodlayıcı pinlərinə lehimlənir.

Sayma istiqaməti əksinə olarsa, iki mavi teli dəyişdirin.

Addım 2: Parça siyahısı

Aşağıdakı hissələr https://www.aliexpress.com/ saytından əldə edilmişdir.

  • USB kabel ilə yalnız 1 Arduino UNO R3.
  • 1 yalnız açarı olan ardıcıl fırlanan kodlayıcı (EC11 və ya ekvivalenti).
  • Milə uyğun olan yalnız 1 düymə.
  • 3 yalnız Arduino kişidən kişiyə keçid telləri.

Addım 3: nəzəriyyə

Nəzəriyyə
Nəzəriyyə

Ardıcıl fırlanan kodlayıcılar, hər biri Şəkil 1-də göstərildiyi kimi 90 dərəcə yerdəyişən iki kvadrat dalğa yaradır.

Kontakt A və Kontaktı B -də məntiq nümunələri, mil 1 -dən 6 -cı mövqelərə qədər saat yönünde (CW) və saat əqrəbinin əksinə (CCW) döndərildikdə fərqlidir.

Dönmə istiqamətini təyin etməyin ümumi üsulları bunlardır:

  • aparat
  • əkiz kəsmə
  • model axtarış masaları

Bu layihə, axtarış masaları tələb etməyən bir proqram metodundan istifadə edir. [1]

İstiqamət

Əlaqə A və Əlaqə B -dən çıxış nümunələrinə baxmaq əvəzinə A Kontaktına diqqət edək.

Hər Əlaqə A keçidindən sonra B Əlaqəsini nümunə götürsək, qeyd edirik:

  • Kontakt A və B Əlaqəsi, kodlayıcı CW döndərildikdə əks məntiq vəziyyətlərinə malikdir
  • Kontakt A və B Əlaqəsi, kodlayıcı CCW döndərildikdə eyni məntiq vəziyyətinə malikdir

Həqiqi kod:

// ----- Keçidləri sayın

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

Bu üsul aşağıdakı üstünlükləri təqdim edir:

  • axtarış masaları tələb olunmur
  • yalnız bir fasilə xətti tələb olunur

Çıxmaq

Bütün mexaniki kodlayıcılar "əlaqə sıçrayışından" əziyyət çəkirlər.

Bir keçid kontaktı təmiz bir şəkildə açmazsa/açmazsa, məntiq vəziyyəti, keçid kontağı oturana qədər YÜKSƏDƏN LOW -a qədər sürətlə salınacaq. Bu, yanlış hesablamalarla nəticələnir.

Kontakt sıçrayışını basdırmağın bir yolu, hər keçid kontaktına kiçik bir kondansatör əlavə etməkdir. Kondansatör və əlaqəli çəkmə rezistoru yüksək tezlikləri təsirli şəkildə qısaldan və açar gərginliyinin zərif bir şəkildə yüksəlməsinə/düşməsinə imkan verən bir inteqrator təşkil edir.

Bu yanaşmanın dezavantajı, enkoder şaftı sürətlə döndərilərsə keçidlərin qaçırıla bilməsidir.

Proqramın ləğvi

Bu üsul sıfıra təyin edilmiş iki sayğacdan (Açıq, Qapalı) istifadə edir. [2]

A Kontaktında keçid aşkar edildikdə:

  • Əlaqə A. ilə davamlı olaraq sorğu aparın.
  • Açıq sayğacı artırın və A Kontaktı YÜKSƏK olduqda Qapalı sayğacı sıfırlayın.
  • Bağlı sayğacı artırın və A saytı aşağı olduqda Açıq sayğacı sıfırlayın.
  • Sayğaclardan biri əvvəlcədən müəyyən edilmiş saya çatdıqda döngədən çıxın. Hər hansı bir əlaqə sıçrayışından sonra sabit vəziyyət dövrünü effektiv şəkildə axtarırıq.

Həqiqi kod:

// ----- Əlaqədən çıxın A

while (1) {if (digitalRead (ContactA)) {// ----- ContactA Open Closed = 0; // Boş əks inteqrator Open ++; // İnteqrasiya edin (Aç> MaxCount) YÜKSƏK qaytararsa; } else {// ----- ContactA Bağlıdır Açıq = 0; // Boş əks inteqrator Qapalı ++; // (Qapalı> MaxCount) LOW aşağı qaytarsa inteqrasiya edin; }}

Kontakt A və Kontak B keçişləri üst -üstə düşmədiyindən B Əlaqəsini ləğv etməyə ehtiyac yoxdur.

Saymaq

Mexanik bir "tutma", klik arasında iki say qeydə alındığı üçün sayınızı təsirli şəkildə iki qat artırır (bax şəkil 1).

"Tutulanların" sayı aşağıda göstərildiyi kimi modulo 2 arifmetikindən istifadə etməklə müəyyən edilə bilər.

Həqiqi kod:

// ----- "saxlanılanları" sayın

if (Say % 2 == 0) {Serial.print ("Say:"); Serial.println (Count / 2); }

İstinadlar

Əlavə məlumatı buradan əldə etmək olar:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Addım 4: Proqram təminatı

Bu layihə, https://www.arduino.cc/en/main/software saytında mövcud olan Ardino Uno R3 IDE (inteqrasiya edilmiş inkişaf mühiti) son versiyasını tələb edir.

Aşağıdakı iki Arduino eskizinin hər birini yükləyin (əlavə olunur)

  • rotary_encoder_1.ino (sorğu versiyası)
  • rotary_encoder_2.no (kəsmə versiyası)

İstədiyiniz versiyanı iki dəfə vurun və ekrandakı təlimatları izləyin.

Zövq alın…

Digər təlimatlarımı görmək üçün bura vurun.

Tövsiyə: