hochpass filter (software)

Gast #808940
Lesenswert?

Hallo, habe folgendes Problem.
habe am ADC ein Gyroskop hängen. das ganze soll dann mit einm PID Regler 
zur lageregelung verwendet werden.

P und D anteil sind kein problem, allerdings komme ich bei dem I Anteil 
nicht weiter.
Das Problem ist, dass das Gyro einen Temperaturabhängigen Drift hat, und 
auch sonst nicht sehr genau ist, bei dem D und P anteil macht das nichts 
aus, wenn ich es aber integrier addiert sich der Fehler bei jedem 
Schleifendurchlauf und schiesst gegen Unedlich :(

Desswegen suche ich nach irgendeiner Möglichkeit den Fehler im I - 
Anteil der duch leicht versetzte 0_Punkte entsteht rauszurechnen..
siehe bild: http://www.dyyyh.de/quadro/integral.JPG

Entweder das signal direkt "Hochpassfiltern", sodass der startwert auf 0 
gedrückt wird, oder den 0-Punkt irgendwie immer neu berechnen, so dass 
er richtig liegt, oder im integrieten den Linearanteil aufrund der 
0-Verschiebung abziehen. ??

Weis jemanddazu einen guten Algortithmus ?? oder wie würdet ihr das 
Porblem Lösen ?? ( wenn das Integral immer ein bischen kleiner ist als 
tatsächlich wäre das auch nicht schlimm)
Danke schon mal..
Gast #809009
Lesenswert?

noch ne anmerkung, was auch gehen wuerde waere das signal durch einen 
sehr tiefen tiefpass zu filetn, und dieses signal dann als 0-Punkt zu 
verwenden...
das problem das ich dabei habe ist allerdings, dass ich dafür riesige 
zahlen brauche bzw ganz viele variablen und dann wird das mit der 
echtzeitregelung nix mehr...
Gast #832141
Lesenswert?

Ich nutze für sehr langsame Änderungen (Drift) folgenden Filter:
http://www.edn.com/article/CA6309111.html?text=simple+digital+filter

Wählt man für K einen Wert 2^n, so reduziert sich die Division auf einen 
einfachen Schiebebefehl. Noch besser für K 2^8,2^16 oder 2^32 nehmen, 
dann einfach das höherwertige Byte bzw. Word nehmen.
Bsp:
Wert adc kommt aus AD-Wandler und ist immer positiv.
1
unsigned int adc,out;
2
unsigned long acc;
3

4
out = acc/(MAX_UINT+1);   // macht ein guter Compiler richtig schnell
5
acc += adc - out;
Wenn dein Compiler das nicht beherrscht, dann musst du acc als Variant 
deklarieren:
1
unsigned int adc,out;
2
union UNION_ACC{
3
  unsigned long sum;
4
  unsigned int res[2];
5
} acc;
6

7
out = acc.res[1];   // bei little endian
8
acc.sum += adc - out;
Gast #833902
Lesenswert?

Hi,  goaran,

Du: " addiert sich der Fehler bei jedem Schleifendurchlauf und schiesst 
gegen Unedlich"

Das ist kein Problem, sondern unvermeidbar wie das Wetter.
Denn mit "Gyroskop" werden auch Wendekreisel bezeichnet, und so einen 
hast Du vor Dir.
Er mißt allein die Winkelgeschwindigkeit, aber keine Nordrichtung.

Zur Bestimmung der Nordrichtung eignen sich, in der Reihenfolge, in der 
die Preise um Zehnerpotenzen in die Höhe gehen:
a) Magnetkompaß, für kleinere Anwendungen solche mit Hallsensoren wie 
KMZ51
b) Funkkompaß
c) GPS-Kompaß mit zwei GPS-Antennen im Abstand von > 1 Meter,
d) Nordsuchender Kreisel (sucht die stabile Position, die er erst 
erreicht, wenn seine Drehaschse koaxial ist mit der Erdachse)
e) Nordsuchender Faserkreisel.

Solche Kompanden brauchen aber Zeit zum Messen, und die Kompaßnadel 
zittert.

Üblich ist deshalb das "Inertial Navigation System" mit Wendekreiseln, 
die von einem Magnetkompaß gestützt werden.

Heißt: Den P- und D-Anteil gewinnst Du aus dem Wendekreisel, den 
I-Anteil aus dem Magnetkompaß.


ciao
Wolfgang Horn

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