由于科研的任务,我需要同时采集并输出3个麦克风的数据和一个加速度计(3轴)数据。因为数据要用于研究发论文,所以对数据的精确性,实时性,采集速率要求都挺高的。最后我把采集频率固定在3.2kHz,没有达到最大,够用就行。由于精度的要求,每个数据我都固定为两个字节,所以我需要每秒钟采集并输出323.2k(adc)+323.2k(adxl345)=38.4kByte/s;
串口的波特率设置
我需要输出38.4kbyte/s的数据,平常我们我们使用的串口波特率是9600bps和115200bps,转算一下我这个38.4kbyte/s就是307200bps,平时的波特率完全不够,所以我用了921600bps。STM32可以在串口初始化那里设置,使用HAL库的话记得要改一下。此外还需要在pc端的串口接收的地方改一下。我用的是windows,具体可以在:此电脑->属性->设备管理器,然后鼠标右键你的端口(就是COM*)
具体的数据采集
采集的话主要是采集频率的固定,对于用于研究的数据没两次采集的时间间隔都要固定,这也是我为什么把数据的采集频率定在3.2k的原因,更高的采集频率的话,一次还没采集完毕,下一次就又到点采集了。具体测试的方法就是使用keil自带的debug,运行时间在左下方都看得到,如果想要更高的采集频率,代码运行速度更快的话,可以试试把芯片的时钟频率调高一点,我使用的是F103,默认是8MHZ,但是完全不够我用来采集数据,我就在 对于固定采集频率的话我使用的是定时器,固定时间触发一次,每触发一次就在函数里执行数据采集:options for target->Utilities->setting->Trace更改。
具体的数据输出
我试过使用Flash对数据存储,对,每秒钟存38.4kbyte,对于F103有自带的256K的存储区,只要不把原先存代码的寄存器改了就可以用,这样的话,数据可以保存,但是能够存储的数据就不多了,用于研究的话,哪一组都是能采多少就采多少,所以FLAH就是重复的擦拭读写,其实意义也不大。后来我直接使用UART发送,采集一组输出一组,简单实用,测试成功。
数据转化
使用我这种方法输出的数据如下: 很抽象,按照我之前的数据输出,有规律但是不能直接用,所以我就用C++把文本分类了,可以直接用matlab分析。
具体代码可以去: Rise-wb/STM32 Rise-wb/data-transfer 如果对你有帮助的话给个star和赞吧。
|