【问题标题】:Random Spikes while logging raw data from IMU using SPI on Arduino使用 Arduino 上的 SPI 从 IMU 记录原始数据时出现随机峰值
【发布时间】:2018-07-28 20:04:52
【问题描述】:

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

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(" ");
}

【问题讨论】:

    标签: arduino accelerometer spi gyroscope


    【解决方案1】:

    “尖峰”的能量似乎非常低,可能是不时出现的虚假读数。您当然可以尝试找出导致它们的确切原因(可能就像有人砰地关上门一样),但我认为这更多是硬件调试问题。

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

    以下是最简单的过滤器之一,其中 filterValue 是“运行”值,senseValue 是当前的原始测量值,scaleFactor 是一个

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

    我认为一旦你合理地过滤数据,那些“尖峰”就会消失。

    由于您存储了数据,您可以通过过滤器运行它并查看它的外观。

    【讨论】:

    • 峰值是由我的代码在写入寄存器时试图读取寄存器引起的。通过数据表,我发现这个 IMU 有 2 个中断引脚,可用于查看新数据何时准备就绪。触发中断后调用读取函数解决了这个问题。无论如何感谢您的建议。
    • @Alek 您能否详细说明如何检测到新数据何时准备就绪?从数据表中我不清楚更常见的 IMU(使用 Adafruit 的 9DOF)
    猜你喜欢
    • 2021-09-06
    • 2020-08-12
    • 2016-05-10
    • 1970-01-01
    • 2010-12-10
    • 2021-12-08
    • 1970-01-01
    • 2018-07-20
    • 2016-10-16
    相关资源
    最近更新 更多