Цитата(Склихасовский @ Dec 5 2006, 19:47)

а можете привести пример как делается это самое скользящее усреднение?
Код
#define ADBufLen 20u // Size of A/D FIFO buffer;
/* If sampling period SampleTime==1msec, then Time of Averaging is ADBufLen*SampleTime==20 msec */
// ++++++++++ ADC: ++++++++++++++++++++++++++++++++++++++++
ushort ADres; // A/D result
ushort ADBuf[ADBufLen]; // ADC Buffer
uchar ADBufIdx; // Index into ADC Buffer
ushort ADsum; // Sum of ADC Buffer
// .......... Other variables............
void main()
{
// ............. Initializations ............
// ......... ADC: ................................
ADCON0 = 0b10000001;
// ||xx||||
// || |||+----> ADON : "1"=="ADC Enabled"
// || ||+-----> GO\Done : "1"=="Conversion in progress"
// || ++------> CHS : Channel Select: "00"=="AN0", "11"=="AN3",
// |+----------> VCFG : Voltage reference: "0"=="Vdd", "1"=="Vref pin"
// +-----------> ADFM : "0"=="Left justified", "1"=="Right justified"
ANSEL = 0b00110001; //
// x|||||||
// |||++++-----> ANS3...ANS0 : "1"=="Corresponding AN* pin is Analogue"
// +++---------> ADCS : A/D Clock Select: "000"=="Fosc/2", "011"=="Frc",
for (;;)
{ // ++++++++++ Main Program Loop +++++++++++++
WaitNextMillisec(); // Abstract: Wait for Start of New millisecond
// ++++++++++ MilliSeconds' task +++++++++++++
ADres = ADRESH << 8 + ADRESL; // Read ADC value
// ......... Restart ADC: ..................
GODONE = 1; // Restart ADC
// .......... Filter Amplitude: .....................
ADsum -= ADBuf[ADBufIdx]; // Update sum, remove old value
ADBuf[ADBufIdx] = ADres; // Place new value into Buffer
ADsum + = ADres; // Update sum with New value
if ( (++ADBufIdx) == ADBufLen) // Update Index
ADBufIdx = 0; // Wrap
}; // ------------- Main Program Loop -------------
}; // ---------- main() ---------------------
Прекрасно фильтрует 50Гц и гармоники "в цифре", на входе АЦП достаточно RC-цепочки 10кОм+0.1мкФ.