[elektro] PIC16F818 referenciafeszültség

Móczik Gábor pm_levlista at progzmaster.hu
Tue Nov 22 22:18:20 CET 2011


2011.11.22. 21:21 keltezéssel, Horváth Zsolt írta:
>     Sziasztok!   A következő a gondom: van egy címben szereplő kontroller. Egyetlen AD csatornán mér feszültséget. Erősen túl van mintavételezve, több tíz minta átlagolása után kerül kiszámításra a végeredmény. Ez az érték 2'800. Mivel az AD csak 10 bites, így érthető, ha kisebb-nagyobb mértékben az érték "lebeg". Azonban ez - szerintem - túlzottan lebeg. Pl. 20,14-et mutat szinte folyamatosan, de 1-2 másodpercenként leugrik 19,88, vagy ahhoz közeli (ennél nagyobb) értékre.   Egyszer csináltam már ilyesmit, ott 1'200-ig ment el a végül kijelzett érték. De ott semmiféle "lebegés" nincs! A két áramkör között annyi a különbség, hogy a második esetben a tápfeszültség van referenciának használva. Az első esetben úgy terveztem a NYÁK-ot, hogy külső referenciát használok a két ref. lábon. Készült egy külön táp modul is, ami azonban még nem használható. A ref. feszt. egy TL431 állítja majd elő. Most azonban ideiglenesen a tápfeszültség van a referencia lábakra kötve. (A re
ferencia később is majd 5V lesz.)  A referencia lábak használata okozhatja ezt a "lebegést", vagy inkább a programban keressem a hibát?   Amiket ellenőriztem és jónak tűnnek:  - AD órajele  (próbáltam a belső RC-t is, azzal is ezt csinálja)  - a következő mérés előtt van egy késleltető hurok, hogy a mintavételezés megfelelő legyen  - a bemenet az alábbi: mérendő feszültség (max. 28V) - 3,3kOhm - 1kOhm potenciométer - föld. A potméter középső kivezetése megy az AD bemenetre.   Persze mielőbb gatyábarázom majd a táp panelt és megnézem, javul-e a helyzet, ha a TL431 adja a referenciát, de gondoltam, hátha tudja valaki a frankót! :D     Üdv.: Horváth Zsolt

Ha a táp zavarná, valószínűleg sose lenne stabil a jel, hanem zajos 
lenne. Ha nincs a tápon az ugrással összefüggésbe hozható periodikus 
terhelés, akkor ez inkább sw problémára utal.

A konverziót én mindig interruptban időzítem és átlagolom is, a main-nek 
csak a végeredményt kell kiolvasni.

Az átlagolást célszerű kettő hatványai szerinti mennyiségű mintára 
végezni, akkor 1db bit shift utasítással el lehet osztani a szummát, ez 
mehet az ISR-be. Ha ez nem jó, akkor egy osztást azért már nem tennék oda.

Kölcsönösen ki kell zárni hogy egymást zavarják, az ISR ne írjon ha a 
main nem olvasta ki, a main meg ugye csak akkor olvasson ha van friss 
adat. Az előbbivel persze elvész a friss adat, de ha a main lassú az már 
eleve rossz, viszont legalább az eredmény nem lesz hibás.

1db flaggel elintézhető.

ISR:
   if (!flag) {
       x = avg;
       flag = 1;
    }

main:
   if (flag) {
       x felhasználása
       flag = 0;
   }



More information about the Elektro mailing list