Гироскоп MPU6050 не дает надежных показаний

Он дает надежные показания в течение нескольких секунд, а затем становится ненадежным.

Мой код Arduino таков:

#include<Wire.h>
const int MPU6050_addr=0x68;
int16_t AccX,AccY,AccZ,Temp,GyroX,GyroY,GyroZ;
void setup(){
  Wire.begin();
  Wire.beginTransmission(MPU6050_addr);
  Wire.write(0x6B);
  Wire.write(0);
  Wire.endTransmission(true);
  Serial.begin(9600);
}
void sendVector(float x, float y, float z) {
  Serial.print(x, 4);
  Serial.print("|");
  Serial.print(y, 4);
  Serial.print("|");
  Serial.println(z, 4);
}

void loop(){
  Wire.beginTransmission(MPU6050_addr);
  Wire.write(0x3B);
  Wire.endTransmission(false);
  Wire.requestFrom(MPU6050_addr,14,true);
  AccX=Wire.read()<<8|Wire.read();
  AccY=Wire.read()<<8|Wire.read();
  AccZ=Wire.read()<<8|Wire.read();
  Temp=Wire.read()<<8|Wire.read();
  GyroX=Wire.read()<<8|Wire.read();
  GyroY=Wire.read()<<8|Wire.read();
  GyroZ=Wire.read()<<8|Wire.read();
  //Serial.print(AccX);
  //Серийный.print(AccY);
  //Serial.print(AccZ);
  //Serial.print(" || Temp = "); Serial.print(Temp/340.00+36.53);
  //Serial.print(" || GyroX = ");
  //Serial.println(GyroX);
  //Serial.print(" || GyroY = ");
  //Serial.println(GyroY);
  //Serial.print(" || GyroZ = ");
  //Serial.println(GyroZ);
  sendVector(GyroX, GyroY, GyroZ);
  delay(100);
}

Приведенное выше отправляет данные в единство, которое управляет объектом. Объект работает с гироскопом, а затем за счет случайных показаний вращается быстро и хаотично.

, 👍-1

Обсуждение

Взгляните на алгоритм объединения датчиков AHRS, который дает вам значения кватернионов / крена, тангажа и рыскания, а также делает значения более стабильными., @Twometer


1 ответ


1

Я не думаю, что вы дали достаточно информации, чтобы помочь вам отладить это, но я могу попытаться дать несколько советов:

Сначала убедитесь, что чип работает правильно

Используйте монитор графиков Arduino и пример программы, чтобы увидеть поведение чипа и значения во времени; убедитесь, что проблема не в чипе

Во-вторых, убедитесь, что вы правильно интерпретируете значения

MPU6050 выводит 16-битные данные, но не имеет 16-битного разрешения, это означает, что младшие биты данных являются случайным, бессмысленным шумом и должны игнорироваться/отбрасываться.

Если вы предполагаете, что все 16 бит содержат достоверные данные, а ваш код достаточно чувствителен, чтобы на него могли повлиять эти младшие биты, вы увидите нестабильные случайные данные.

В-третьих, рассмотрите другие (возможные) препятствия

Попробуйте увеличить скорость последовательной передачи данных, возможно, вы отнимаете слишком много времени и таким образом создаете проблемы.

Возможно, вы выходите из синхронизации при чтении с чипа, если отправляются дополнительные данные, вы можете создать отставание в буфере и начать интерпретировать сообщения неправильно, потому что вы читаете часть одного и часть другой. Попробуйте использовать библиотеку для общения с чипом, которую использовали другие люди и которая, как известно, работает; это может удалить ошибки, к которым вы не обращаете внимания, или ошибки, с которыми столкнется каждый, но они уже исправлены в библиотеке!

,