Jak omezit kolísání hodnoty z ADC u PICu?

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

Jak omezit kolísání hodnoty z ADC u PICu?

#1 Příspěvek od forbidden »

Občas používám interní ADC u PICů (10 bit), vadí mi lítání hodnoty +- 1 LSB při opakovaným měření. Napětí na pinu je stabilní, reference taky, mám tam i RC filtry. Ale nějaký rušení tam zřejmě bude. Myslel jsem, že pomůže průměrování, ale i když dělám osminásobný zprůměrování, lítá to stejně. Nemá někdo tip, jak to v SW vyhladit?
Myslel jsem třeba na vyhození nejmenší a největší hodnoty, ale v takto malým rozptylu se klidně může stát, že budou čtyři a čtyři stejný. Funkce na AD převod je níže, ale není na ní nic speciálního.

Kód: Vybrat vše

unsigned int ad_convert_avg (unsigned char c)       // A->D prevod osminasobne zprumerovany
{
    unsigned int AD_RESULT;
    unsigned int AVG [8];
    unsigned char TACQ, AVGI;
    ADCON0bits.CHS1=c;                              // c=0 -> RA0 (napeti); c=1 -> RA2 (proud)
   
    for (AVGI=0;AVGI<8;AVGI++)
    {
        for (TACQ=5;TACQ>0;TACQ--);                 // ceka na nabiti samplovaciho kondu
        ADCON0bits.GO_DONE=1;                       // start AD prevodu
        while (ADCON0bits.GO_DONE);                 // ceka na dokonceni AD prevodu
        AVG[AVGI]=ADRESL;
        for (;ADRESH>0;ADRESH--)
            AVG[AVGI]=AVG[AVGI]+256;
    }
   
    AD_RESULT=(AVG[0]+AVG[1]+AVG[2]+AVG[3]+AVG[4]+AVG[5]+AVG[6]+AVG[7])/8;
    return AD_RESULT;
}


Dík.
masar
Příspěvky: 14453
Registrován: 03 pro 2005, 00:00

#2 Příspěvek od masar »

+1/-1 LSB...nesnažíš se o nemožné?
:wink:
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#3 Příspěvek od forbidden »

Asi jo, jde mi jen o nějakej nápad na zklidnění hodnoty. Nejde mi o absolutní přesnost. Musí to ovšem zase poměrně rychle reagovat na větší změnu, takže měřit jednou za minutu není úplně ono. :)
Uživatelský avatar
makak
Příspěvky: 635
Registrován: 28 črc 2019, 00:00

#4 Příspěvek od makak »

Jednoduše. Zablokovat změnu (průměrované) výstupní hodnoty, dokud se měřená hodnota nebude odlišovat od předchozí více, než například +/-2 LSB.
Přesnosti to nepřidá, ale indikace bude příjemně stabilní a dušička bude mít pokoj.
masar
Příspěvky: 14453
Registrován: 03 pro 2005, 00:00

#5 Příspěvek od masar »

Přesnosti to naopak 1LSB ubere. :wink:
Uživatelský avatar
samec
Příspěvky: 6671
Registrován: 19 pro 2017, 00:00

#6 Příspěvek od samec »

Ak si s napätím na rozhodovacej úrovni, tak ten jeden bit ti bude lietať aj pri zanedbateľnom rušení. S tým nič neurobíš. Presnosť ADC prevodníka je vždy minimálne ±1 bit.
Uživatelský avatar
makak
Příspěvky: 635
Registrován: 28 črc 2019, 00:00

#7 Příspěvek od makak »

masar píše:Přesnosti to naopak 1LSB ubere. :wink:

Nepochybně, ale zadání bylo stabilizovat indikaci i za cenu omezení přesnosti.
Zdá se to nesmyslné, ale v některých aplikacích to kupodivu může být užitečné. Pokud rozlišení převodníku je výrazně větší, než toleranční pole měřené hodnoty, není třeba obsluhu zařízení rozptylovat neustálým poblikáváním displeje, dokud změna nevyžaduje nějaký zásah do procesu.
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#8 Příspěvek od forbidden »

To porovnávání předchozí s aktuální a zobrazení na základě rozdílu určitě zkusím. To by mohlo pomoct. Přesnost bude dostatečná.
Dík.
masar
Příspěvky: 14453
Registrován: 03 pro 2005, 00:00

#9 Příspěvek od masar »

Tak pokud to lítá pouze na posledním bitu, tak není třeba žádná další filtrace. A pokud to "lítání" vadí, tak stačí ten poslední bit prostě nečíst (ignorovat).
:wink:
Uživatelský avatar
makak
Příspěvky: 635
Registrován: 28 črc 2019, 00:00

#10 Příspěvek od makak »

To ale není totéž. Když poslední bit ignoruju, stane se posledním ten předposlední. Zmenší se pravděpodobnost poblikávání, ale když se dostanu na hranu rozhodovací úrovně, může to přeblikávat znovu.
Programové řešení, které navrhuju, umožňuje podle okolností jednoduchou změnou jednoho parametru nastavovat "pásmo necitlivosti" podle potřeby.
termit256
Příspěvky: 10029
Registrován: 06 pro 2007, 00:00

#11 Příspěvek od termit256 »

Ignorovanim LSB si nicemu nepomuze.
Reseni je jednoduche, zaved tam hysterzi.
Ja to tak delam napr kdyz nechci aby udaj na displeji blikal apod.
Ze prevodnik integrovany v MCU kmita pouze o 1 LSB je vyborne, osobne si myslim ze to bude vic, jen sis toho zatim nevsiml.
Zaved hysterzi o 1 LSB a uvidis jestli to bude pro tve potreby vyhovovat.
Naposledy upravil(a) termit256 dne 17 srp 2019, 13:37, celkem upraveno 1 x.
masar
Příspěvky: 14453
Registrován: 03 pro 2005, 00:00

#12 Příspěvek od masar »

>makak>To máš pravdu. Je to řešení.
Termitovo řešení je v principu shodné, ne?
:wink:
Uživatelský avatar
teufel
Příspěvky: 512
Registrován: 09 úno 2017, 00:00
Bydliště: Na dohled od Spolany

#13 Příspěvek od teufel »

Podívej se na tohle
http://www.piclist.com/techref/microchip/dsp/av-256w-aw.htm
Někde to mám rozepsané pro 10bit ADC, v případě zájmu pošlu. Funguje to báječně
Uživatelský avatar
samec
Příspěvky: 6671
Registrován: 19 pro 2017, 00:00

#14 Příspěvek od samec »

Je to len obyčajné spriemerňovanie. Parametrom nastavuješ váhu priemernej a novej hodnoty. Čím väčší parameter, tým to pomalšie reaguje na zmenu.
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#15 Příspěvek od forbidden »

teufel píše:Někde to mám rozepsané pro 10bit ADC, v případě zájmu pošlu. Funguje to báječně


Pošli prosím, kouknu, nebo to tu rovnou vystav, jestli to není tajný. :)
Dík
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“