[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