Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Segítséget szeretnék kérni!
PICkit3 Debug Expressel kezdtem foglalkozni, C-ben. Az AN0 lábon van egy 10k-s poti. A PORTD 8 lábára pedig LED-ek vannak kötve. Szeretném kitenni a poti értékét a LED-ekre AD konvertálás után. Addig eljutottam, hogy a 10 bites értéket (csonkolva a 8 LED-re) kapcsolom, de nem értem hogy lehetne azt megcsinálni, hogy mindig csak egy LED világít az RD0-tól az RD7-ig folyamatosan, ahogy tekerem fel a potit?
Ha az AD konverzió értéke két határ közé esik, akkor begyújtod a hozzá tartozó ledet. Ha másik két határ közé, akkor begyújtod a másik ledet. A határokat meg úgy állapítod meg, hagy annyi tartomány legyen, ahány LED-ed van. Pl. 8 led esetén 0-0,625V között LED0; 0,625-1,25V között LED1, stb.
Köszönöm a gyors választ.
Ha azt sikerult megcsinalni, akkor majd lehet talalkozol egy olyan problemaval, hogy a poti hatarerteknel varial, ket LED felvaltva villog vagy mindketto vilagitani latszik. Ez az AD pontatlansaga ill elekromagneses szorasok miatt lehetnek.
Ezt legegyszerubben dinamikus haterertek allitassal lehet orvosolni. Ez kicsit olyan, mint a schmitt trigger, tehat mikor felfele tekered a potit akkor a hatererteket felfele tolod el, mikor pedig lefele, akkor meg lefele tolod el. emiatt mikor atszokken egy masik hatarpontra, akkor nem tud azonnal vissza szokni az elozo hatarra -- ha erted mire gondolok. Hogy mennyivel a hatarertekeket eltolni az az alkalmazastol ill. az AD variaciojatol fugg.
Hello!
Én is találkoztam már ezzel a problémával! Tudnál nekem esetleg egy kicsit részletesebb példát írni? Vagy ha tudsz olyan oldalt ahol ezt részletesebben elmagyarázzák akkor az is tökéletes lenne vagy akár egy forráskód is. Köszönöm a választ előre is! Bye!
Vannak a fix felso es az also ertekeid, aminel az adott led vilagitana. Ezeket egy tombbe masolod at. A tombbol tortenik a hasonlitgatas. Ha valtas tortenik, akkor az uj ablakban automatikusan a felso x-el magasabb lesz, az also x-el alacsonyabb es visszairod az osszes tobbibe az eredeti ertekeket. Tehat amikor belelepsz az adott ablakba, az ablak szetnyilik, amikor kilepsz belole, osszebb huzodik.
Akkor ha jól értem, az a lényeg, hogy van egy tömböm.
Mondjuk: valtasok[4] = {10,20,30,40}; Ezután ha az A/D konvertálás eredménye nagyobb mint 10 akkor az első LED bekapcsol és a 10-es értékhez hozzáadok mondjuk 2-őt és a következő konvertálás utáni értéket ahhoz mérem. Vagyis amíg nem éri el a 10-et addig semmi nem történik de ha elérte vagy meghaladta de még nem érte el a 20-at akkor meg mondjuk levonok belőle 2-őt és ezért 8-al fogja összehasonlítani nem 10-el.
Én nem csináltam még ilyet, csak az olvasottak alapján vetődött fel bennem ötletszerűen a következő algoritmus:
ADC a konvertált érték, a "hiszterézis" pedig 2xH. Az i ciklusváltozót természetesen végig kell futtatni az összes LED-en...
Hmm. Ez jó is lenne!
Így minden benne van egy ciklusban mert csak az a LED fog égni amelyiknél egyezés van a többit meg lekapcsolja.
Érdekes ez a program, mert egyáltalán nem azt csinálja, amit írtam. Igaz, azt sem , amit te írtál...
Pl. ertek=0 vagy ertek= 25 esetén szerinted hány LED fog világítani?
El kell menteni a port állapotát,majd nullázni.A kiértékelés a következő:
Ha érték > határ(n) + portb(n) * hiszterézis Ha nem teljesül 1-be állítom és kész.
Ha teljesen linearis az elosztas, akkor egyszeruen elosztanam az AD erteket egy konstanssal. Tehat van 8 LED, mondjuk 8 bit AD eseten a max AD ertek 256 (0-255). Tehat a konstansunk k = 256/8 = 32.
Namarmost, mikor beolvasod az AD-t, akkor az AD/k segitsegevel kiderul kapasbol melyik LED-nek kell vilagitania -- ha ez a schmitt triggeres jatek nem lenne. Namarmost, vesszuk az elozo LED allast, es amennyiben az uj ertek annal nagyobb, akkor if ( AD - H > LEDregi * k ), ha pedig kisebb, akkor if ( AD + H < LEDregi * k ). Viszont a bokkento akkor van, ha az AD > ADmax-k vagy AD < ADmin+k... Lehet Te is ezt irtad, csak maskepp? Amugy a port ertekevel ne szamolj, legyen egy shadow RAM-ban, vagy LED szamban, izles kerdese, de a port kiirasa ne fuggjon a port elozo allapotatol!
Biztos, hogy érték=0 esetén minden LED-et ki akarsz gyújtani?
Amint nem teljesül a feltétel,onnan nem megyek tovább.Valóban 0-ra gyujtja az 1. ledet,esetleg lehet ezt külön kezelni.Az a lényeg,hogy amelyik bit 1-ben volt,ott hozzáadja a hiszterézist,ahol 0 volt,ott nem.
Igen, valahogy azt kellene csinálni, amit az "elektronika" is követ ilyen hiszterézises esetekben. A probléma a digitális feldolgozásnál az, hogy a két minta közötti időben akármi is történhet, nem "folytonos" a jel. Így előfordulhat, hogy több tartományt ugrik két mintavétel között, ezért legalább az irányt "le kell követni". Én valami ilyesmit tudnék elképzelni:
Hiszterézises viselkedést nem lehet az előző állapot figyelembe vétele nélkül megvalósítani. Tehát a pillanatnyi értéket akárhogy hasonlítgatod a határokhoz, abból nem lesz hiszterézises lépkedés, ha nincs külön egy változód, ami az éppen aktuális tartományra mutat.
Ledekre,portra vonatkozott a kérdés,de valóban,egy tartományt fel lehet osztani 50,60,vagy több részre,akkor tényleg célszerűbb előtte kiszámolni,hova esik a mért érték.
Utána elég az alatta lévővel összehasonlítani,amennyiben felül nézem a hiszterézist. Ugyanis elég csak egy irányban nézni,hiszen ha alul kilépek,a következő mérésnél ott belép a hiszterézis,így nem fog vissza pattanni. Pl. a határok legyenek 1,2,3.A programba 0.95, 1.95, 2.95-öt írok,a hiszterézis legyen 0.1.Felfelé 1.05, 2.05, 3.05-nél lépek,lefelé 0.95, 1.95, 2.95-nél.
És hova lépsz, ha mondjuk az első tartományban vagy, és beesik egy olyan érték, ami pont a 4. és 5. tartomány határán, a hiszterézisben van? Ez a legnagyobb gond azzal, ha a pillanatnyi érték alapján akarod meghatározni a tartományt.
És így?
Az mindegy,hiszen a hiszterézis tartomány mindenképp bizonytalan.Arról nem tudod eldönteni,hogy a 4. vagy az 5. tartományhoz áll közelebb.Lehet hogy 5-öt mutat,de közben már 4.99.
Ja,a kiindulás az volt,hogy zajok,zavarok.Nem átlagolás.Tehát ha ekkorát ugrik,átírom.
Pont ez a lényege, hogy el kell dönteni. Ha alulról lépsz be a hiszterézistartományba, akkor az előző értékre kell ráállni. Azaz ha az 1.-ben voltál, és a 4.-5. határán lévő érték jön be, akkor szépen felfelé lépkedve meg kellene találni a 4. tartományt. Ha viszont a 8.-ban voltál, akkor lefelé lépkedve kellene ugyanilyen bemenetre megtalálni az 5.-et.
Amúgy,ha ekkorát ugrik,akkor mit beszélünk hiszterézisről?
Én a hiszterézist kis változásokra értelmezem.
Szerintem Szilva ugy ertette, hogy ha azt a potit olyan gyorsan tekered, hogy a ket mintavet kozott nagy valtozas kovetkezik be. Ha mindig csak kicsi, akkor termeszetesen nincs gond egyszerubb algoritmussal sem...
Mivel két mérés között idő telik el, akármekkorát ugorhat. Akkor is meg kell találni a megfelelő tartományt, és akkor is azt kell megtalálni, ami utána a kis "zizegésekre" nem fog ugrálni azért, mert épp tartományhatáron van a mért érték.
OK,értem-esetleg el lehet előtte dönteni,hogy az új érték kisebb avagy nagyobb az előzőnél,és ez alapján alulról vagy felülről vizsgálom.
Zizegésekre nem fog ugrálni,azért van a hiszterézis.
Attól még beállhat a hiszterézis határára,de nem tudod,hogy a következő nőni vagy csökkenni fog.Akkor hova számolod a hiszterézist?
Látom, nem érted a lényegét. Hiszterézist nem lehet úgy megvalósítani, hogy csak és kizárólag az adott értéket veszed figyelembe. A hiszterézises "gép" előző állapotát mindenképpen fel kell használnod. És nem elég az előző érték ismerete sem, mert az előző érték sem határoz meg önmagában semmiféle előző állapotot. Ha nem eszerint dolgozol, akkor bűvölheted bárhogy, abból nem lesz hiszterézis, maximum holtsávokat fogsz kialakítani. Egyébként ezt párszor leírtam, ahogy a szerintem helyes működést is.
Amúgy a holtsávos se rossz szerintem. Ha holtsávba esik akkor marad az előző érték, ha meg nem, akkor felveszi az új értéket. Persze ez nem hiszterézises viselkedés, de működik. Arra kell csak figyelni, hogy ha "gyorsan" tekeredik a poti, nehogy egy jó sávot kihagyva újabb holtsávba parkoljon le. Ezt vagy figyelni kell programból, az előző érték alapján elég távol vagyunk-e, vagy elég sűrűn veszünk mintát hogy ez ne fordulhasson elő.
Idézet: „Arra kell csak figyelni, hogy ha "gyorsan" tekeredik a poti, nehogy egy jó sávot kihagyva újabb holtsávba parkoljon le.” Igen, Szilva algoritmusa epp ezt hivatott kivedeni. Tehat elobb lefele keres a hiszterezist figyelembe veve, majd felfele -- magyaran mindegy mekkora az ugras, az mindig meg fogja talalni a melyes erteket. Azon filozom ez mukodhet unsigned char-ral is. Majd leszimulalom meg lehet ki is probalom a hosszu hetvegen. |
Bejelentkezés
Hirdetés |