Jak omezit kolísání hodnoty z ADC u PICu?
Napsal: 17 srp 2019, 12:44
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.
Dík.
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.