blogy logo
login PRIHLÁS SA
BLOG deadawp
ČLÁNKY
DISKUSIE
3
SLEDUJETE BLOG
PHP, Arduino programátor
deadawp



Digitálny potenciometer, prerušenie, debouncing
pridal deadawp 28.10. 2020 o 9:09



Cieľom dnešného článku bude poukázať na možnosť využitia potenciometra a fotoelektrického snímača otáčok spoločne v jednom projekte. Vo výsledku potenciometer bude slúžiť ako výstup pre odhad rýchlosti pre vyšší systém (neimplementovaný v tomto článku). V našom prípade využijeme 8 bodov pripevnených na koleso vozidla, ktoré bude zaznamenávať fotoelektrický snímač. Počet zaznamenaných prechodov bodov cez snímač sa v stanovený čas sčíta a odošle ako počet krokov do digitálneho potenciometra.

Technické informácie o vozidle (el. rušeň triedy 362) - Železnice 600 Vracov:

  • vmax = 20km/h / 3,6 =  5,55 m/s,
  • D = 0,45 m (priemer kolesa),
  • obvod = pi*D = pi*0,45m ≐ 1,413m, --> vzdialenosť, ktorú koleso prejde na jedno otáčku
  • n = vmax/obvod, teda n =  3,88-krát sa otočí koleso za 1 sekundu pri maximálnej rýchlosti,
  • T.j. 3,88*8 pulzy ≐ to predstavuje 31 pulzov na sekundu pri maximálnej rýchlosti,
  • Medzi jednotlivými pulzami bude pri maximálnej rýchlosti pauza cca 32.25ms,
  • Tento interval je možné použiť pre rozlíšenie dvoch po sebe idúcich signálov (deboucing)
  • Debouncing zamedzuje, aby boli do výsledného počtu pulzov započítané zákmity.

Potenciometer je variabilný rezistor. Existuje najčastejšie v mechanickom vyhotovení s bežcom, avšak samostatnú kategóriu zastávajú aj digitálne potenciometre, ktoré je možné nastavovať elektricky. Tie je možné nastaviť v rozsahu na ktorý sú navrhnuté s určitým odstupňovaním (krokom), o ktorý je možné minimálne navyšovať jeho hodnotu. Štandardne má do 255 krokov, alebo menej (byte).

Digitálny potenciometer X9C103S, ktorý bol pre túto implemnetáciu použitý má rozsah 0 až 10 kohm, pričom je ho možné prenastaviť v 100 krokoch, ktoré majú identickú hodnotu. To znamená, že medzi každý krokom je rozdiel 100 ohm. Prúdové zaťaženie potenciometra na výstupe je max 4.4mA, preto sa nehodí do výkonových sústav, ale iba ako signalizačná súčiastka. V tejto implementácii bude reportovať vyššiemu systému počet prechodov (pulzov) za jednotku času, to znamená, že v určitom cyklickom intervale sa pošle počet pulzov za daný čas, ktoré Arduino načítalo. Pre pre prepojenie s Arduinom využíva potenciometer až 3 dátové vodiče (CS, INC, U/D) + napájanie.

Fotoelektrický snímač (RobotDYN) je založený na infračervenom vysielači a prijímači. Štandardne je prijímač schopný detegovať signál z vysielača, ktorý vysiela nepretržite. Tento výstup prijímača je priamo pripojený k DOUT (Digital Out) výstupu modulu. Teda v prípade prechodu bodu medzi vysielačom a prijímačom sa na výstupe DOUT objaví logická 0 - LOW.  Senzor má dostupný aj analógový výstup, ktorý však v dnešnom článku nevyužijeme.

Arduino je schopné tento signál načítavať v prerušení, pričom sa zaoberá zostupnou hranou signálu z HIGH to LOW. Tento jav so zostupnou hranou nazývame aj FALLING. Na typ zmeny CHANGE (z LOW do HIGH, alebo naopak), RISING (vzostupná hrana), LOW prerušenie nezareaguje. Nežiadúci jav, ktorý nastáva je zvlnenie signálu, ktoré môže byť zapríčinené rôznymi javmi, napríklad nestálosť signálu, slabá filtrácia, pomalý prechod bodu popred snímač a iné... Vo výsledku to môže zapríčiniť, že jeden reálny signál načítame niekoľko krát z dôvodu zákmitov, ktoré sa na ňom objavili.

Existujú rôzne spôsoby, predovšetkým pre optimalizáciu takéhoto signálu hardvérovou formou napríklad využitím kondenzátora, ktorý daný zákmit dokáže eliminovať, predĺži častokrát aj jeho dĺžku dobehom napäťovej úrovne. Zákmit je veľmi krátky, trvá maximálne pár jednotiek milisekúnd. 

Riešením je aj softvérový debounce, kedy prerušenie FALLING zareaguje na prechod z HIGH do LOW úrovne, avšak využívame aj overenie času, či je medzi signálmi aspoň x milisekúnd. Nakoľko z predchádzajúceho prepočtu vieme, že medzi pulzami bude 32 milisekúnd pri maximálnej rýchlosti rušňa, môžeme zvoliť pokojne 15 až 30ms debounce. To zaručí, že načítame až ďalší signál a nie zvlnenie existujúceho signálu. Obdobný debouncing sa využíval napríklad v projekte so zrážkomerom Hydreon RG-11.

Všetky premenné, ktoré sa využívajú v prerušení, musia byť typu volatile, aby ich prerušenie obslúžilo. V našom prípade máme volatile premenné pre počet pulzov (int) a čas (unsigned long) načítaný z funkcie millis(). Prerušenie (v prípade dosky Arduino Uno) je možné využiť iba pre vývody s podporou prerušenia, t.j. D2, D3.

V systéme sa využíva počítadlo millis(), ktoré raz za 1000ms prerušenie odpojí. Následne Arduino zapíše hodnotu načítaných signálov ako počet krokov na digitály potenciometer, vynuluje počítadlo a následne opäť obnoví prerušenie. Čas 1000ms pre vyhodnotenie je iba ukážkový a je v systéme plne konfigurovateľný prostredníctvom UART monitoru, kedy je možné zapísaním znakov +, respektíve - pripočítať a odpočítať 100ms (DEV test účely).

Nakoľko je možné na digitálny potenciometer X9C103S  zapísať hodnoty 0 až 100, nesmieme presiahnuť 100 krokov. Optimálne je teda zaznamenávať pulzy max 3 sekundy (31 pulzov na sekundu pri maximálnej rýchlosti 20km/h), aby sme zaručili počet krokov pod 100, prípadne ich môžeme priemerovať / vydeliť počtom prechodov, čím získame počet otáčok kolesa ako takého.

Samotný prepočet už realizuje C# aplikácia na počítači, ktorá určí aktuálnu rýchlosť vozidla a dokáže túto rýchlosť vizualizovať aj na monitore lokomotívy. Nakoľko update prebieha štandardne každých 1000ms, zmena rýchlosti na monitore nie je skokovitá na analógovom vizualizéri (na štýl analógového ručičkového voltmetra). Počítač je pripojený priamo k výstupu potenciometra X9C103S.

Potenciometer X9C103S má určitú odchýlku na nastavenej hodnote odporu v rozmedzí 10 až 20%, reálne je cca do 12% s čím treba počítať.

Schéma pre pripojenie potenciometra k Arduinu:

Programová implementácia: https://gist.github.com/martinius96/d1befbb807ff76562e634fa7c9cf00c5



Prístupov 2755
Kvalita článku
hlasov 0

PRÍSPEVKY
SLEDOVAŤ
Prosím prihláste sa pre možnosť pridania komentáru.
Prihláste sa, alebo použite facebook login facebook login
ĎALŠIE ČLÁNKY V BLOGU
Práca s obrázkami - MATLAB
[ 19.7.2021] (príspevkov 1)
Flash Encryption a jeho implementácia v ...
[ 18.7.2021] (príspevkov 0)
Secure Boot V1 a jeho implementácia v ES...
[ 13.7.2021] (príspevkov 0)
Senzor Bosch BME280 v prostredí ESP-IDF
[ 8.7.2021] (príspevkov 0)
Podpora ESP32 do projektu WiFi termostat
[ 1.7.2021] (príspevkov 0)
Beamforming vizualizácia - MATLAB
[ 29.6.2021] (príspevkov 0)
Výroba DPS - AISLER - RFID DOMINATOR
[ 18.6.2021] (príspevkov 0)
Podpora ESP-IDF do projektu Hladinomer
[ 4.6.2021] (príspevkov 0)
WiFi termostat - Rozšírenie o manuálny r...
[ 28.3.2021] (príspevkov 0)
RFID DOMINATOR - stopky pre Airsoft | Pa...
[ 14.3.2021] (príspevkov 0)