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

news/2023/12/4 22:29:54

1、背景:

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

2、传感器:

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

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

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

3、建工程:

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

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

值得一提的是:

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

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

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

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

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

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

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

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

(5)存满后,不再存储,置为标志位,进行FFT快速傅里叶变换。相关知识参考自:《C》C语言实现FFT算法_杨贵安的博客-CSDN博客_c语言fft  。

该链接里面有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)。

(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)

4、编写上位机

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

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

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

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

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

2020年12月17日 补充分享LSM6DSL 的初始化函数以及数据读取的函数

LSM6DSL pdf, LSM6DSL description, LSM6DSL datasheets, LSM6DSL view ::: ALLDATASHEET :::

#include "main.h"#define FUNC_CFG_ACCESS              0x01 //嵌入式功能配置寄存器#define SENSOR_SYNC_TIME_FRAME       0x04 //传感器同步配置寄存器
#define SENSOR_SYNC_RES_RATIO        0x05 //传感器同步配置寄存器
#define FIFO_CTRL1                   0x06 //FIFO 配置寄存器
#define FIFO_CTRL2                   0x07 //FIFO 配置寄存器
#define FIFO_CTRL3                   0x08 //FIFO 配置寄存器
#define FIFO_CTRL4                   0x09 //FIFO 配置寄存器
#define FIFO_CTRL5                   0x0a //FIFO 配置寄存器
#define DRDY_PULSE_CFG_G             0x0b //#define INT1_CTRL                    0x0d //
#define INT2_CTRL                    0x0e //
#define WHO_AM_I                     0x0f //芯片ID
#define CTRL1_XL                     0x10 //加速度计和陀螺仪控制寄存器
#define CTRL2_G                      0x11 //
#define CTRL3_C                      0x12 //
#define CTRL4_C                      0x13 //
#define CTRL5_C                      0x14 //
#define CTRL6_C                      0x15 //
#define CTRL7_G                      0x16 //
#define CTRL8_XL                     0x17 //
#define CTRL9_XL                     0x18 //
#define CTRL10_C                     0x19 //
#define MASTER_CONFIG                0x1a //I2C主配置寄存器
#define WAKE_UP_SRC                  0x1b //中断寄存器
#define TAP_SRC                      0x1c //中断寄存器
#define D6D_SRC                      0x1d //中断寄存器
#define STATUS_REG                   0x1e //用户接口的状态数据寄存器#define OUT_TEMP_L                   0x20 //温度输出数据寄存器
#define OUT_TEMP_H                   0x21 //温度输出数据寄存器
#define OUTX_L_G                     0x22 //用户界面的陀螺仪输出寄存器
#define OUTX_H_G                     0x23 //用户界面的陀螺仪输出寄存器
#define OUTY_L_G                     0x24 //用户界面的陀螺仪输出寄存器
#define OUTY_H_G                     0x25 //用户界面的陀螺仪输出寄存器
#define OUTZ_L_G                     0x26 //用户界面的陀螺仪输出寄存器
#define OUTZ_H_G                     0x27 //用户界面的陀螺仪输出寄存器
#define OUTX_L_XL                     0x28 //加速度计输出寄存器
#define OUTX_H_XL                     0x29 //加速度计输出寄存器
#define OUTY_L_XL                     0x2a //加速度计输出寄存器
#define OUTY_H_XL                     0x2b //加速度计输出寄存器
#define OUTZ_L_XL                     0x2c //加速度计输出寄存器
#define OUTZ_H_XL                     0x2d //加速度计输出寄存器
#define SENSORHUB1_REG                0x2e //传感器集线器输出寄存
#define SENSORHUB2_REG                0x2f //传感器集线器输出寄存
#define SENSORHUB3_REG                0x30 //传感器集线器输出寄存
#define SENSORHUB4_REG                0x31 //传感器集线器输出寄存
#define SENSORHUB5_REG                0x32 //传感器集线器输出寄存
#define SENSORHUB6_REG                0x33 //传感器集线器输出寄存
#define SENSORHUB7_REG                0x34 //传感器集线器输出寄存
#define SENSORHUB8_REG                0x35 //传感器集线器输出寄存
#define SENSORHUB9_REG                0x36 //传感器集线器输出寄存
#define SENSORHUB10_REG               0x37 //传感器集线器输出寄存
#define SENSORHUB11_REG               0x38 //传感器集线器输出寄存
#define SENSORHUB12_REG               0x39 //传感器集线器输出寄存
#define FIFO_STATUS1                 0x3a //FIFO状态寄存器
#define FIFO_STATUS2                 0x3b //
#define FIFO_STATUS3                 0x3c //
#define FIFO_STATUS4                 0x3d //
#define FIFO_DATA_OUT_L              0x3e //FIFO数据输出寄存器
#define FIFO_DATA_OUT_H              0x3f //
#define TIMESTAMP0_REG               0x40 //时间戳输出寄存器
#define TIMESTAMP1_REG               0x41 //
#define TIMESTAMP2_REG               0x42 ///*reserved*/#define STEP_TIMESTAMP_L             0x49 //
#define STEP_TIMESTAMP_H             0x4A //
#define STEP_COUNTER_L               0x4b //
#define STEP_COUNTER_H               0x4c //
#define SENSORHUB13_REG              0x4d //传感器集线器输出寄存
#define SENSORHUB14_REG              0x4e //传感器集线器输出寄存
#define SENSORHUB15_REG              0x4f //传感器集线器输出寄存
#define SENSORHUB16_REG              0x50 //传感器集线器输出寄存
#define SENSORHUB17_REG              0x51 //传感器集线器输出寄存
#define SENSORHUB18_REG              0x52 //传感器集线器输出寄存
#define FUNC_SRC1                    0x53 //中断寄存器
#define FUNC_SRC2                    0x54 //
#define WRIST_TILT_IA                0x55 //中断寄存器/*reserved*/#define TAP_CFG                      0x58 //中断寄存器
#define TAP_THS_6D                   0x59 //
#define INT_DUR2                     0x5a //
#define WAKE_UP_THS                  0x5b //
#define WAKE_UP_DUR                  0x5c //
#define FREE_FALL                    0x5d //
#define MD1_CFG                      0x5e //
#define MD2_CFG                      0x5f //
#define MASTER_CMD_CODE              0x60 //----------
#define SENS_SYNC_SPI_ERROR_CODE     0x61 ///*reserved*/#define OUT_MAG_RAW_X_L              0x66 //
#define OUT_MAG_RAW_X_H              0x67 //
#define OUT_MAG_RAW_Y_L              0x68 //
#define OUT_MAG_RAW_Y_H              0x69 //
#define OUT_MAG_RAW_Z_L              0x6a //
#define OUT_MAG_RAW_Z_H              0x6b ///*reserved*/#define X_OFS_USR                    0x73 //加速度用户偏移矫正
#define Y_OFS_USR                    0x74 //
#define Z_OFS_USR                    0x75 ///*  配置  */
uint8_t LSM6DSL_Config[]={CTRL3_C                  ,   0x81,//软件重启
//	FUNC_CFG_ACCESS          ,   0x00,
//	SENSOR_SYNC_TIME_FRAME   ,   0x00,
//	SENSOR_SYNC_RES_RATIO    ,   0x00,
//	FIFO_CTRL1               ,   0x00,
//	FIFO_CTRL2               ,   0x00,
//	FIFO_CTRL3               ,   0x00,
//	FIFO_CTRL4               ,   0x00,
//	FIFO_CTRL5               ,   0x00,DRDY_PULSE_CFG_G         ,   0x80,//脉冲触发(不锁存中断引脚)INT1_CTRL                  ,   0x01,//INT1引脚上各种中断事件的使能位//加速度中断
//  INT2_CTRL                  ,   0x02,//INT2引脚上各种中断事件的使能位//角速度中断CTRL1_XL                   ,   0x94,//加速度输出频率,量程,带宽//[0x60]416Hz  16g
//  CTRL2_G                    ,   0x64,//角速度输出速率,量程,满量程125,0//416hZ 500DPS
//  CTRL4_C                  ,   0x13,//
//  CTRL5_C                  ,   0x14,//
//  CTRL6_C                  ,   0x15,//
//  CTRL7_G                  ,   0x16,//
//  CTRL8_XL                 ,   0x17,//
//  CTRL9_XL                 ,   0x18,//
//  CTRL10_C                 ,   0x19,//
//  MASTER_CONFIG            ,   0x1a,//I2C主配置寄存器
//  TAP_CFG                  ,   0x58,//中断寄存器
//  TAP_THS_6D               ,   0x59,//
//  INT_DUR2                 ,   0x5a,//
//  WAKE_UP_THS              ,   0x5b,//
//  WAKE_UP_DUR              ,   0x5c,//
//  FREE_FALL                ,   0x5d,//
//  MD1_CFG                  ,   0x5e,//
//  MD2_CFG                  ,   0x5f,//
//  MASTER_CMD_CODE          ,   0x60,//----------
//  SENS_SYNC_SPI_ERROR_CODE ,   0x61,//
//  X_OFS_USR                ,   0x73,//加速度用户偏移矫正
//  Y_OFS_USR                ,   0x74,//
//  Z_OFS_USR                ,   0x75,//
};
/* 初始化 */
int LSM6DSL_init()
{uint8_t i=0,ID=0;//---------------------------------------I2C_ReadData(&ID,1,WHO_AM_I);if(ID==0x6a) {//printf("product ID: 0x%02X\n\r",ID);} else {printf("[error] ID Wrong! %02X\n\r",ID);return -1;}//---------------------------------------for(i=0;i<sizeof(LSM6DSL_Config)/sizeof(uint8_t)/2;i++) {//printf("R=0x%02X\tV=0x%02X\n\r",LSM6DSL_Config[i*2],LSM6DSL_Config[i*2+1]);if(I2C_WriteData(LSM6DSL_Config+i*2+1,1,LSM6DSL_Config[i*2])!=0) {printf("[error] I2C_WriteData Wrong!\n\r");return -2;}}//---------------------------------------printf("[success] LSM6DSL_init()\n\r");return 0;
}

以下是硬件IIC 二次封装的函数,建议放在i2c.c文件中。

/* USER CODE BEGIN 1 */#include <stdio.h>
//IIC
#define LSM6DSL_DEV_Adress  0xd6
#define IIS2DLPC_DEV_Adress 0x30
#define LIS2DH12_DEV_Adress 0x30
int I2C_WriteData(uint8_t* pData,uint16_t Size,uint16_t MeAddress)
{HAL_StatusTypeDef ret =HAL_ERROR;uint16_t DevAddress=0;//设备地址uint16_t MemAddsize=I2C_MEMADD_SIZE_8BIT;uint32_t Timeout=1000;I2C_HandleTypeDef* hi2cX=NULL;hi2cX=&hi2c1;DevAddress=LIS2DH12_DEV_Adress;//IIC发送ret=HAL_I2C_Mem_Write(hi2cX,DevAddress,MeAddress,MemAddsize,pData,Size,Timeout);return ret;
}int I2C_ReadData(uint8_t* pData,uint16_t Size,uint16_t MeAddress)
{uint16_t DevAddress=0;//设备地址//uint16_t MeAddress=0;uint16_t MemAddsize=0;uint32_t Timeout=1000;I2C_HandleTypeDef* hi2cX=NULL;hi2cX=&hi2c1;DevAddress=LIS2DH12_DEV_Adress;MemAddsize=I2C_MEMADD_SIZE_8BIT;//IIC读取if(HAL_OK == HAL_I2C_Mem_Read(hi2cX,DevAddress,MeAddress,MemAddsize,pData,Size,Timeout)) {return 0;}return -1;
}/* USER CODE END 1 */

以下函数 用于计算 加速度模长。


uint16_t Calculate_AccXYZ(int16_t X,int16_t Y,int16_t Z)
{uint32_t temp = X*X+Y*Y+Z*Z;return (uint16_t)sqrt(temp);
}

以下函数为读取加速度值,其中ZZZ表示Z轴方向上的数值。

uint8_t Acc_Value[6];
int16_t ZZZ=0;
I2C_ReadData(Acc_Value,6,0x28);// 0x28 //加速度计输出寄存器
ZZZ =Acc_Value[4] + (Acc_Value[5]<<8);

希望能够对大家有所帮助。


http://www.ppmy.cn/news/208843.html

相关文章

c++ 时间类型详解(time_t和tm)

linux下存储时间常见的有两种存储方式&#xff0c;一个是从1970年到现在经过了多少秒&#xff0c;一个是用一个结构来分别存储年月日时分秒的。   time_t 这种类型就是用来存储从1970年到现在经过了多少秒&#xff0c;要想更精确一点&#xff0c;可以用结构struct timeval&am…

Python实现多项式加减乘除-1

1、多项式的表达 如何在程序中表示多项式&#xff1f;在这里我们用 列表 这个数据结构来表示多项式。对于多项式的运算&#xff0c;我们关注的就是系数以及指数&#xff08;也就是次数&#xff09;的变化&#xff0c;所以只需要记录多项式的系数和次数就可以了。 2、如何用列…

Intel Realsense T265使用教程

Intel Realsense T265使用教程 0 更新日志1 T265参数1.1 硬件参数1.2 坐标系描述 2 T265 数据读取2.1 环境安装2.2 读取T265内外参数信息2.3 使用ROS包读取T265数据2.4 使用Opencv库读取T265图像 3 T265附加功能开发3.1 保存T265的轨迹到txt文件3.2 关闭T265回环检测功能 参考资…

从正态分布到T检验

1&#xff0e; 说明 接上次的《几种常见的数学分布》。这次说说T分布和T检验&#xff0c;用词不够严谨&#xff0c;大家就领会精神为主吧~ 2&#xff0e; 什么是抽样 如果整体样本可以一个一个判断叫普查&#xff0c;如果整体样本太多&#xff0c;没法一个一个判断&#xff0c…

C语言 数组中地址加1 理解与举例

文章简介 数组中 地址n 所代表的的意义 一维数组 初始化数组 A[3] {1,2,3}&#xff1b; 遍历数组 sizeof(int) 4&#xff0c;即一个int大小为4个字节&#xff0c;可见每个元素间隔4个字节 代码值指向的值 即&#xff1a;*(代码)&A[0]0X0061FF101&A[1]0X0061FF…

GB/T 36624-2018《可鉴别的加密机制》笔记——3. 机制2:CCM

说明&#xff1a;以下章节写为第7章是为了和标准GB/T 36624-2018的章节对应 7. 机制2——CCM 7.1 CCM概述 CCM是加密认证模式&#xff0c;CCM CTR加密 CBC-MAC认证。 CCM模式看起来比较繁琐&#xff0c;尤其在参数的选择上&#xff0c;限制不断。 很可能在将来某天被别的…

加速度公式1

与加速度有关的公式跟知识点&#xff0c;挑重点记忆吧 一、质点的运动&#xff08;1&#xff09;------直线运动 1&#xff09;匀变速直线运动 1.平均速度V平&#xff1d;s/t&#xff08;定义式&#xff09; 2.有用推论Vt2-Vo2&#xff1d;2as 3.中间时刻速度Vt/2&#xff1d;V…

按键控制数字加1减1

前面学习了数码管和按键,将两者结合,完成一个用两个按键控制加减数字的小程序,一个按键控制加1另一个控制减1。 #include <reg52.h>sbit KeyAdd = P0^0; //加1按键 sbit KeyDec = P0^1; //减1按键 sbit LATCH1 = P2^2; //段锁存 sbit LATCH2 = P2^3; //位锁存 unsigne…

graphpad两组t检验_如何用 GraphPad prism进行 t 检验?

t 检验,主要用于样本含量较小(例如 n<30),总体标准差 σ 未知的正态分布资料,其中又将其分为了配对 t 检验和成组 t 检验。 一、原理及意义 配对 t 检验:又称配对样本均数 t 检验,是组内设计的比较,即相同被试者都接受相同的实验处理,所检验的对象是同一组别。 成组 …

知道路程时间求加速度_加速度位移时间的公式

求 高一物理关于 位移 加速度 与 时间 速度 等关系式 1.平均速度V平=S/t (定义式) 2.有用推论Vt^2 –Vo^2=2as 3.中间时刻速度 Vt/2=V平=(Vt+Vo)/2 4.末速度Vt=Vo+at 5.中间位置速度Vs/2=[(Vo^2 +Vt^2)/2]1/2 6.位移S= V平t=Vot + at^2/2=Vt/2t 7.加速度a=(Vt-Vo)/t 以Vo为正方…

GB/T 36624-2018《可鉴别的加密机制》笔记——6. 机制5:GCM

说明&#xff1a;以下章节写为第10章是为了和标准GB/T 36624-2018的章节对应 10. 机制5——GCM GCM是一种有大吞吐能力的加密认证模式。其中主要适用了CRT模式和类似CBC模式的GHASH模式。CRT模式基本上没有大多变化&#xff0c;GHASH则是利用有限域上的乘法进行HASH&#xff…

S形加减速

加加速段 加加速度为 jmax &#xff0c;加速度线性增加至设定值或最大值 amax 。匀加速段 加加速度为0&#xff0c;加速度恒定。减加速段 当速度接近设定的值或最大值 vmax 时&#xff0c;加加速度突变为反向的 jmax &#xff0c;进入加速度线性减小的变减速运动阶段。匀速…

python 加速度_「加速度公式」加速度公式1 - seo实验室

加速度公式 与加速度有关的公式跟知识点,挑重点记忆吧 一、质点的运动(1)------直线运动 1)匀变速直线运动 1.平均速度V平=s/t(定义式) 2.有用推论Vt2-Vo2=2as 3.中间时刻速度Vt/2=V平=(Vt+Vo)/2 4.末速度Vt=Vo+at 5.中间位置速度Vs/2=[(Vo2+Vt2)/2]1/2 6.位移s=V平t=…

步进电机T型和S型速度曲线

一种用于步进电机加速度的新算法可以实现速度曲线的实时参数化和计算。该算法可以在低端微控制器上运行&#xff0c;只使用简单的定点算术运算并且不使用数据表。它以恒定的加速度和减速度形成线性斜坡时间的准确近似值。 通常认为&#xff0c;步进电机线性速度斜坡的时间过于复…

T-test数据分析

学习内容来自: https://zhuanlan.zhihu.com/p/38243421 正文&#xff1a; t-test 也称为 Students T Test&#xff0c;用来比较两样本平均值之间是否具有显著性差异&#xff1b; T-test的类型&#xff1a; one-sample t-test&#xff0c;用来比较单个样本平均值和一个给定…

GB/T 36624-2018《可鉴别的加密机制》笔记——2. 机制1:Key Wrap

说明&#xff1a;以下章节写为第6章是为了和标准GB/T 36624-2018的章节对应 6. 机制1——Key Wrap 密钥封装是为了对密钥进行保护&#xff0c;比如密钥存储在不太安全的存储设备中&#xff0c;或者密钥需要在网络中传输。 2001年&#xff0c;NIST发布了AES Key Wrap Specific…

javascript SHA1加密

下面是神兽包: 放了java rsa 公钥私钥生成和加解密,java zip加解密,javascript MD5 SHA1 RSA加密&#xff0c;穷积分&#xff0c;勿怪 http://download.csdn.net/detail/k21325/9737004 前面找了段javascript MD5加密 这里再补上一个SHA1的 // SHA1 function add(x, y) {ret…

给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合

【题目】给定一个数t&#xff0c;以及n个整数&#xff0c;在这n个数中找到加和为t的所有组合&#xff0c;例如t 4, n 6,这6个数为 [4, 3, 2, 2, 1, 1],这样输出就有4个不同的组合它们的加和为4: 4, 31, 22, and 211. 请设计一个高效算法实现这个需求。-----阿里2011实习生笔…

设计原则-里氏替换原则

凡事皆有利弊&#xff0c;面向对象设计语言通过提供继承、多态等机制使得项目代码更具有复用性、可扩展性等优点&#xff0c;但是这些机制也存在一定的使用风险&#xff0c;比如继承的滥用、多态实现的不确定性等问题都有可能会引起重大线上事故。 一、里氏替换原则概念 里氏…

Vue2模拟贪吃蛇小游戏

目录 一、效果展示 二、代码展示 三、原理讲解 3.1、页面创建 3.2、创建蛇与食物 3.3、移动与边界判断 3.4、吃、得分总结 二、代码展示 view的本地文件&#xff1a;可直接运行。 <template><div class"game"><div class"game-div"…
最新文章