首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Arduino上使用SPI记录IMU原始数据时的随机尖峰

在Arduino上使用SPI记录IMU原始数据时的随机尖峰
EN

Stack Overflow用户
提问于 2018-02-18 20:34:41
回答 1查看 892关注 0票数 1

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

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

代码语言:javascript
复制
#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(" ");
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-20 10:37:29

“尖峰”似乎是非常低的能量,可能是一个错误的读数。你当然可以尝试找出到底是什么导致了它们(可能是像你所知道的某个人关上门一样),但我认为这更多的是一个硬件调试问题。

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

下面是最简单的过滤器之一,其中filterValue是“运行”值,senseValue是当前原始测量值,scaleFactor是一个小于1的数字(例如0.1或0.01 )。数字越小,它将过滤的越多,但你也会看到更多的“滞后”。

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

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

既然你已经存储了数据,你就可以通过过滤器来运行它,看看它是什么样子。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48851742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档