Mpu9250对于读到初始数据的处理

								Mpu9250对于读到初始数据的处理

1去零飘
1.什么是去零飘?
就是在我们上电读mpu9250的数据时他的初始值并不为0,这个时候需要我们把这个零飘数据取出来,再用读到的数据减去这个零飘数据,就是真实的数据
2.怎么去零飘?
就是校准加速度,角速度,在四轴上电之后,静止几秒,这个时候程序就是在算这个零飘数据,并储存起来
3.代码实现

/******************************************************************************
*函  数:uint8_t MPU9250_OffSet(INT16_XYZ value,INT16_XYZ *offset,uint16_t sensivity)
*功  能:MPU9250零偏校准
*参  数:value: MPU9250原始数据
*        offset:校准后的零偏值
*        sensivity:加速度计的灵敏度
*返回值:1校准完成 0校准未完成
*备  注:无
*******************************************************************************/
uint8_t MPU9250_OffSet(INT16_XYZ value,INT16_XYZ *offset,uint16_t sensivity)
{
	static int32_t tempgx=0,tempgy=0,tempgz=0; 
	static uint16_t cnt_a=0;//使用static修饰的局部变量,表明次变量具有静态存储周期,也就是说该函数执行完后不释放内存
		if(cnt_a==0)
		{
			value.X=0;
			value.Y=0;
			value.Z=0;
			tempgx = 0;
			tempgy = 0;
			tempgz = 0;
			cnt_a = 1;
			sensivity = 0;
			offset->X = 0;
			offset->Y = 0;
			offset->Z = 0;
		}
		tempgx+= 	value.X;
		tempgy+= 	value.Y; 
		tempgz+= 	value.Z-sensivity ;//加速度计校准 sensivity 等于 MPU9250初始化时设置的灵敏度值(8196LSB/g);陀螺仪校准 sensivity = 0;
		if(cnt_a==200)               //200个数值求平均
		{
			offset->X=tempgx/cnt_a;
			offset->Y=tempgy/cnt_a;
			offset->Z=tempgz/cnt_a;
			cnt_a = 0;
			return 1;
		}
		cnt_a++;
	return 0;
}	

说明:
1.MPU9250_OffSet(INT16_XYZ value,INT16_XYZ *offset,uint16_t sensivity)
这个函数就是计算加速度或者角速度的零飘数据, value就是四轴静止释放时读到的原始数据,
offset就是在这段静止的时间里把这个原始数据取200次取平均值得到的零飘数据,
Tempgx,tempgy,tempgz就是我们累加数据存储的地方
2.对于这个sensivity的理解,因为只有z轴方向的加速度初始值就是1g,不能直接清0

/******************************************************************************
*函  数:void MPU9250_Offset(void)
*功  能:对MPU9250进行去零偏处理
*参  数:无
*返回值:无
*备  注:无
*******************************************************************************/
void MPU9250_Offset(void)
{
	//加速度去零偏AD值 
	MPU9250_ACC_RAW.X =((((int16_t)MPU9250_buff[0]) << 8) | MPU9250_buff[1]) - ACC_OFFSET_RAW.X;
	MPU9250_ACC_RAW.Y =((((int16_t)MPU9250_buff[2]) << 8) | MPU9250_buff[3]) - ACC_OFFSET_RAW.Y;
	MPU9250_ACC_RAW.Z =((((int16_t)MPU9250_buff[4]) << 8) | MPU9250_buff[5]) - ACC_OFFSET_RAW.Z;
	//陀螺仪去零偏AD值 
	MPU9250_GYRO_RAW.X =((((int16_t)MPU9250_buff[8]) << 8) | MPU9250_buff[9]) - GYRO_OFFSET_RAW.X;
	MPU9250_GYRO_RAW.Y =((((int16_t)MPU9250_buff[10]) << 8) | MPU9250_buff[11]) - GYRO_OFFSET_RAW.Y;
	MPU9250_GYRO_RAW.Z =((((int16_t)MPU9250_buff[12]) << 8) | MPU9250_buff[13]) - GYRO_OFFSET_RAW.Z;
	
	if(GET_FLAG(GYRO_OFFSET)) //陀螺仪进行零偏校准
	{
		if(MPU9250_OffSet(MPU9250_GYRO_RAW,&GYRO_OFFSET_RAW,0))
		{
			
			 SENSER_FLAG_RESET(GYRO_OFFSET);
			 PID_WriteFlash(); //保存陀螺仪的零偏数据
       GYRO_Offset_LED();
		   SENSER_FLAG_SET(ACC_OFFSET);//校准加速度
		}
	}
	if(GET_FLAG(ACC_OFFSET)) //加速度计进行零偏校准 
	{
		if(MPU9250_OffSet(MPU9250_ACC_RAW,&ACC_OFFSET_RAW,8196))
		{
			 SENSER_FLAG_RESET(ACC_OFFSET);
			 PID_WriteFlash(); //保存加速度计的零偏数据
       ACC_Offset_LED();
		}
	}
}

说明:**
对变量的说明**
MPU9250_ACC_RAW.X,MPU9250_ACC_RAW.Y,MPU9250_ACC_RAW.Z存储的是加速度去零飘的数据值此时还是原始数据
MPU9250_GYRO_RAW.X,MPU9250_GYRO_RAW.Y,MPU9250_GYRO_RAW.Z存储的是角速度去零飘的数据值此时还是原始数据
ACC_OFFSET_RAW,是加速度的零飘数据
GYRO_OFFSET_RAW,是角速度的零飘数据
MPU9250_buff[14]这个数组储存了加速度,温度和角速度。
GYRO_OFFSET,ACC_OFFSET是加速度和角度的校准标置位,具体作用之后会讲
对子函数的说明
SENSER_FLAG_SET(ACC_OFFSET);将加速度标志位置1
SENSER_FLAG_SET(GYRO_OFFSET);//将角速度标志位置1
GET_FLAG(ACC_OFFSET);判断加速度标志位是否为1
SENSER_FLAG_RESET(GYRO_OFFSET);将角速度标志位置0
SENSER_FLAG_RESET(ACC_OFFSET);将加速度标志位置0
对整个程序的说明
在四轴开机的时候,会执行这两个函数
MPU9250_Read(); //触发读取 ,立即返回
MPU9250_Offset(); //对MPU6050进行处理,减去零偏。如果没有计算零偏就计算零偏
需要先静止的放在地方,程序开始第一遍读取加速度,角速度,然后进入去零飘过程,我们进去MPU9250_Offset()这个函数第一遍零飘数据我们还没有计算,所以前几行目前没有实际意义,然后GYRO_OFFSET这个标志位默认是1,然后进入MPU9250_OffSet(MPU9250_GYRO_RAW,&GYRO_OFFSET_RAW,0)这个函数,此时cnt_a=0,不是200,所以作用只是在tempgx中加了一次我们第一遍读取的数据,然后就返会了,且返回值为0,没有进入函数内部,之后在运行到if(GET_FLAG(ACC_OFFSET)) ,因为ACC_OFFSET默认为1,所以执行MPU9250_OffSet(MPU9250_ACC_RAW,&ACC_OFFSET_RAW,8196)),同理此时cnt_a=0,不是200,所以作用只是在tempgx中加了一次我们第一遍读取的数据,然后就返会了,且返回值为0,没有进入函数内部,就退出了MPU9250_Offset()这个函数。

然后因为等到代码再次运行到
PU9250_Read(); //触发读取 ,立即返回
MPU9250_Offset(); //对MPU6050进行处理,减去零偏
分析方法和之前是一样的,这里不做重复

只有当运行了200次时,此时当进入MPU9250_OffSet(MPU9250_GYRO_RAW,&GYRO_OFFSET_RAW,0)这个函数,此时cnt_a=200,
把零飘数据算了出来放入GYRO_OFFSET_RAW中,然后返回值为1,执行SENSER_FLAG_RESET(GYRO_OFFSET);这个代码就是把角速度标志位清0,这样再运行到
MPU9250_Offset();这个函数时if(GET_FLAG(GYRO_OFFSET))就为0,不再进行角速度校准
同理加速度校准也是一样的
等加速度和角速度都校准结束后,在执行MPU9250_Offset()函数就是把读到的原始数据减去零飘数据。
2转换数据,得到有意义的数据
#define Acc_Gain 0.0001220f //加速度变成G (初始化加速度满量程-+4g LSBa = 24/65535.0)
#define Gyro_Gain 0.0609756f //角速度变成度 (初始化陀螺仪满量程±2000 LSBg = 2
2000/65535.0)
#define Gyro_Gr 0.0010641f //角速度变成弧度(3.1415/180 * LSBg)
#define G 9.80665f // m/s^2
说明 Acc_Gain,Gyro_Gain,Gyro_Gr的大小都和我们初始配置Mpu9250加速度和角速度的分辨率有关
//加速度AD值 转换成 米/平方秒

Acc_filt.X = (float)Acc_filt.X * Acc_Gain * G;
Acc_filt.Y = (float)Acc_filt.Y * Acc_Gain * G;
Acc_filt.Z = (float)Acc_filt.Z * Acc_Gain * G;

说明;这里乘以一个G是因为之前转换过来的还是以g为单位,我们乘以G就医米/平方为单位,下面就是数据手册里的话
4.7 16 位 ADC 三轴加速度信号输出及调理
MPU9250 的三轴加速度也是单独分开测量的。根据每个轴上的电容来测量轴的偏 差度。结构上降低了各种因素造成的测量偏差。当被置于平面上的时候,它会测 出在 X 和 Y 轴上为 0g,Z 轴上为 1g 的重力加速度。加速度计的校准是根据工厂 的标准来设定的,电源电压也许和你用的不一样。每一个传感器都有专门的 ADC 来提供数字性的输出。输出的范围是通过编程可调的±2g, ±4g, ±8g, or ±16g

//陀螺仪AD值 转换成 弧度/秒    
Gyr_rad.X = (float) MPU9250_GYRO_RAW.X * Gyro_Gr;  
Gyr_rad.Y = (float) MPU9250_GYRO_RAW.Y * Gyro_Gr;
Gyr_rad.Z = (float) MPU9250_GYRO_RAW.Z * Gyro_Gr;

此时,Acc_filt,Gyr_rad就存储的是有意义的加速度和角速度。
验证代码在Mpu9250(2)中

  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值