Ein Filter in der Art eines RC-Filters (PT1-Glied) kann in einem uC relativ leicht implementiert werden. Dazu bedarf es, wie beim RC-Glied eines "Summenspeichers" (der Kondensator) und einer Gewichtung (Widerstand bzw. Zeitkonstante).
unsigned long mittelwert(unsigned long newval)
{
static unsigned long avgsum = 0;
// Filterlängen in 2er-Potenzen --> Compiler optimiert
avgsum -= avgsum/128;
avgsum += newval;
return avgsum/128;
}
Etwas spannender wird es, wenn die Initialisierung des Startwertes nicht so lange dauern soll. Wenn ich beispielsweise nach dem 1. Messwert diesen Wert und ab dem 2. Messwert bis zur Filterbreite den Mittelwert aus allen Messungen haben möchte, dann ist eine andere Behandlung der Initialisierung nötig.
unsigned long mittelwert(unsigned long newval)
{
static short n = 0;
static unsigned long avgsum = 0;
if (n<100) {
n++;
avgsum += newval;
return avgsum/n;
}
else {
// Konstanten kann der Compiler besser optimieren
avgsum -= avgsum/100;
avgsum += newval;
return avgsum/100;
}
}
Der Aufruf erfolgt z.B. anhand eines Timer-Flags:
int main(int argc, char* argv[])
{
:
while(1) {
if(ti.Akt>ti.Calc) {
avgwert = mittelwert(value[i]);
printf("i: %3d --> Wert: %d --> Mittelwert: %d\n",i, value[i], mw);
}
}
}