Zitat Zitat von Che Guevara Beitrag anzeigen
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?