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..
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...
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; |
Wie wäre es mit einem Kalman-Filter? Damit hättest du deinen PID auch gleich optimiert. Nur so eine Idee... Kenne mich da auch nicht wirklich aus, aber die Literatur im Netz liest sich ganz gut. virtuPIC
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
Vielleicht hilft dir die Anti Reset Windup Massnahme. Näheres z. B. hier http://www.controlguru.com/2008/021008.html
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.