STM32(十六):MPU6050简介

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;
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LightningJie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值