Hallo!
Ich arbeite gerade an einem Quadrocopter.
Folgende Komponenten:
-Robbe Roxxy 2827-35 760kV
-4S Akku 3000mAh
-KISS ESC 18A
-WARTHOX frame mit 20cm Armen
-Flightcontroll ist selbst entwickelt mit Atxmega128A1U und MPU-6000 als Gyro+ACC
Die Bilder sind nicht mehr ganz Aktuell.
Mittlerweile hat der Copter eine Ordentliche Akkuhalterung aus Aluminium, die auch die Kunststofffüße ersetzt.
Jedenfalls habe ich nun das Problem, dass der Copter nur in Bodennähe (so bis 20cm) stabil fliegt, lässt sich auch gut steuern.
Wenn ich ihn aber weiter steigen lasse, dann neigt er sich erst stark in eine Richtung und kippt dann um.
woran kann das prinzipiell liegen?
Die PID wird mit 1KHz ausgeführt und ist folgendermaßen aufgebaut:
Die Parameter sind Folgende:
kp = 0.05
ki = 0.004
kd = 0.06
Imax = 30000
Imin = -30000
prescaler = 100
Hat jemand eine Idee, woran das Problem liegen könnte?
Ich habe übrigens alles so definiert, dass der Kreis nicht 360°, sondern 65535° hat.
Ich wäre für Hilfe sehr dankbar.
mfg
Olaf
Ich arbeite gerade an einem Quadrocopter.
Folgende Komponenten:
-Robbe Roxxy 2827-35 760kV
-4S Akku 3000mAh
-KISS ESC 18A
-WARTHOX frame mit 20cm Armen
-Flightcontroll ist selbst entwickelt mit Atxmega128A1U und MPU-6000 als Gyro+ACC
Die Bilder sind nicht mehr ganz Aktuell.
Mittlerweile hat der Copter eine Ordentliche Akkuhalterung aus Aluminium, die auch die Kunststofffüße ersetzt.


Jedenfalls habe ich nun das Problem, dass der Copter nur in Bodennähe (so bis 20cm) stabil fliegt, lässt sich auch gut steuern.
Wenn ich ihn aber weiter steigen lasse, dann neigt er sich erst stark in eine Richtung und kippt dann um.
woran kann das prinzipiell liegen?
Die PID wird mit 1KHz ausgeführt und ist folgendermaßen aufgebaut:
Code:
int16_t PID::Compute(int16_t error)
{
//errSum += (error); //Integralanteil
if ((errSum + error/prescaler) > Imax) //errsum begrenzen
errSum = Imax;
else if ((errSum + error/prescaler) < Imin)
errSum = Imin;
else
errSum += (error /prescaler);
float dErr = (error - lastErr); //Differentialanteil
lastErr = error;
return (int16_t)(((error * kp) + (errSum * ki) + dErr * kd)/10);// + (dErr / kd));
}
kp = 0.05
ki = 0.004
kd = 0.06
Imax = 30000
Imin = -30000
prescaler = 100
Hat jemand eine Idee, woran das Problem liegen könnte?
Ich habe übrigens alles so definiert, dass der Kreis nicht 360°, sondern 65535° hat.
Ich wäre für Hilfe sehr dankbar.
mfg
Olaf