Stránka 1 z 1

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

Napsal: 17 srp 2019, 12:44
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.

Napsal: 17 srp 2019, 12:54
od masar
+1/-1 LSB...nesnažíš se o nemožné?
:wink:

Napsal: 17 srp 2019, 13:01
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. :)

Napsal: 17 srp 2019, 13:02
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.

Napsal: 17 srp 2019, 13:07
od masar
Přesnosti to naopak 1LSB ubere. :wink:

Napsal: 17 srp 2019, 13:08
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.

Napsal: 17 srp 2019, 13:14
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.

Napsal: 17 srp 2019, 13:17
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.

Napsal: 17 srp 2019, 13:20
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:

Napsal: 17 srp 2019, 13:29
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.

Napsal: 17 srp 2019, 13:36
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.

Napsal: 17 srp 2019, 13:36
od masar
>makak>To máš pravdu. Je to řešení.
Termitovo řešení je v principu shodné, ne?
:wink:

Napsal: 25 srp 2019, 22:15
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ě

Napsal: 28 srp 2019, 20:36
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.

Napsal: 28 srp 2019, 21:36
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