
Zitat von
Che Guevara
EDIT:
Dass bei schnellen Drehungen die Winkeländerung zu langsam erfolgt, könnte daran liegen, dass du innerhalb der Main-loop Schleife die Daten über die serielle Schnittstelle ausgibst. Evtl. wäre es sinnvoller, dies nur alle xx-Durchläufe zu machen, etwa so (Pseudocode):
Code:
Byte: Cnt
Mainloop:
getSensorData()
gz = gz - gz_null
winkel = winkel + gz
cnt = cnt + 1
wenn cnt = 100 dann
cnt = 0
serialport.write(winkel)
ende wenn
Springe zu Mainloop
Außerdem fällt mir noch das dt auf: IMHO braucht man das nicht zwingend, zumindest funktionierts in meinen Koptern auch hervorragend ohne diesen Parameter.
Hmm, was ist das für eine Sprache?
Habe das was du meinst mal geproggt:
Code:
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
MPU6050 accelgyro;
int16_t ax, ay, az;
int16_t gx, gy, gz;
float gz_null=0;
float winkel=0;
unsigned long prev;
void setup() {
Wire.begin();
Serial.begin(38400);
accelgyro.initialize();
for (int i=0;i<500;i++) //mittelung von nullpunkt
{
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
gz_null = gz_null+gz;
}
gz_null = gz_null/500;
prev = millis();
}
void loop(){
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //MPU6050 auslesen
gz = gz - gz_null; //offset abziehen
winkel=winkel+gz; //Winkel Integrieren, winkel + winkel * 2.8ms (dauer zwischen 2 loop durchgängen.
if((millis() - prev)>100){
prev =millis();
Serial.println(winkel); //Winkel ausgeben
}
}
Ist schon viel besser, auch bei schnellere Drehungen.
Was mache ich aber nun mit diesem Wert, kann ich diesen nun gleich für einen PID Regler verwenden?
Lesezeichen