PT1 Filter Erklärung

Gast #2803414
Lesenswert?

Hallo Leute,

ich möchte bei einem Mikrocontroller Langzeitwerte der AD-Wandler durch 
den PT1 Filter schicken. Diesen Code habe ich aus einen anderen Beitrag 
hier im Forum entnommen.

Kann mir einer den unteren Code etwas erklären ?

unsigned long mittelwert(unsigned long newval)
{
static short n = 0;
static unsigned long avgsum = 0;

if (n<128) {
n++;
avgsum += newval;
return avgsum/n;
}else {
avgsum -= avgsum/128;
avgsum += newval;
return avgsum/128;   }
}

Gruss

Sebi
Gast #2803866
Lesenswert?

NeuerProgrammierer schrieb:
> ich möchte bei einem Mikrocontroller Langzeitwerte der AD-Wandler durch
> den PT1 Filter schicken. Diesen Code habe ich aus einen anderen Beitrag
> hier im Forum entnommen.

Das ist aber kein PT1-Filter.

Ein PT1-Filter sieht in etwas so aus:

Ausgang = Speicher = Speicher*(1.0 - Faktor) + Eingang * Faktor;
mit Faktor = 0.0 bis 1.0

Über den Faktor wird die Gewichtung zwischen Eingang und Speicher 
eingestellt, d.h. welchen Einfluß der Eingangswert auf den Speicher und 
damit den Ausgang hat.
Je kleiner der Faktor desto träger das Ding, weil ein neuer Eingangswert 
nur einen kleinen Einfluß auf den Speicher hat.

PT1 bedeutet übrigens, daß der Speicher die Tiefe 1 hat.
Gast #2804452
Lesenswert?

Du kannst die if-Abfrage auch weglassen und den Filter auf einen Wert 
initialisieren:
avgsum = 128 * "initwert" ;

Ich würde das Filtern und das Berechnen des Endwertes trennen, denn oft 
muss viel öfter gefiltert werden, als man den Endwert braucht.

Warum Lothar im 2. Beispiel statt 128 dann 100 verwendete (mit dem 
Hinweis, der Compiler kann konstanten besser optimieren)?!?

Achte immer auf die Wertebereiche, bei einem 10Bit-ADC-Wert und /64 
reichen 16 Bits für die Summe.
Gast #2805671
Lesenswert?

In der main funktion habe ich zum schluss eine warteschleife von 10ms 
und schicke jeden zehnten AD-Wert in das Filter. Sodass für einen Wert 
10x10ms=100ms benötigt wird.

Habe eine Filterstärke von 128 sodass das komplette 100ms x 128 = 
12,8sekunden dauert den langzeit mittelwert zu berechnen.

Wenn ich aber anstatt 128 eine Filterstärke von 512 funktioniert es 
nicht mehr...! Was könnte das Problem sein ? Vllcht Überlauf??
Gast #2806336
Lesenswert?

Bronco schrieb:
> Das ist aber kein PT1-Filter.
>
> Ein PT1-Filter sieht in etwas so aus:
>
> Ausgang = Speicher = Speicher*(1.0 - Faktor) + Eingang * Faktor;
> mit Faktor = 0.0 bis 1.0

Wie recht du hast - zumindest mit der Gleichung. Wenn mich meine 
Rechenkenntnisse nicht ganz verlassen haben, läßt sich der C-Algorithmus

NeuerProgrammierer schrieb:
> avgsum -= avgsum/128;   (1)
> avgsum += newval;       (2)
> return avgsum/128;   }  (3)

wunderbar wie folgt umformen:
Ersetzt man avgsum/128 durch Speicher (4), so ergibt sich
1
  Ausgang = Speicher      (3)  
2
  avgsum = (avgsum - avgsum/128) + Eingang  (1 in 2)     
3
  Speicher*128 = (Speicher*128 - Speicher) + Eingang     (mit 4)
4
  Speicher = Speicher*(1-1/128) + Eingang / 128        (/128)
Wählen wir Faktor = 1/128 landen wir bei
  Ausgang = Speicher = Speicher * (1.0 - Faktor) + Eingang * Faktor

q.e.d.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren