FireBLE

FireBLE 是一个面向于打造智能生活的开源平台,以BLE(Bluetooth Low Energy)技术为核心,拥有超低的功耗、不俗的处理能力和广泛的应用场合,专注于更智能、高效率的工作模式,让生活在科技中更安全、方便、快捷。也许您一个不经意的想法与FireBLE擦出的火花,会在这片原野上燎出火焰,甚至燃烧整个世界。

MPU6050 驱动

更新时间:2017-08-08 阅读:3725

前言

MPU-6050 为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时之轴间差的问题。MPU-6050的角速度全格感测范围为±250、±500、±1000与±2000°/sec (dps),可准确追踪快速与慢速动作,并且,用户可程式控制的加速器全格感测范围为±2g、±4g±8g与±16g。产品传输可透过最高至400kHz的IC。

  1. INT – (PIN-12)MPU6050 中断信号线;
  2. SCL – (PIN-23)时钟线,由主设备产生;
  3. SDA – (PIN-24)数据线,双向传输数据;


其中,I2C是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。具体可参考I2C驱动描述

初始化

一般裸驱开发过程为系统初始化-->GPIO配置-->各驱动模块初始化-->主循环实现功能。第一步系统初始化是每一个例程所必须的,初始化的过程也是相同的,所以只需调用系统初始化接口即可。

下面的三个部分都是需要我们根据自己的需求自行实现,在之前我们已经学习了如何配置GPIO,接下来就是各个模块的初始化。

初始化函数

MPU-6050初始化的函数为:

uint8_t MPU_Init(void)
{ 
	uint8_t res;
	IIC_Init();//初始化IIC总线
	MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);	//复位MPU6050
        delay_ms(100);
	MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);	//唤醒MPU6050 
	MPU_Set_Gyro_Fsr(3);			//陀螺仪传感器,±2000dps
	MPU_Set_Accel_Fsr(0);			//加速度传感器,±2g
	MPU_Set_Rate(20);			//设置采样率 20Hz
	MPU_Write_Byte(MPU_INT_EN_REG,0X00);	//关闭所有中断
	MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);	//I2C主模式关闭
	MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);	//关闭FIFO
	MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);	//INT引脚低电平有效
	MPU_Write_Byte(MPU_INT_EN_REG,0X01);	//开启data ready 中断
	res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
	if(res==MPU_ADDR)//验证器件ID 
	{
		MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);	//设置CLKSEL,PLL X轴为参考
		MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);	//加速度和陀螺仪都工作
		MPU_Set_Rate(20);			//设置采样率为20Hz
 	}else return 1;
	return 0;
}

主要动作:

  1. 初始化IIC总线
  2. 复位MPU-6050
  3. 配置加速度和陀螺仪采样精度
  4. 配置采样率
  5. 配置INT 中断引脚
  6. 配置 CLK 参考

初始化示例

MPU_Init();

MPU-6050 加速度计 采集

//得到加速度值(原始值)
//ax,ay,az:加速度x,y,z轴的原始读数(带符号)
//返回值:0,成功
//    其他,失败
uint8_t MPU_Get_Accelerometer(short *ax,short *ay,short *az)
{
	uint8_t buf[6],res;  
	res=MPU_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf);
	if(res==0)
	{
		*ax=((uint16_t)buf[0]<<8)|buf[1];  
		*ay=((uint16_t)buf[2]<<8)|buf[3];  
		*az=((uint16_t)buf[4]<<8)|buf[5];
	} 	
    return res;;
}

MPU-6050 陀螺仪计 采集

//得到陀螺仪(原始值)
//gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号)
//返回值:0,成功
//    其他,失败
uint8_t MPU_Get_Gyroscope(short *gx,short *gy,short *gz)
{
    uint8_t buf[6],res;  
	res=MPU_Read_Len(MPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf);
	if(res==0)
	{
		*gx=((uint16_t)buf[0]<<8)|buf[1];  
		*gy=((uint16_t)buf[2]<<8)|buf[3];  
		*gz=((uint16_t)buf[4]<<8)|buf[5];
	} 	
    return res;;
}

main 函数

/**
 * @brief mpu6050 excample
 */
int main (void)
{
    int16_t buf[6]; 
    SystemInit();
 
    //UART io configurate
    uart0_init();
    //MPU-6050 initialization
    MPU_Init();
    //MPU-6050 INT pin configurate
    mpu6050_int_init();
 
    printf("------Hello MPU6050!!!------\r\n");
 
    while (1) 
    {
       //如果 data raady 中断已产生,采集了新数据
       if(mpu_6050_int_flag == 1)
       {
            mpu_6050_int_flag = 0;
            //读取加速度值
            MPU_Get_Accelerometer(&buf[0],&buf[1],&buf[2]);
            //读取陀螺仪值
            MPU_Get_Gyroscope(&buf[3],&buf[4],&buf[5]);
            //打印采集的值
            printf("ax:%d ay:%d az:%d gx:%d gy:%d gz:%d \r\n",buf[0],buf[1],buf[2],buf[3],buf[4],buf[5]);
       }
    }
}