使用Arduino上的SPI从IMU记录原始数据时出现随机尖峰

时间:2018-02-18 12:34:41

标签: arduino accelerometer spi gyroscope

我需要对LSM9DS1 IMU进行噪声表征。为此,我需要在静态条件下长时间(大约10小时)从传感器获取原始数据。 我准备了一个由Arduino Uno和使用SPI协议连接到它的IMU组成的记录系统。系统运行良好,但是,即使IMU处于静止状态,我也会在加速度计和陀螺仪上产生随机尖峰。这些峰值似乎始终与平均值相差+/- 250。 下图显示了加速度计X轴上的这些尖峰。 enter image description here

IMU设置为提供50 Hz的数据,我也以相同的频率读取数据。以下是基于Sparkfun提供的LSM9DS1库的Arduino代码:

#include <Wire.h>
#include <SPI.h>
#include <SparkFunLSM9DS1.h>

LSM9DS1 imu;

#define LSM9DS1_M_CS    10 // Can be any digital pin
#define LSM9DS1_AG_CS   9  // Can be any other digital pin

void setup() 
{
  Serial.begin(115200);

  imu.settings.device.commInterface = IMU_MODE_SPI;
  imu.settings.device.mAddress = LSM9DS1_M_CS;
  imu.settings.device.agAddress = LSM9DS1_AG_CS;

  if (!imu.begin())
  {
    Serial.println("Failed to communicate with LSM9DS1.");
    while (1);
  }


  imu.enableFIFO(false);
  imu.setFIFO(FIFO_OFF,0x00);
}

void loop()
{
  Serial.print(micros());
  Serial.print(" ");
  printAccel();
  printGyro(); 

  delay(20);

}

void printGyro()
{
  imu.readGyro();
  Serial.print(imu.gx);
  Serial.print(" ");
  Serial.print(imu.gy);
  Serial.print(" ");
  Serial.println(imu.gz);
}

void printAccel()
{
  imu.readAccel();
  Serial.print(imu.ax);
  Serial.print(" ");
  Serial.print(imu.ay);
  Serial.print(" ");
  Serial.print(imu.az);
  Serial.print(" ");
}

1 个答案:

答案 0 :(得分:1)

&#34;尖峰&#34;似乎是非常低的能量,可能是一次又一次的虚假阅读。你当然可以试着弄明白究竟是什么导致了它们(它可能就像有人为你所知道的一扇门砸门),但我认为这更像是一个硬件调试问题。

我认为最终你会想要过滤掉所有噪音。您需要的数字滤波器有多复杂取决于您的测量速度和速度。与测量中的随机噪声相比较。

以下是最简单的过滤器之一,其中filterValue是&#34;运行&#34; value,senseValue是当前的原始测量值,而scaleFactor是一个数字&lt; 1(0.1或0.01例如)。数字越小,过滤的次数就越多,而且越多,越迟越&#34;你会看到。

filterValue = filterValue + scaleFactor * (senseValue - filterValue);

我认为一旦您合理地过滤数据,那些&#34;尖峰&#34;会消失。

由于您已存储数据,因此您只需通过过滤器运行它,看看它的外观。