MPU6050
MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景。
3轴加速度计(Accelerometer):测量X、Y、Z轴的加速度
3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度
16位ADC采集传感器的模拟信号,量化范围:-32768~32767(2^16 :0~65535)
加速度计满量程选择:±2、±4、±8、±16(g)重力加速度
陀螺仪满量程选择: ±250、±500、±1000、±2000(°/sec)度每秒
可配置的数字低通滤波器
可配置的时钟源
可配置的采样分频
I2C从机地址:1101000(AD0=0)
1101001(AD0=1)
硬件电路:
左上角是一个LDO低压差线性稳压器。
MPU6050框图:
左侧自测单元,测试芯片好坏。启动测试,芯片内部会模拟一个外力施加在传感器上,这个外力导致传感器数据会比平时大一些。先使能自测,读取数据,再失能自测,读取数据。两个数据一相减,得到的数据数据叫自测响应。芯片响应符合范围区间,就说明合格。
软件I2C读取MPU6050
软件的好处可以任意选择两个GPIO口进行通信
开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变 。可以读IO输入电平变化,实现IO双向功能。
开始条件:
void MyI2C_Start(void)
{
MyI2C_W_SDA(1);
MyI2C_W_SCL(1);
MyI2C_W_SDA(0);
MyI2C_W_SCL(0);
}
释放SDA的要放在释放SCL的前面。
如果起始条件之前SCL和SDA已经是高电平了,那先释放哪一个都是一样的效果。
但是Start还要兼容指定地址读的重复起始条件Sr,Sr最开始SCL是低电平,SDA电平不敢确定,所以保险起见,趁SCL是低电平先确保释放SDA,再释放SCL。这时候SDA和SCL都是高电平,然后再拉低SDA、拉低SCL。这样这个Start就可以兼容起始条件和重复起始条件了。
终止条件:
void MyI2C_Stop(void)
{
MyI2C_W_SDA(0);
MyI2C_W_SCL(1);
MyI2C_W_SDA(1);
}
如果结束条件之前,SCL和SDA都已经是低电平了,那就先释放SCL,再释放SDA就可以了。但是SDA并不一定是低电平。为了确保之后释放SDA能产生上升沿,我们要在时序单元开始时候,先拉低SDA,人后再释放SCL,释放SDA。
发送一个字节
void MyI2C_SendByte(uint8_t Byte)
{
uint8_t i;
for (i=0;i<8;i++)
{
if((Byte&(0x80>>i))==0)
{
MyI2C_W_SDA(0);
}
else
{
MyI2C_W_SDA(1);
}
MyI2C_W_SCL(1);//从机立刻读比特
MyI2C_W_SCL(0);
}
}
接收一个字节
uint8_t MyI2C_ReceiveByte(void)
{
uint8_t Byte=0x00;
uint8_t i;
MyI2C_W_SDA(1);//主机释放SDA
for(i=0;i<8;i++)
{
MyI2C_W_SCL(1);//主机释放SCL,SCL高电平,主机就能读取数据了
if (MyI2C_R_SDA()==1)
{
Byte|=(0x80>>i);
}
MyI2C_W_SCL(0);
}
return Byte;
}
发送应答
void MyI2C_SendAck(uint8_t AckBit)
{
MyI2C_W_SDA(AckBit);
MyI2C_W_SCL(1);//从机立刻读比特
MyI2C_W_SCL(0);
}
接收应答
uint8_t MyI2C_ReceiveAck(void)
{
uint8_t AckBit;
MyI2C_W_SDA(1);//主机释放SDA
MyI2C_W_SCL(1);//主机释放SCL,SCL高电平,主机就能读取数据了
AckBit=MyI2C_R_SDA();
MyI2C_W_SCL(0);
return AckBit;
}