Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   712 / 1320
(#) watt válasza treshold hozzászólására (») Márc 27, 2010 /
 
Véletlenül nem megy sleepbe.
(#) barcza.attila hozzászólása Márc 29, 2010 /
 
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?
(#) potyo válasza barcza.attila hozzászólására (») Márc 29, 2010 /
 
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.
(#) barcza.attila válasza potyo hozzászólására (») Márc 29, 2010 /
 
Köszönöm a gyors választ.
(#) trudnai válasza barcza.attila hozzászólására (») Márc 29, 2010 /
 
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.
(#) spepe válasza trudnai hozzászólására (») Márc 30, 2010 /
 
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!
(#) bbalazs_ válasza spepe hozzászólására (») Márc 30, 2010 /
 
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.
(#) spepe válasza bbalazs_ hozzászólására (») Márc 30, 2010 /
 
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.
(#) icserny válasza spepe hozzászólására (») Márc 30, 2010 /
 
Én nem csináltam még ilyet, csak az olvasottak alapján vetődött fel bennem ötletszerűen a következő algoritmus:

  1. Ha az i-edik LED nem világít, akkor ADC > váltások[i]+H a bekapcsolásának a felétele.
  2.  
  3. Egyébként pedig (tehát ha az i-edik LED világított), akkor
  4. ADC < váltások[i]-H a kikapcsolásának a feltétele.


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...
(#) spepe válasza icserny hozzászólására (») Márc 30, 2010 /
 
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.

  1. int a = 0;
  2. valtasok[4] = {10,20,30,40};
  3. ledek[4];
  4.  
  5. ertek = <A/D konvertálás>
  6.  
  7. for ( a = 0; a < 4; a++ ) {
  8.  
  9. ledek[a] = 0; //Mindet kikapcsoljuk így
  10.  
  11. if ( valtasok[a] > ertek ) {
  12.  
  13. ledek[a] = 1;
  14.  
  15. }
  16.  
  17. if ( (valtasok[a]-2) < ertek ) {
  18.  
  19. ledek[a] = 0;
  20.  
  21. }
  22.  
  23. }
(#) icserny válasza spepe hozzászólására (») Márc 30, 2010 /
 
É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?
(#) lalca válasza icserny hozzászólására (») Márc 30, 2010 /
 
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.
(#) trudnai válasza lalca hozzászólására (») Márc 30, 2010 /
 
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!
(#) icserny válasza lalca hozzászólására (») Márc 30, 2010 /
 
Biztos, hogy érték=0 esetén minden LED-et ki akarsz gyújtani?
(#) lalca válasza icserny hozzászólására (») Márc 30, 2010 /
 
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.
(#) szilva válasza icserny hozzászólására (») Márc 30, 2010 /
 
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:

  1. const int bounds[] = {0,32,64,96,128,160,192,224,256};
  2. const int hist = 5;
  3.  
  4. int domain = 1;
  5.  
  6. void calcdom(int value) {
  7.   char step = 1;
  8.  
  9.   while (step) {
  10.     step = 0;
  11.     if (value < bounds[domain-1]-hist) {
  12.       step = 1;
  13.       domain--;
  14.     }
  15.     if (value > bounds[domain]+hist) {
  16.       step = 1;
  17.       domain++;
  18.     }
  19.   }
  20.  
  21. }
(#) szilva válasza lalca hozzászólására (») Márc 30, 2010 /
 
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.
(#) lalca válasza trudnai hozzászólására (») Márc 30, 2010 /
 
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.
(#) szilva válasza lalca hozzászólására (») Márc 30, 2010 /
 
É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.
(#) spepe hozzászólása Márc 30, 2010 /
 
És így?

  1. valtasok = {10,20,30,40};
  2. hister = 5;
  3.  
  4. ertek = <A/D konv>
  5.  
  6. for ( a = 0; a < 4; a++ ) {
  7.  
  8.     if ( ertek < (valtasok[a]-hister) | ertek > (valtasok[a]+hister) ) {
  9.  
  10.         ledek[a] = 0;
  11.  
  12.     }
  13.  
  14.     else if ( ertek > valtasok[a] ) {
  15.  
  16.         ledek[a] = 1;
  17.  
  18.     }
  19.  
  20. }
(#) lalca válasza szilva hozzászólására (») Márc 30, 2010 /
 
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.
(#) szilva válasza lalca hozzászólására (») Márc 30, 2010 /
 
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.
(#) lalca válasza szilva hozzászólására (») Márc 30, 2010 /
 
Amúgy,ha ekkorát ugrik,akkor mit beszélünk hiszterézisről?
Én a hiszterézist kis változásokra értelmezem.
(#) trudnai válasza lalca hozzászólására (») Márc 30, 2010 /
 
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...
(#) szilva válasza lalca hozzászólására (») Márc 30, 2010 /
 
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.
(#) lalca válasza trudnai hozzászólására (») Márc 30, 2010 /
 
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.
(#) lalca válasza szilva hozzászólására (») Márc 30, 2010 /
 
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?
(#) szilva válasza lalca hozzászólására (») Márc 31, 2010 /
 
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.
(#) lidi válasza szilva hozzászólására (») Márc 31, 2010 /
 
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ő.
(#) trudnai válasza lidi hozzászólására (») Márc 31, 2010 /
 
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.
Következő: »»   712 / 1320
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