MPU 6050 имеет проблемы с гироскопом - PullRequest
0 голосов
/ 23 февраля 2020
 #include<Wire.h>
 const int MPU = 0x68; //I2C adresa MPU 0x68 == 0b1101000
 float AccX, AccY, AccZ; 
 float GyroX;
 float gyroAngleX;
 float accAngleX;
 float kutX;
 float dt;
 void setup() {
             dt=100;
             Serial.begin(19200);
             Wire.begin(); //spreman za komunikaciju
             Wire.beginTransmission(MPU); // započni komunikaciju sa MPU
             Wire.write(0x6B); //obrati se registru 6B
             Wire.write(0b00000000); // stavljamo registar u 0 ....normalan rad*****
             Wire.endTransmission(true); //odustajemo od komunikacije
             Wire.beginTransmission(MPU);
             Wire.write(0x1B); // obrati se/adresiraj registar žiroskopa
             Wire.write(0x00000000); // postavljamo 250°/s iako je on takav po defaultu****
             Wire.endTransmission(true);
             Wire.beginTransmission(MPU);
             Wire.write(0x1C); // adresiraj registar akcelerometra
             Wire.write(0x00000000); // postavi na 2g osjetljivost iako je takva po defaultu
             Wire.endTransmission(0b1101000); 
             delay(50); 
           }

            void loop() {
              //=== čitaj podatke akcelerometra ===//
            Wire.beginTransmission(MPU);
            Wire.write(0x3B); //počni čitati od registra 0x3B odnosno akceleracije xosi...
            Wire.endTransmission(false);
            Wire.requestFrom(MPU,6,true); // očitaj 6 registra za redom..6 byta podataka
            AccX = (Wire.read()<<8 | Wire.read())/16384.0; // dijeli sa 16384 da bi dobio točnu                                         vrijednost jer tako nalaže data sheet za +-2g
            AccY = (Wire.read()<<8 | Wire.read())/16384.0;
            AccZ = (Wire.read()<<8 | Wire.read())/16384.0;
            accAngleX = (atan(AccY/sqrt(pow(AccX, 2)+pow(AccZ,2)))*180/PI); 
            Wire.beginTransmission(MPU);
            Wire.write(0x43); //adresa prvog registra žiroskopa
            Wire.endTransmission(false);
            Wire.requestFrom(MPU,6,true); // isto ko kod akcelerometra
            GyroX = (Wire.read() << 8 | Wire.read())/131.0; //ista fora kao kod acc
            gyroAngleX =  GyroX;
            kutX = 0.96*gyroAngleX+0.04*accAngleX;
            //////////////////////////////////////
            Serial.print("kutX = ");
            Serial.print(gyroAngleX);
            delay(dt);
           }

так что это код .... у меня проблема с гироскопическими данными, я знаю, что это из-за дрейфа тим, но я думаю, что дрейф 500 дпс слишком много ... когда стационарный сигнал нормальный но когда я перемещаю его, он иногда поднимается до 480-500 dps, когда я двигаюсь с места быстро, он останавливается на 250 dps, что хорошо, потому что я поставил регистр в диапазоне 250. Кто-нибудь раньше сталкивался с этой проблемой ?? Заранее спасибо!

...