STM32两轮平衡小车——传感器MPU6050

作者: 芯领神会
上传时间为: 2015-07-10 08:36 AM
2015-07-10
阅读:

 对于平衡小车,这一篇帖子已经是第四个了,慢慢的也开始讲到了传感器部分,剩余的部分还是尽量做到每周更新一篇。

  这一篇就大概的对传感器做一个介绍,以及如何进行控制。当然对于MPU6050的传感器讲解度娘一搜索一大堆都是,以下观点仅代表个人观点,如有雷同,存属正常。

  对于MPU6050这个类传感器主要还是用于制作平衡车,空中鼠标,飞行器以及倒立摆等等必要用到的传感器,当然这一类的传感器也是很多,只不过在国内MPU6050用的稍微多一些!所以在选择是本人也就选择了6050(后面MPU6050都简称为6050)。

  对于6050就类似于USB鼠标,鼠标通过USB数据线将操作信息传送给电脑,而6050是通过IIC协议(上一讲讲解)将数据传送给主控MCU,在学习6050之前最好还是先看一下6050的数据手册,网上也有中文版本的,数据手册里面讲解了传输协议以及对芯片内部寄存器介绍。

  对于MPU6050操作主要用到八个管脚(其它管脚根据数据手册通过电容接地或者电源),当然很多时候都只需要用到4条(VCC、GND、SCL、SDA),对于XCL和XDA是6050作为主机时使用,这个我们放到后面几篇帖子讲解。AD0地址管脚是设置芯片地址使用的,而很多时候我们都会直接接地拉低,让芯片地址为0xD0;INT引脚在平衡车中没有使用,当然有时候也是很有用的,他能够作为数据准备完成的中断线。

  接下来就是对6050进行初始化(使用到的IIC协议请看上一贴),

	MPU6050_setClockSource(MPU6050_CLOCK_PLL_XGYRO); //设置时钟
    MPU6050_setFullScaleGyroRange(MPU6050_GYRO_FS_1000);//陀螺仪最大量程 +-1000度每秒
    MPU6050_setFullScaleAccelRange(MPU6050_ACCEL_FS_2);	//加速度度最大量程 +-2G
    MPU6050_setSleepEnabled(0); //进入工作状态

对于如果有使用INT引脚的就需要进行初始化:

	//配置MPU6050 的中断模式 和中断电平模式
	IICwriteBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_LEVEL_BIT, 0);
	IICwriteBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_OPEN_BIT, 0);
	IICwriteBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_LATCH_INT_EN_BIT, 1);
	IICwriteBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_RD_CLEAR_BIT, 1);
	//开数据转换完成中断
    IICwriteBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DATA_RDY_BIT, 1);
在进行数据读取时使用如下方法:
	if(MPU6050_is_DRY()){
	IICreadBytes(devAddr, MPU6050_RA_ACCEL_XOUT_H, 14, buffer);
    MPU6050_Lastax=(((int16_t)buffer[0]) << 8) | buffer[1];
    MPU6050_Lastay=(((int16_t)buffer[2]) << 8) | buffer[3];
    MPU6050_Lastaz=(((int16_t)buffer[4]) << 8) | buffer[5];
	//跳过温度ADC
    MPU6050_Lastgx=(((int16_t)buffer[8]) << 8) | buffer[9];
    MPU6050_Lastgy=(((int16_t)buffer[10]) << 8) | buffer[11];
    MPU6050_Lastgz=(((int16_t)buffer[12]) << 8) | buffer[13];
	MPU6050_newValues(MPU6050_Lastax,MPU6050_Lastay,MPU6050_Lastaz
		,MPU6050_Lastgx,MPU6050_Lastgy,MPU6050_Lastgz);
	*ax  =MPU6050_FIFO[0][10];
	*ay  =MPU6050_FIFO[1][10];
	*az = MPU6050_FIFO[2][10];
	*gx  =MPU6050_FIFO[3][10]-Gx_offset;
	*gy = MPU6050_FIFO[4][10]-Gy_offset;
	*gz = MPU6050_FIFO[5][10]-Gz_offset;
	} else {
	*ax = MPU6050_FIFO[0][10];//=MPU6050_FIFO[0][10];
	*ay = MPU6050_FIFO[1][10];//=MPU6050_FIFO[1][10];
	*az = MPU6050_FIFO[2][10];//=MPU6050_FIFO[2][10];
	*gx = MPU6050_FIFO[3][10]-Gx_offset;//=MPU6050_FIFO[3][10];
	*gy = MPU6050_FIFO[4][10]-Gy_offset;//=MPU6050_FIFO[4][10];
	*gz = MPU6050_FIFO[5][10]-Gz_offset;//=MPU6050_FIFO[5][10];
	}
数据读取出来过后这只是6050的原始数据,还需要进行必要的转换,对于转换将在下一篇讲解。待续……

  

全部评论 ()
条评论
写评论

创建讨论帖子

登录 后参与评论
系统提示