#STM32学习#6D加速度传感器测量风机震动

1、背景:

需要监测风机的启动与停止,希望通过测量其振动频率来辅助判定。

2、传感器:

传统的振动传感器如下图,其有两个缺点:一是测量精度低,对于微小的振动不敏感;二是无法测出分频信号。

#STM32学习#6D加速度传感器测量风机震动_第1张图片#STM32学习#6D加速度传感器测量风机震动_第2张图片

选择使用LSM6DSL加速度/角速度传感器。传感器所在的板子为X-NUCLEO-IKSO1A2。如下图所示。

#STM32学习#6D加速度传感器测量风机震动_第3张图片

 LSM6DSL可以测量出三轴方向的加速度和角速度,而我们监测振动只需要加速度信息。

#STM32学习#6D加速度传感器测量风机震动_第4张图片

3、建工程:

首先使用的开发底板是ST官方的MB1136。所有相关的资料会在下方给出链接。

习惯使用Stm32cubeMX快速建立工程。根据选用开发板的主芯片型号以及传感器链接的引脚,占用的资源进行配置。最终一键生成工程。(关于如何使用stm32MX,可自行度娘,也可在下方讨论)

#STM32学习#6D加速度传感器测量风机震动_第5张图片

值得一提的是:

(1)配置I2C时,需要使用“快速模式”,速度设置为最大(400000Hz),这样可以加快和加速度传感器之间的通信。加速度传感器的输出频率也就可以尽可能提升。实际在测试时发现,在最快的IIC通信速度下,传感器最大可以设置的输出频率为3.33KHz。

(2)配置一个中断输入引脚,接收传感器数据准备好时发来的中断。(也可以自行去读取某状态位)

(3)ST下载口自带的串口,波特率为固定的9600.如果想要更高,需要单独接线。(我就是单独接线,设置为115200)

 

接下来是去工程里编写代码,相信大家都可以编出属于自己逻辑的代码。我的逻辑思路如下:

(1)初始化设备和传感器

(2)传感器启动,准备好一组加速度数据(3个数据,X,Y,Z),产生引脚中断。

(3)F401RE接收到中断,读取6个字节(3个加速度的值)。(直接读取的是补码的形式,而加速度值有正负,需要我们定义变量时使用int16)

#STM32学习#6D加速度传感器测量风机震动_第6张图片

(4)将一组数据(3方向加速度)进行矢量计算,求得其模长ACC。将ACC存入数组直到存满。(考虑到单片机存储空间有限,因而采用模长的数组,1024个double数据)

(5)存满后,不再存储,置为标志位,进行FFT快速傅里叶变换。相关知识参考自:https://blog.csdn.net/yga_airspace/article/details/86688278  。

该链接里面有C语言代码,可以直接运行。在使用时需要注意输入参数关系:

FFT需要定义多个与模长数组同样大小的数组,比较费空间。

double pr[NUM],pi[NUM],fr[NUM],fi[NUM];

 

(6)变换得到的结果被存在pr[1024]中,如果需要观察变换得到的结果,可以将这个数组里的double数据 打印到窗口助手中,再用excel观察变换结果。(打印时,单个数据接换行(\n\r),串口助手中打印的一列数据,直接复制到excel中)。得到的数据列表中第一个为直流分量,可以删除。另外因为某种原因,剩余数据构成的图像呈现左右对称的情况,我们在显示时只取一半就好。如下图所示,传感器放在电脑主机上,测量主机风扇的振动。共计1024个采样点。输出频率为833Hz。(提高采样点个数,横坐标会向右移动。提高输出频率,横坐标会向左移动)(同样是1024个采样点,833Hz输出频率对应145,1.66KHz输出频率对应72,     3.33KHz输出频率对应35)。

#STM32学习#6D加速度传感器测量风机震动_第7张图片

(7)横坐标与振动频率有着直接的关系。我通过模拟输入数据观察发现,采样点数为1024时,傅里叶变换后得到的峰峰极大值的很坐标与实际的频率一致(略有偏移,可以理解)。

 模拟输入pr[1024],包括10Hz,20Hz,30Hz,40Hz,50Hz,60Hz,70Hz,80Hz,90Hz。(参考频率和角速度之间的关系)

for(i=0;i<1024;i++) {
pr[i]=cos(2*PI*0.001*i*10)+cos(2*PI*0.001*i*20)+cos(2*PI*0.001*i*30)+cos(2*PI*0.001*i*40)+cos(2*PI*0.001*i*50)+cos(2*PI*0.001*i*60)+cos(2*PI*0.001*i*70)+cos(2*PI*0.001*i*80)+cos(2*PI*0.001*i*90);
}

下图只使用了其中的第1~128个点做图(采样点数还是1024)

#STM32学习#6D加速度传感器测量风机震动_第8张图片

4、编写上位机

上述显示的过程有点繁琐,因而考虑编写一个上位机用于实时调试。

下位机设备在进行转换之后,直接通过串口,将数据发送到电脑。(每个double数字都先被转换为字符串,以字符串的形式发送。每个数据发送之后,追加发送一个换行符\n,发送完所有数据之后,发送一个'#')

#STM32学习#6D加速度传感器测量风机震动_第9张图片

 

上位机编写,使用的是Qt和C++。具体的实现和源代码感兴趣的童鞋可以问我要一下。

我最方案是,1024个采样点数组,传感器3.33KHz输出频率。电脑主机的频率被测为35Hz(2100转每分钟)。

 

纯属个人经验总结,如有错误,欢迎讨论!

 

 

你可能感兴趣的:(STM32,C,keil)