Fórum témák
» Több friss téma |
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.
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.
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
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.
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.
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.
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. |
Bejelentkezés
Hirdetés |