TA的每日心情 | 开心 2015-7-7 09:19 |
---|
签到天数: 13 天 连续签到: 1 天 [LV.3]偶尔看看II
|
对于平衡小车,这一篇帖子已经是第四个了,慢慢的也开始讲到了传感器部分,剩余的部分还是尽量做到每周更新一篇。
这一篇就大概的对传感器做一个介绍,以及如何进行控制。当然对于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的原始数据,还需要进行必要的转换,对于转换将在下一篇讲解。待续&hellip;&hellip; |
|