代码之家  ›  专栏  ›  技术社区  ›  Alexis

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

  •  1
  • Alexis  · 技术社区  · 6 年前

    我需要对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 回复  |  直到 6 年前
        1
  •  1
  •   nPn    6 年前

    这些“尖峰”似乎能量很低,可能偶尔会有一个虚假读数。您当然可以尝试找出导致这些问题的确切原因(您所知道的可能是某个人砰地关上门),但我认为这更多的是硬件调试问题。

    我想最终你还是会想过滤掉所有的噪音。数字滤波器的复杂程度取决于“测量”与测量中随机噪声的速度。

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

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

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

    因为您存储了数据,所以只需通过过滤器运行它,然后查看它的外观。