三轴加速度计LIS2DUX12开发(2)----静态校准

三轴加速度计LIS2DUX12开发.2----静态校准

  • 概述
  • 硬件准备
  • 视频教学
  • 样品申请
  • 源码下载
  • 六位置法的标定方案
  • 旋转加速度计以找到极值
  • 计算偏移和灵敏度
  • 应用校准参数
  • 注意事项
  • 串口中断
  • 变量定义
  • 主程序流程
  • 串口发送定义
  • 演示

概述

最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:615061293 。

零偏是影响加速度计输出精度的重要指标之一,零偏可分为静态零偏和动态零偏 。静态零偏也称为固定零偏,通常经标定与补偿减小静态零偏。动态零偏是由于加速度计自身的缺陷或环境因素(如温度、振动、电子干扰等)引起的,悬丝加速度计在运动过程中其精度会受到动态零偏的影响,因此在投入使用前要先对加速度计的动态零偏进行测试。

在这里插入图片描述

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为STM32U073CC,加速度计为LIS2DUX12

在这里插入图片描述

视频教学

https://www.bilibili.com/video/BV17J4m1W7Fb/

三轴加速度计LIS2DUX12开发(2)----静态校准

样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#

源码下载

六位置法的标定方案

本文在校准三轴加速度计时使用六位置校准法,该方法使用地球的重力力加速度在静态下校准三轴加速度传感器,具体的校准过程如下图所示。具体校准过程如下:

  1. 将传感器的Y轴垂直水平面向下;
  2. 以X轴为基准轴,绕其逆旋转90°,使乙轴垂直水平面向上
  3. 以Y轴为基准轴,绕其逆旋转90°,使X轴垂直水平面向下
  4. 以Y轴为基准轴,绕其逆时针旋转90°使2轴垂直水平面向下
  5. 绕Y轴逆时针旋转909、使X轴垂直水平面向上
  6. 绕Z轴顺时针旋转90°、使Y轴垂直水平面向上

在这里插入图片描述

在没有精密设备的情况下。这种方法基本上是在试图找到每个轴的偏移(zero-g offset)和灵敏度(scale factor)。这种方法通常称为静态校准方法,因为它不需要动态输入,只需将设备置于静态的已知方向即可。

旋转加速度计以找到极值

将加速度计沿每个轴正向和反向对齐,使其尽可能地与地球重力向量对齐。在理想情况下,当某一轴完全与地球的重力向量对齐时,该轴应显示约 ±1g 的读数,而其他轴应显示 0g。
记录每个轴在这六个方向(X+, X-, Y+, Y-, Z+, Z-)的输出,即每个轴的最大值和最小值。
在未校准情况下,读出的数据会超过1g的数值,所以要进行加速度计校准。

在这里插入图片描述

计算偏移和灵敏度

偏移(Offset):可以通过计算每个轴最大值和最小值的平均值得到:

Offset=(Max value+Min value)/2

灵敏度(Scale factor):可以通过两个极值之差与2g(因为从+1g到-1g的总变化是2g)的比例来计算:

Scale factor=(Max value-Min value)/2g

应用校准参数

一旦计算得到每个轴的偏移量和灵敏度,校准参数就可以应用到新的加速度计测量数据中以修正这些数据。修正后的加速度值由下列公式计算得出:

Calibrated value= (Raw value−Offset)/Scale Factor

这个步骤实质上是一个线性变换,它调整原始加速度读数以反映真实的加速度。
这些算法步骤基于直接的数学操作,并不涉及复杂的统计算法或优化算法。这些方法足以处理大多数基本应用场景下的加速度计校准需求,尤其是在资源受限的嵌入式系统中。如果环境变化大或加速度计的非理想特性影响较大(如高温、机械应力等),可能需要更复杂的算法来进行动态校准或更高级的误差补偿。

注意事项

  1. 确保在静态环境中进行测试,避免任何震动或移动。
  2. 使用精确的水平仪确保加速度计的对齐。
  3. 可以通过多次测量和取平均值来增加校准的准确性。
    这种校准方法相对简单,适合大多数基本应用,但对于需要极高精度的应用,可能需要更复杂的校准技术和专业设备。

串口中断

开启串口中断来接收数据。

在这里插入图片描述

要在主程序钟开启中断接收。

	HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuff, 1); //打开串口中断接收

定义接收函数。

// 捕获中断回调函数,每次捕获到信号就会进入这个回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle)
{

    Rx_flag=RxBuff[0];   
    RxBuff[0]=0;
//	printf("flag=%d",Rx_flag);
    HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuff, 1); //每接收一个数据,就打开一次串口中断接收,否则只会接收一个数据就停止接收

}

变量定义

data_accx_min, data_accx_max, data_accy_min, data_accy_max, data_accz_min, data_accz_max:这些变量存储加速度计在X、Y、Z轴上的最小值和最大值。这些极值通常是通过在特定时间内收集加速度计数据,然后从这些数据中找出最小值和最大值得到的。
Offset_x, Offset_y, Offset_z:这些是各轴的偏移值,计算方法是各轴最大值和最小值的算术平均值。偏移值用于调整每个轴的零点位置,使其在没有运动时接近零。
Scale_factor_x, Scale_factor_y, Scale_factor_z:这些是各轴的灵敏度系数,计算方法是各轴最大值和最小值的差除以2。这个系数用于调整每个轴的测量值,使其在已知加速度的情况下反映实际的物理加速度。
calibrated_x, calibrated_y, calibrated_z:这些变量用于存储校准后的加速度值,校准的目的是确保加速度计输出准确反映实际加速度。
校准参数计算函数 calculate_calibration_params,此函数执行以下操作:
计算偏移(Offset):通过取每个轴的最大值和最小值的平均值来计算偏移。这样做是为了将未校准的加速度计读数的中心调整到0点附近,以补偿传感器的系统偏差。
计算灵敏度(Scale factor):通过取每个轴的最大值和最小值之差的一半来计算灵敏度。这个值表示了在理想条件下,传感器输出从最小到最大应覆盖的理想范围(通常是±1g)。通过这种方式,您可以根据实际的传感器响应调整加速度计的读数。

float data_accx_min=0,data_accx_max=0;//加速度计x轴极值
float data_accy_min=0,data_accy_max=0;//加速度计y轴极值
float data_accz_min=0,data_accz_max=0;//加速度计z轴极值

float Offset_x=0.0f;//x偏移
float Scale_factor_x=0.0f;//x灵敏度
float Offset_y=0.0f;//y偏移
float Scale_factor_y=0.0f;//y灵敏度
float Offset_z=0.0f;//z偏移
float Scale_factor_z=0.0f;//z灵敏度

float calibrated_x=0.0f;//校准后加速度计x轴值
float calibrated_y=0.0f;//校准后加速度计y轴值
float calibrated_z=0.0f;//校准后加速度计z轴值

int acc_i=0;

uint8_t RxBuff[1];      //进入中断接收数据的数组
int Rx_flag=0;					//接受到数据标志


void calculate_calibration_params(void) {
	
	Offset_x=(data_accx_max+data_accx_min)/2;
	Offset_y=(data_accy_max+data_accy_min)/2;			
	Offset_z=(data_accz_max+data_accz_min)/2;		
	
	
	Scale_factor_x=(data_accx_max-data_accx_min)/2;
	Scale_factor_y=(data_accy_max-data_accy_min)/2;			
	Scale_factor_z=(data_accz_max-data_accz_min)/2;		
	
}

主程序流程

使用 lis2dux12_status_get 函数检查新的加速度计数据是否已经准备好。如果status.drdy(数据就绪标志)为真,这意味着有新数据可读。
通过调用 lis2dux12_xl_data_get 函数读取加速度计数据。这些数据被存储在 data_xl.mg 数组中,分别对应 X、Y、Z 轴的加速度值。
根据 Rx_flag 的值,更新对应轴的最小值或最大值。每次更新后,调用 calculate_calibration_params 函数重新计算校准参数。
Rx_flag == 1 和 Rx_flag == 2 分别更新 X 轴的最小和最大值。
Rx_flag == 3 和 Rx_flag == 4 分别更新 Y 轴的最小和最大值。
Rx_flag == 5 和 Rx_flag == 6 分别更新 Z 轴的最小和最大值。
使用更新后的校准参数(偏移和灵敏度)来校准读取的加速度数据。校准公式为:
Calibrated value= 1000*(Raw value−Offset)/Scale Factor
这里乘以1000是为了将结果转换为毫重力单位(mg),常用于显示加速度计的读数。

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		
   /* Read output only if new values are available */
    lis2dux12_status_get(&dev_ctx, &status);
    if (status.drdy) {
      lis2dux12_xl_data_get(&dev_ctx, &md, &data_xl);
		if(Rx_flag==1)//X轴min
		{
			data_accx_min=data_xl.mg[0];
			Rx_flag=0;
			calculate_calibration_params();
		}
		else if(Rx_flag==2)//X轴max
		{
			data_accx_max=data_xl.mg[0];
			Rx_flag=0;
			calculate_calibration_params();
		}
		else if(Rx_flag==3)//Y轴min
		{
			data_accy_min=data_xl.mg[1];
			Rx_flag=0;
			calculate_calibration_params();
		}		
		else if(Rx_flag==4)//Y轴max
		{
			data_accy_max=data_xl.mg[1];
			Rx_flag=0;
			calculate_calibration_params();
		}		
		else if(Rx_flag==5)//Y轴min
		{
			data_accz_min=data_xl.mg[2];
			Rx_flag=0;
			calculate_calibration_params();
		}		
		else if(Rx_flag==6)//Y轴max
		{
			data_accz_max=data_xl.mg[2];
			Rx_flag=0;
			calculate_calibration_params();
		}			

			calibrated_x=1000*(data_xl.mg[0]-Offset_x)/Scale_factor_x;
			calibrated_y=1000*(data_xl.mg[1]-Offset_y)/Scale_factor_y;			
			calibrated_z=1000*(data_xl.mg[2]-Offset_z)/Scale_factor_z;			
			
			
			printf("min_x=%4.2f,max_x=%4.2lf,min_y=%4.2f,max_y=%4.2f,min_z=%4.2f,max_z=%4.2f\r\n",
			data_accx_min,data_accx_max,data_accy_min,data_accy_max,data_accz_min,data_accz_max);				
			printf("校准前acc[mg]:%4.2f\t%4.2f\t%4.2f\r\n",
			data_xl.mg[0], data_xl.mg[1], data_xl.mg[2]);			
			printf("校准后acc[mg]:%4.2f\t%4.2f\t%4.2f\r\n",
			calibrated_x, calibrated_y, calibrated_z);			

		HAL_Delay(10);
		
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

串口发送定义

在这里插入图片描述

演示

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/562900.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

木马——文件上传

目录 1、WebShell 2.一句话木马 靶场训练 3.蚁剑 虚拟终端 文件管理 ​编辑 数据操作 4.404.php 5.文件上传漏洞 客户端JS检测 右键查看元素,删除检测代码 BP拦截JPG修改为php 服务端检测 1.MIME类型检测 2.文件幻数检测 3.后缀名检测 1、WebShell W…

【Hadoop】-HDFS的Shell操作[3]

目录 前言 一、HDFS集群启停命令 1.一键启停脚本可用 2.独立进程启停可用 二、文件系统操作命令 1、创建文件夹 2、查看指定目录下内容 3、上传文件到HDFS指定目录下 4、查看HDFS文件内容 5、下载HDFS文件 6、拷贝HDFS文件 7、追加数据到HDFS文件中 8、HDFS数据移…

【信号处理】基于CNN的心电(ECG)信号分类典型方法实现(tensorflow)

关于 本实验使用1维卷积神经网络实现心电信号的5分类。由于数据类别不均衡,这里使用典型的上采样方法,实现数据类别的均衡化处理。 工具 方法实现 数据加载 Read the CSV file datasets: NORMAL_LABEL0 , ABNORMAL_LABEL1,2,3,4,5 ptbdb_abnormalpd.…

使用JavaScript收集和发送用户设备信息,后端使用php将数据保存在本地json,便于后期分析数据

js代码部分 <script> // 之前提供的JavaScript代码 fetch(https://api.ipify.org?formatjson).then(response > response.json()).then(data > {const deviceInfo {userAgent: navigator.userAgent,platform: navigator.platform,language: navigator.language,…

[Spring Cloud] (4)搭建Vue2与网关、微服务通信并配置跨域

文章目录 前言gatway网关跨域配置取消微服务跨域配置 创建vue2项目准备一个原始vue2项目安装vue-router创建路由vue.config.js配置修改App.vue修改 添加接口访问安装axios创建request.js创建index.js创建InfoApi.js main.jssecurityUtils.js 前端登录界面登录消息提示框 最终效…

微信小程序vue.js+uniapp服装商城销售管理系统nodejs-java

本技术是java平台的开源应用框架&#xff0c;其目的是简化Sping的初始搭建和开发过程。默认配置了很多框架的使用方式&#xff0c;自动加载Jar包&#xff0c;为了让用户尽可能快的跑起来spring应用程序。 SpinrgBoot的主要优点有&#xff1a; 1、为所有spring开发提供了一个更快…

贝叶斯分类 python

贝叶斯分类 python 贝叶斯分类器是一种基于贝叶斯定理的分类方法&#xff0c;常用于文本分类、垃圾邮件过滤等领域。 在Python中&#xff0c;我们可以使用scikit-learn库来实现贝叶斯分类器。 下面是一个使用Gaussian Naive Bayes(高斯朴素贝叶斯)分类器的简单示例&#xff1…

大数据Hive中的UDF:自定义数据处理的利器(上)

文章目录 1. 前言2. UDF与宏及静态表的对比3. 深入理解UDF4. 实现自定义UDF 1. 前言 在大数据技术栈中&#xff0c;Apache Hive 扮演着数据仓库的关键角色&#xff0c;它提供了丰富的数据操作功能&#xff0c;并通过类似于 SQL 的 HiveQL 语言简化了对 Hadoop 数据的处理。然而…

汇编语言(详解)

汇编语言安装指南 第一步&#xff1a;在github上下载汇编语言的安装包 网址&#xff1a;GitHub - HaiPenglai/bilibili_assembly: B站-汇编语言-pdf、代码、环境等资料B站-汇编语言-pdf、代码、环境等资料. Contribute to HaiPenglai/bilibili_assembly development by creat…

STM32 | USART实战案例

STM32 | 通用同步/异步串行接收/发送器USART带蓝牙(第六天)随着扩展的内容越来越多,很多小伙伴已经忘记了之前的学习内容,然后后面这些都很难理解。STM32合集已在专栏创建,方面大家学习。1、通过电脑串口助手发送数据,控制开发板LED灯 从题目中可以挖掘出,本次使用led、延…

【JVM常见问题总结】

文章目录 jvm介绍jvm内存模型jvm内存分配参数jvm堆中存储对象&#xff1a;对象在堆中创建分配内存过程 jvm 堆垃圾收集器垃圾回收算法标记阶段引用计数算法可达性分析算法 清除阶段标记清除算法复制算法标记压缩算法 实际jvm参数实战jvm调优jvm常用命令常用工具 jvm介绍 Java虚…

C++设计模式:适配器模式(十四)

1、定义与动机 定义&#xff1a;将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。 动机&#xff1a; 在软件系统中&#xff0c;由于应用环境的变化&#xff0c;常常需要将“一些现存的对象”放在新的环境…

【Hadoop】- YARN概述[6]

目录 一、YARN & Reduce 二、分布式资源调度 - YARN 1、资源调度 2、YARN的资源调度 总结 一、YARN & Reduce MapReduce是基于YARN运行的&#xff0c;即没有YARN “无法” 运行MapReduce程序。 二、分布式资源调度 - YARN YARN&#xff08;Yet Another Resou…

注意力机制中多层的作用

1.多层的作用 在注意力机制中&#xff0c;多层的作用通常指的是将注意力机制堆叠在多个层上&#xff0c;这在深度学习模型中被称为“深度”或“多层”注意力网络。这种多层结构的作用和实现过程如下&#xff1a; 1. **逐层抽象**&#xff1a;每一层都可以捕捉到输入数据的不同…

Oracle之SQL plus的一些经验心得

每次登入SQL plus后,不知道时哪个用户登入,非常不方便,只能使用show user查看。 以下时可以通过一些设置实现上述的效果,知道时哪个用户登入,和实现输出效果等 1)SQL plus使用细则 SQL plus登录时,我们可以设置一些通用的设置,在每次登入SQL plus的时候生效。 [root@c…

Eclipse+Java+Swing实现学生信息管理系统-TXT存储信息

一、系统介绍 1.开发环境 操作系统&#xff1a;Win10 开发工具 &#xff1a;Eclipse2021 JDK版本&#xff1a;jdk1.8 存储方式&#xff1a;Txt文件存储 2.技术选型 JavaSwingTxt 3.功能模块 4.工程结构 5.系统功能 1.系统登录 管理员可以登录系统。 2.教师-查看学生…

rmallox勒索病毒威胁网络安全:如何避免数据被锁定

尊敬的读者&#xff1a; 随着信息技术的飞速发展&#xff0c;网络空间的安全问题日益凸显。近年来&#xff0c;一种名为.rmallox的勒索病毒频繁出没&#xff0c;给广大计算机用户带来了严重的困扰。本文将对该病毒进行深入剖析&#xff0c;并探讨相应的应对策略。在面对被勒索…

VulnHub靶机 DC-7 打靶 渗透详细流程

VulnHub靶机 DC-7 实战打靶 详细渗透测试流程 目录 VulnHub靶机 DC-7 实战打靶 详细渗透测试流程一、将靶机配置文件导入虚拟机当中二、渗透测试流程主机发现端口扫描目录爆破web渗透白盒测试ssh远程连接 提权修改后台密码GETSHELL反弹shell 一、将靶机配置文件导入虚拟机当中 …

深度神经网络(DNN)

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个深度神经网络&#xff08;DNN&#xff09;模型程序,最后打印5个条件分别的影响力。 示例 在深度神经网络&#xf…

【免费源码下载】完美运营版商城 虚拟商品全功能商城 全能商城小程序 智慧商城系统 全品类百货商城php+uniapp

简介 完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城 干干净净 没有一丝多余收据 还没过手其他站 还没乱七八走的广告和后门 后台可以自由拖曳修改前端UI页面 还支持虚拟商品自动发货等功能 挺不错的一套源码 前端UNIAPP 后端PHP 一键部署版本&am…