如何使用Ardunio MKR更改ADXL355的输出数据速率(I2C)

时间:2019-06-11 23:08:27

标签: arduino accelerometer frequency

在测试设置中,我将1-4个ADXL355三轴加速度计(https://www.analog.com/media/en/technical-documentation/data-sheets/adxl354_355.pdf)与Arduino MKR WIFI1010一起使用。理想情况下,无论是使用TCA9548A I2C多路复用器使用1个传感器还是使用4个传感器进行测试,我都希望分别采样接近500 Hz。目前,我正在使用1个传感器收集大约200 Hz,或者使用所有4个传感器收集大约50 Hz(此设置使用了不同的代码)。 ADXL355的默认值为500 Hz,这使我无法以该速率采样更加奇怪。

我试图将波特率从9600提高到128000。我试图使用Wire.setClock()将I2C速度最大化到传感器和Arduino可以运行的最大3.4MHz。我也尝试过一次使用屏蔽将其保存到micro SD,尽管我的大部分测试都是通过串行监视器进行的。我更改了Wire.write()来控制输出速率,但是即使将其设置为4kHz设置(Wire.write(0x00)),我仍然以〜200Hz采样。

#include <Wire.h>
#define ADXL 0x1D                                       //Datasheet pages 4 and 7 have info that will be necessary for future development. 

void setup() {
  Wire.begin();                                         // initiate the accelerometer   
  Wire.setClock(3400000L);
  Serial.begin(128000);                                   // initiate the serial monitor  
  delay(100);   
  Wire.beginTransmission(ADXL);                         //set STBY bit 0 to low / turn on MEASURE mode 
  Wire.write(0x2D);   
  Wire.write(0x00);   
  Wire.endTransmission();  
  delay(100); 
  Wire.beginTransmission(ADXL);                         //set RANGE to +/- 2g  pg. 37 of data sheet
  Wire.write(0x2C);   
  Wire.write(0x01);   
  Wire.endTransmission(); 
  delay(100);
  Wire.beginTransmission(ADXL);                         //set data rate to 4000HZ page 37 
  Wire.write(0x28);
  Wire.write(0x00);
  Wire.endTransmission();
  delay(100);
}

我期望获得500Hz(或现在的代码为4000Hz),但获得200Hz,并且更改设置的数据速率似乎不会影响结果。任何增加我的样本数据速率的帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:0)

关于I2C波特率,您使用的是数据表中允许的最大值,但必须将寄存器0x2c的第8位设置为1。 enter image description here

关于odr,您使用的寄存器和值是正确的,并且在我的设置(esp32-wrover + micropython)中可以正常工作。 如果我是您,我会尝试将odr设置为可能的最低值(3.906 Hz),看看它是否有效,例如读取fifo中的所有值,然后检查其重新填充的速度,然后随着频率的增长而长大。

请考虑一下,根据我的经验,使用I2C不能达到2kHz以上(我仅在实际波特率较低的ADXL345上进行过尝试):要达到4kHz,我将使用SPI,即使代码必须非常优化。