Fórum témák

» Több friss téma
Fórum » Arduino Grey-kód encoder
Lapozás: OK   1 / 1
(#) Mengyán hozzászólása Ápr 9, 2022 /
 
Sziasztok! Először is, abszolút kezdő vagyok arduino-ban. Korábban próbálgattam, aztán idő hiányában félretettem. Most akadt egy problémám, amit szerintem tök jól meg lehetne oldani vele. Van egy elektronikám, ami egy két csatornás, Gray-kódos inkrementális jeladót vár bemenetnek. Ez tulajdonképpen egy átfolyásmérő, ami egy szivattyú által szállított folyadék mennyiségét méri. Mivel van rajta elzáró csap, ezért az átfolyási teljesítmény eléggé nem egyenletes. Hibakeresés, fejlesztés céljából ezt a jeladót szeretném helyettesíteni pl egy Arduino Nano-val, mivel baromi macerás tekergetni. (A fúrógépen már túl vagyok, az se sokkal jobb, mint kézzel ) A gondom az, hogy eddig csak a Gray kód fogadásával, feldolgozásával kapcsolatban találtam minta kódokat, nekem pedig küldeni kellene. Megmondom őszintén, azt sem tudom, PWM-ben kellene gondolkozzak, vagy van valami jobb megoldás. A delay-t kihagynám, ha egy mód van rá. A kitöltési tényező jellemzően 50%, a 2-es csatorna késése az 1-eshez képest 25%, a frekvencia 10-800Hz. Tudnátok segíteni, hogy merre induljak el? Sajnos a Google -> "Arduino Grey code encoder" nem vált be, ugyanez decoder-el szintén, mindre az inkrementális jeladó jeleinek feldolgozását hozza.
(#) Bakman válasza Mengyán hozzászólására (») Ápr 9, 2022 /
 
Sok módon meg lehet oldani, pl. késleltetéssel (delay), periódikus megszakítással stb.

Előre:
1: 'a' kimenet magas
2: delay 1 ms
3: 'b' kimenet magas
4: delay 1 ms
5: 'a' kimenet alacsony
6: delay 1 ms
7: 'b' kimenet alacsony
8: delay 1 ms
9: ugrás az első pontra

Ennyi, nem több.

Encoder.jpg
    
(#) Mengyán válasza Bakman hozzászólására (») Ápr 9, 2022 /
 
Erre gondoltam első körben én is. Ezt berakom egy for ciklusba, mert többnyire éppen 100.000-szer kell lefutnia. Az időzítést majd belövöm, hogy nagyjából 15-20 perc alatt fusson le. Amíg ez a ciklus nem ér véget, addig tud foglalkozni mással a proci? Mert hogy közben rá kellene nézni 3 nyomógombra, ha megnyomták, ledet villogtatni, stb. És még soros porton is jó lenne, ha elérhető lenne, hogy bizonyos paraméterekbe (pl ne 1ms-ot várjál, hanem 3-at, vagy épp 0,4-et, vagy ne 100.000-szer csináld, hanem 300.000-szer) jó lenne beleszólni.
A hozzászólás módosítva: Ápr 9, 2022
(#) vargham válasza Mengyán hozzászólására (») Ápr 9, 2022 / 1
 
A CPU egyszerre egy dologgal tud foglalkozni. Azt tudod megtenni, hogy csak akkor foglalja le a CPU-t, ha változásra van szükség.
A legelegánsabb, ha az AB kimenet generálását timer interruptba teszed, a gombok állapotváltozásának detektálását pedig pin change interruptba. Akkor a főprogram csak a nyomógombok megnyomása utáni funkciókat fogja végezni. Ez csak látszólag párhuzamos végrehajtás, valójában nem az. A CPU vagy a főprogramot vagy valamelyik megszakításkezelőt hajtja éppen végre, miözben a többi vár.
(#) Mengyán válasza vargham hozzászólására (») Ápr 9, 2022 /
 
Na, ez elég jól hangzik! Remélem, ezekkel a "timer interrupt" és "pin change interrupt" hívószavakra segítőkészebb lesz gugli barátunk. Kb 10 és 1000Hz között kell kapcsolgatnom az AB kimenetet. Gondolom, ha elegendően gyorsan jönnek a timer interruptok, és minden X-edikre változtatok a kimeneten, akkor az X értékével tudom változtatni a frekvenciáját. Vagy ezzel nagyon lefoglalom a procit? Real time nincs nagy szükség változtatásra, de minimum az impulzus özön megindítása előtt jó lenne beállítani, milyen gyorsan jöjjenek. 100.000 impulzus 10Hz-el... hát a főnököm nem örülne neki, hogy ha 3 órán keresztül csak azt várnám, hogy leteljen.
(#) Bakman válasza Mengyán hozzászólására (») Ápr 9, 2022 / 1
 
Az időzítő megszakítás (timer interrupt) periódikus, hacsak másként nem állítod be. Ekkor késleltetés nem kell, csak egy segédváltozó (jelen példában legyen x), azt növeled.

  1. swich(x){
  2. case 0:
  3. 'a' kimenet magas;
  4. case 1:
  5. 'b' kimenet magas;
  6. case 2:
  7. 'a' kimenet alacsony;
  8. case 3:
  9. 'b' kimenet alacsony;
  10. }
  11. x++;
  12. if (x>3){
  13. x=0;
  14. }


Két lépés között a kontroller szabad, lehet mást csinálni. A frekvencia módosításához csak az időzítő periódusidejét kell módosítanod.
(#) Mengyán válasza Bakman hozzászólására (») Ápr 9, 2022 /
 
A frekvencia módosításához csak az időzítő periódusidejét kell módosítanod.
Azt hittem, ez nem módosítható, a void setup()-ban megadom, aztán úgy marad örökre.
Következő: »»   1 / 1
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem