MPU-6000传感器的使用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MPU-6000 传感器的使用
——写代码的Tobem
图1 MPU-6000的电路图
MPU-6000内部集成了3轴陀螺仪和3轴加速度计,每轴输出对应一个16位ADC,内含可编程低通滤波器。

芯片支持IIC(通信频率高达100kHz)和SPI(通信频率高达1MHz)两种通讯方式,电路原理图设计时采用的是SPI通讯方式。

2.1 初始化:
传感器的初始化配置主要涉及量程、采样频率、低通滤波的配置。

根据实际使用,将陀螺仪的量程设置为±500°/S(即分辨率为66.5/(°/S)),加速度计的量程设置为±4g(即分辨率为8192/g),采样频率为125Hz,低通滤波的带宽为5Hz。

/*******************************************************************************
功能:完成对MPU6000的初始化
参数:无
返回值:无
*******************************************************************************/
void MPU6000_Init(void)
{
SPI_MPU_Write( PWR_MGMT_1 , 0x80 ); //复位所有寄存器到默认值
delay_ms(200);
SPI_MPU_Write( PWR_MGMT_1 , 0x00 );
delay_ms(200);
SPI_MPU_Write( SMPLRT_DIV , 0x07 ); //陀螺仪采样频率=陀螺仪输出频率/(1+SMPLRT_DIV) SPI_MPU_Write( MPU_CONFIG , 0x06); //设置DLPF(数字低通滤波器)
SPI_MPU_Write( GYRO_CONFIG , 0x08 ); //陀螺仪量程设置为±500°/S
SPI_MPU_Write( ACCEL_CONFIG , 0x08 ); //加速度计量程为±4g
SPI_MPU_Write( USER_CTRL, 0x10); //使能SPI总线,屏蔽I2C总线
SPI_MPU_Write( PWR_MGMT_2 , 0x00 ); //使活传感器
}
备注:void SPI_MPU_Write(u8 REG_Address,u8 REG_data)为寄存器写入函数,第一个参数REG_Address为要写入的寄存器地址,第二个参数REG_data为要写入寄存器的值。

在MPU6500.h头文件中根据芯片手册对相应寄存器地址进行了宏定义:
#define SMPLRT_DIV0x19//陀螺仪采样率
#define MPU_CONFIG0x1A//低通滤波频率,典型值:0x06(5Hz)
#define GYRO_CONFIG0x1B//陀螺仪自检及测量范围
#define ACCEL_CONFIG0x1C//加速度计配置寄存器
//加速度计测量值
#define ACCEL_XOUT_H0x3B
#define ACCEL_XOUT_L0x3C
#define ACCEL_YOUT_H0x3D
#define ACCEL_YOUT_L0x3E
#define ACCEL_ZOUT_H0x3F
#define ACCEL_ZOUT_L0x40
//陀螺仪测量值
#define GYRO_XOUT_H0x43
#define GYRO_XOUT_L0x44
#define GYRO_YOUT_H0x45
#define GYRO_YOUT_L0x46
#define GYRO_ZOUT_H0x47
#define GYRO_ZOUT_L0x48
#define PWR_MGMT_10x6B//电源管理寄存器1
#define PWR_MGMT_2 0x6C //电源管理寄存器2
初始化配置过程中需要注意的是,在设置PWR_MGMT_1寄存器的DEVICE_RESET位为1进行寄存器的复位时,需要人为手动再次对其进行写0处理,否则可能会出现其不能自动清零,其他寄存器无法完成写操作的奇怪现象。

2.2 求取陀螺仪的静态偏移量:
因为没有定速转台,陀螺仪的标定只是简单地对其静态下的零位偏差进行多次测量求平均值,然后去除该偏移量。

需要注意的是,多次读取陀螺仪数据时,要注意其数据的更新频率,在下一次读取前进行相应的延时等待,避免读取大量重复的数据。

/*******************************************************************************
功能:求取陀螺仪的静态偏移量
参数:无
返回值:无
*******************************************************************************/
u8 OFFSET_OK = false; //校准完成标志
void Calibration_IMU(void)
{
int32_t tempgx=0,tempgy=0,tempgz=0;//陀螺仪偏移累加量
uint16_t cnt_g=200,i; //采样次数
while(!OFFSET_OK)
//如果没完成校准,一直循环 {
tempgx += GetData(GYRO_XOUT_H); //读取并累加X 轴陀螺仪 tempgy += GetData(GYRO_YOUT_H); //读取并累加Y 轴陀螺仪 tempgz += GetData(GYRO_ZOUT_H);
//读取并累加Z 轴陀螺仪
delay_ms(10);
//陀螺仪更新为125Hz ,为防止读取相同数据,需进行延时处理 i++;
if(i==cnt_g)
//累积数据取平均值,用作偏移值
{
GYRO_OFFSET.X=tempgx/cnt_g; GYRO_OFFSET.Y=tempgy/cnt_g; GYRO_OFFSET.Z=tempgz/cnt_g; i = 0;
OFFSET_OK = true;
//陀螺仪校准完成
}
}
write_imu_offset_to_flash();
//将陀螺仪偏移量写Flash 进行存储
}
2.3 加速度计的标定:
根据误差产生机制不同,加速度计的误差主要分为零位偏差、标度系数误差(即比例因子)、安装误差,其中零位误差和标度系数误差是影响其精度的主要因素。

在程序中,为确定加速度计各敏感轴的零偏与比例因子,采用的是六位置标定法,与公司云台产品的加速度计标定方法相同。

其标定过程需要在静态下进行,分别让加速度计的三个敏感轴在正负两个方向上受重力作用,从而在6种位置下分别多次采集x、y、z3个敏感轴的原始数据并求平均值,由于其在静态下进行标定,且敏感轴与重力方向平行,另外两个敏感轴与重力方向垂直,从而理论上与重力平行的敏感轴输出为1g 的重力值,另外两个敏感轴的输出值为零。

因此,该敏感轴的比例因子为:
零位偏差为:
另外两个敏感轴的比例因子和零位偏移量,用同样的方法进行确定。

加速度计在初次使用时才需进行标定,因此并未整合到程序中。

由于涉及到交互,现在由手工进行标定,后续需结合用户界面来完成标定过程。

使用该法,测得手上的加速度计X 、Y 、Z 轴的比例因子分别为0.997、1.005、0.999,零位偏差分别为97,74,-360。

参看:
1、InvenSense -《MPU -60X0 Register Map and Register Descriptions -V4》
2、InvenSense -《MPU -6000 and MPU -6050 Product Specification Revision 3.4》
3、彭孝东,张铁民,李继宇,闫国琦-《三轴数字MEMS 加速度计现场标定方法》
)
/(2*819211g g AD AD S -++=S
AD AD B g g *2/)(11-++=。

相关文档
最新文档