项目调试记录1:使用6轴加速度计LSM6DS3TR_C获取设备当前姿态角

一、项目背景

        之前在项目中使用3轴加速度传感器利用向量法,判断设备是否发生偏转,应用效果很不错,很多情况下都可以有效判断设备是否发生偏转。但是本质上三轴加速度计只能判断俯仰角以及翻滚角的变化,对于偏航角发生变化无法检测到,所以尝试使用6轴加速度传感器,对三种姿态角进行获取,以求寻找新的使用方案。

二、6轴加速度计LSM6DS3TR_C的介绍

        LSM6DS3TR_Cs是ST的MEMS传感器系列中的一员,具有一个3D数字加速度计和一个3D数字陀螺仪,加速度满量程范围为 ±2/±4/±8/±16 g,加速度范围±125/±250/±500/±1000/±2000 dps,供电电压1.71V~3.6V,可通过I2C接口或者SPI接口读取传感器数据,官网有完整驱动资料,可供下载,详细资料可参考官网:LSM6DS3TR-C - iNEMO 6DoF inertial measurement unit (IMU), for entry level / mid-tier smart phones and Portable PC platforms - STMicroelectronics

三、调试过程

         笔者使用的是单片机的SPI接口调试传感器,SPI初始化这里就不说明,可参考STM32网上标准例程。

1、传感器初始化

	lsm6ds_device_id_get(&dev_ctx,&whoamI);
	printf("Sensor ID:%x...\r\n",whoamI);
	if(whoamI != LSM6DS3TR_C_ID)
		printf("Sensor Error...\r\n");
	else
		printf("Sensor OK...\r\n");
	/* Restore default configuration */
	lsm6ds_reset_set(&dev_ctx, PROPERTY_ENABLE);  /*软件复位*/
	lsm6ds_reset_get(&dev_ctx,&rst);
	printf("rst:%x...\r\n",rst);
	/* Enable Block Data Update */
	lsm6ds_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);/*输出寄存器直到读取MSB和LSB才更新*/
	/* Set Output Data Rate */
	lsm6ds3tr_c_xl_data_rate_set(&dev_ctx, LSM6DS3TR_C_XL_ODR_12Hz5); /*加速度输出速率12.5Hz*/
	lsm6ds3tr_c_gy_data_rate_set(&dev_ctx, LSM6DS3TR_C_GY_ODR_12Hz5); /*角速度输出速率12.5*/
	/* Set full scale */
	lsm6ds3tr_c_xl_full_scale_set(&dev_ctx, LSM6DS3TR_C_2g);    /*加速度计量程+-2g*/
	lsm6ds3tr_c_gy_full_scale_set(&dev_ctx, LSM6DS3TR_C_2000dps); /*角速度量程2000dps*/
	/* Configure filtering chain(No aux interface) */
	/* Accelerometer - analog filter */
	 lsm6ds3tr_c_xl_filter_analog_set(&dev_ctx,
                                   LSM6DS3TR_C_XL_ANA_BW_400Hz); /*加速度计模拟链带宽选择400Hz*/
	 /* Accelerometer - LPF1 + LPF2 path */
	lsm6ds3tr_c_xl_lp2_bandwidth_set(&dev_ctx,    /*加速度复合滤波器默认,低通默认*/
                                   LSM6DS3TR_C_XL_LOW_NOISE_LP_ODR_DIV_100);
	/* Gyroscope - filtering chain */
	lsm6ds3tr_c_gy_band_pass_set(&dev_ctx,    /*角速度默认值*/
                               LSM6DS3TR_C_HP_260mHz_LP1_STRONG);

2、读取加速度以及角速度 

         笔者这里每隔80ms采集一个点,因为初始化中设置的数据更新频率是125Hz  ,一次采集10个点, 将这10个点作为互补滤波算法的输入量,计算姿态角。这里也可以做滤波,获取更精确的加速度和角速度。互补滤波算法可在网上找到很多资料,这里也不详述,后面会将工程贴出,供大家参考

lsm6ds3tr_c_status_reg_t reg;
	uint8_t i = 0;
	int16_t  data_raw_acceleration[3] = {0};
	int16_t  data_raw_angular_rate[3] = {0};
	for(i = 0;i < 10;i++)
	{
		lsm6ds3tr_c_status_reg_get(&dev_ctx, &reg);
		if(reg.xlda) /* Read magnetic field data */
		{
			memset(data_raw_acceleration, 0x00, 3 * sizeof(int16_t));
			lsm6ds3tr_c_acceleration_raw_get(&dev_ctx,data_raw_acceleration);
			acceleration_mg[0] = lsm6ds3tr_c_from_fs2g_to_mg(data_raw_acceleration[0]);
			acceleration_mg[1] = lsm6ds3tr_c_from_fs2g_to_mg(data_raw_acceleration[1]);
			acceleration_mg[2] = lsm6ds3tr_c_from_fs2g_to_mg(data_raw_acceleration[2]);
		}
		if(reg.gda)  /* Read magnetic field data */
		{
			memset(data_raw_angular_rate, 0x00, 3 * sizeof(int16_t));
			lsm6ds3tr_c_angular_rate_raw_get(&dev_ctx,data_raw_angular_rate);
			angular_rate_mdps[0] = lsm6ds3tr_c_from_fs2000dps_to_mdps(data_raw_angular_rate[0]);
			angular_rate_mdps[1] = lsm6ds3tr_c_from_fs2000dps_to_mdps(data_raw_angular_rate[1]);
			angular_rate_mdps[2] = lsm6ds3tr_c_from_fs2000dps_to_mdps(data_raw_angular_rate[2]);
			
		}
		Motion_Update(angular_rate_mdps[0],angular_rate_mdps[1], angular_rate_mdps[2],acceleration_mg[0], acceleration_mg[1], acceleration_mg[2],
		pitch,roll,yaw);
		HAL_Delay(80);
	}

项目工程代码:6轴加速度传感器+姿态角+互补滤波算法+卡尔曼滤波算法-智慧城市文档类资源-CSDN下载

        

### 回答1: LSM6DS3TR-C是一种高精度、低功耗的MEMS惯性传感器,可用于测量加速度和速度。官方例程是官方提供的基于LSM6DS3TR-C的开发板的示例代码,用于演示传感器的基本功能和操作方式。 例程中包含了初始化传感器、配置传感器参数、读取传感器数据等功能。首先,我们需要使用正确的通信接口(如I2C或SPI)连接传感器,并设置好时钟频率和其他参数。然后,通过逐步执行下面的操作,我们可以使用官方例程: 1. 初始化传感器:这一步骤包括对传感器进行复位和初始化,确保传感器处于正确的工作状态。 2. 配置传感器参数:根据实际需要,我们可以设置传感器的输出数据速率、量程范围和滤波器等参数。这些参数的选择取决于具体的应用场景和性能要求。 3. 读取传感器数据:通过官方例程提供的函数,我们可以读取加速度和速度数据。这些数据可以在应用程序中进一步处理,如进行运动分析、姿态估计等。 官方例程还可能包含一些其他功能,例如温度测量、中断处理等。除了提供示例代码,官方例程还可以提供相关的文档和说明,以帮助开发者更好地理解和使用传感器。 总之,LSM6DS3TR-C官方例程是一种非常实用的资源,可以帮助开发者快速上手并充分发挥传感器的性能。通过理解和使用官方例程,我们可以更好地应用和定制LSM6DS3TR-C传感器,满足各种应用需求。 ### 回答2: lsm6ds3tr_c是一款常见的6惯性测量单元(IMU)传感器,其官方例程提供了使用该传感器的示例代码。 该传感器是一种高性能、低功耗、具有3加速度计和3陀螺仪功能的传感器,可用于测量物体的加速度和速度。官方例程提供了一个基本的代码框架,以帮助开发者快速开始使用该传感器。 官方例程通常包含了初始化传感器的代码,配置传感器的参数,读取传感器数据的代码等。开发者可以根据自己的需求进行修改和扩展。 在使用lsm6ds3tr_c传感器的官方例程时,需要注意以下几点: 1. 引脚配置:lsm6ds3tr_c传感器是通过I2C或SPI接口与微控制器进行通信的,需要根据具体的硬件连接将引脚进行正确的配置。 2. 传感器初始化:在示例代码的开始部分通常包含了传感器的初始化代码,包括设置传感器的采样频率、量程范围等。 3. 数据读取:示例代码中通常包含了从传感器中读取数据的代码,包括加速度和速度的测量值。开发者可以根据需要读取特定的数据,并根据读取的数据进行后续处理。 4. 错误处理:在实际使用中,可能会遇到传感器初始化失败、数据读取失败等情况。官方例程通常也会包含一些错误处理的代码,开发者可以根据情况进行适当的处理。 总之,lsm6ds3tr_c官方例程提供了使用这款传感器的代码示例,开发者可以根据自己的需求进行修改和扩展,以实现更复杂的功能。 ### 回答3: lsm6ds3tr_c是一款常用的惯性测量单元(IMU)传感器模块,它可以测量物体的加速度和速度。官方例程提供了一个基本的代码示例,用于帮助用户快速了解和使用该传感器模块。 该官方例程提供了以下几个主要功能: 1. 初始化:它初始化了传感器模块的设置,包括设置测量范围、采样频率等参数。 2. 数据读取:它通过读取传感器的寄存器,获取当前的加速度和速度数值,并将其存储在一个数组中。 3. 数据处理:通过一些简单的运算,对读取到的原始数据进行进一步处理,例如将加速度和速度转换为物体的位移和旋转度。 4. 输出:它将处理后的数据以适当的方式进行输出,例如在终端窗口中打印出来,或者发送到其他设备进行进一步处理。 用户可以根据自己的需求和具体的应用场景,对官方例程进行修改和扩展。例如,可以添加一些额外的功能,如数据传输、数据存储、数据可视化等。此外,用户还可以根据具体的硬件平台和开发环境,对官方例程进行适当的适配和优化。 总之,lsm6ds3tr_c官方例程是一个提供了基本功能的代码示例,可以帮助用户快速上手并使用该传感器模块。通过对官方例程的理解和修改,用户可以根据自己的需求进行定制开发,从而实现更加复杂和丰富的应用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值