昨天经过论坛大神 小虾(@littleshrimp )的指点,终于找到修改源码中修改ODR的大门。原先的ODR是104hz , 我测试了一下,在这个ODR下的 获取数据 及串口发送的时间(只是ACC的,别的我都去掉了):
- // RTC_Handler( &RtcHandle );
- Accelero_Sensor_Handler( LSM6DSM_X_0_handle );
- // Gyro_Sensor_Handler( LSM6DSM_G_0_handle );
- // Magneto_Sensor_Handler( LSM303AGR_M_0_handle );
- // Pressure_Sensor_Handler( LPS22HB_P_0_handle );
复制代码
这里我是通过测量LED灯的亮灭 时间来测量的,不太准确,但是对我来说 也只是想知道这段时间是多少而已:
可以看到这是轮询的10ms (源程序是100ms , 我做了修改/* Data acquisition period [ms] */
#define DATA_PERIOD_MS (10))
上图 的波形 实际上 我还在 Accelero_Sensor_Handler( LSM6DSM_X_0_handle );这个程序里面添加了LED的亮灭 ,来区分接收数据的时间(起始高电平的时间 62us)和USB发送数据的时间(后面低电平的一段时间205us)。
总共在
if(msTick % DATA_PERIOD_MS == 0 && msTickPrev != msTick)
{
。。。
}
这个里面花的时间是270us 。(注意:我还把USB的虚拟串口波特率改成了921600,原来是115200;把Accelero_Sensor_Handler( LSM6DSM_X_0_handle ); 里面串口发送的数据简化到只传数据结尾\n)。
270us 什么概念,3.7Khz 也就是理论上 最大ODR可以达到3.7Khz 。 当然实际上不需要,而且3.7Khz 也绝对不是最大值。
我最后把 DATA_PERIOD_MS 改成了5ms ; ODR改成了208hz 。串口波特率还是921600bps。 在这个条件下,5ms 的轮询还有4.73ms 可以干别的事呢。(比如姿态解算)。
看下效果吧:
流畅运行,MATLAB GUI 不是盖的,动态绘图一点不卡。
文末我把我的MATLAB GUI 源码贴上,感兴趣的可以自己DIY 一下,我自己做的也很粗糙。(PS重要的地方我都注释了)
|