解决方案

MPU6050详解(含源码)

seo靠我 2023-09-23 14:41:16

前言:MPU6050是一款强大的六轴传感器,需要理解MPU6050首先得有IIC的基础,MPU6050 内部整合了 3 轴陀螺仪和 3 轴加速度传感器,并且含有一个第二 IIC 接口,可用于连接外部磁SEO靠我力传感器,内部有硬件算法支持.

1.IO分配(MPU6050模块)

1. SCL 和 SDA 是连接 MCU 的 IIC 接口, MCU 通过这个 IIC 接口来控制 MPU6050,

另外还有一个 IICSEO靠我 接口

2.AUX_CL 和 AUX_DA,这个接口可用来连接外部从设备,比如磁传感

器,这样就可以组成一个九轴传感器。

3.AD0 是从 IIC 接口(接 MCU)的地址控制引脚,该引脚控制 IIC 地址SEO靠我的最低位。如果接 GND,则 MPU6050 的 IIC 地址是: 0X68,如果接 VDD,则是 0X69.

2.MPU6050初始化(PA15 接 AD0 = GND)

注意:PA15默认是JTAG引SEO靠我脚,使用PA15时,需要使用IO的重映射功能。

(1)设置MPU6050的地址(AD0的电平) 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打SEO靠我开辅助功能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Pin = GPSEO靠我IO_Pin_15; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_SEO靠我Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ESEO靠我NABLE);MPU_AD0_CTRL=0; //设置为低电平

注:这里使用PA15是默认是JTAG引脚 ,需要重映射。

(2)完成IIC的初始化 

RCC_APB2PeriphClockCmd(RCC_APSEO靠我B2Periph_GPIOB,ENABLE);//ÏÈʹÄÜÍâÉèIO PORTBʱÖÓ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_1SEO靠我1; // ¶Ë¿ÚÅäÖÃGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //ÍÆÍìÊä³öGPIO_InitStructure.GPIO_SpeSEO靠我ed = GPIO_Speed_50MHz; //IO¿ÚËÙ¶ÈΪ50MHzGPIO_Init(GPIOB, &GPIO_InitStructure); //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GSEO靠我PIO GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11); //PB10,PB11 Êä³ö¸ß

(3)配置MPU6050的设置

MPU_IIC_Init();//初SEO靠我始化IIC总线MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); //复位MPU6050delay_ms(100);MPU_Write_Byte(MPU_PWR_MGMT1SEO靠我_REG,0X00); //唤醒MPU6050 MPU_Set_Gyro_Fsr(3); //陀螺仪传感器,±2000dpsMPU_Set_Accel_Fsr(0); //加速度传感器,±2gMPU_SEO靠我Set_Rate(50); //设置采样率50HzMPU_Write_Byte(MPU_INT_EN_REG,0X00); //关闭所有中断MPU_Write_Byte(MPU_USER_CTRL_RSEO靠我EG,0X00); //I2C主模式关闭MPU_Write_Byte(MPU_FIFO_EN_REG,0X00); //关闭FIFOMPU_Write_Byte(MPU_INTBP_CFG_REG,0SEO靠我X80); //INT引脚低电平有效res=MPU_Read_Byte(MPU_DEVICE_ID_REG);if(res==MPU_ADDR)//器件ID正确{MPU_Write_Byte(MPU_SEO靠我PWR_MGMT1_REG,0X01); //设置CLKSEL,PLL X轴为参考MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00); //加速度与陀螺仪都工作MPU_SetSEO靠我_Rate(50); //设置采样率为50Hz}

注:这里配置MPU6050的操作,都是通过IIC协议,直接对MPU6050的寄存器进行访问.

这里提供一个芯片初始化是否成功的小技巧,通常每个芯片都有自己SEO靠我的芯片ID,通常可以把初始化函数设置为u8类型,通过读取ID是否正确,返回不同类型的值(return 1或0),如:while(mpu_dmp_init())

 3.MPU6050通信协议分析

发送一个字节SEO靠我

(1)MCU发送一个起始信号。

(2)传输从机7位地址+读/写位,等待应答信号

(3)发送寄存器地址,等待应答

(4)发送1个字节数据,等待应答

(5)结束信号

使用IIC写一个字节数据,程序如下:

u8 MPUSEO靠我_Write_Byte(u8 reg,u8 data) { MPU_IIC_Start(); MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写SEO靠我命令 if(MPU_IIC_Wait_Ack()) //等待应答{MPU_IIC_Stop(); return 1; }MPU_IIC_Send_Byte(reg); //写寄存器地址MPU_IIC_SEO靠我Wait_Ack(); //等待应答 MPU_IIC_Send_Byte(data);//发送数据if(MPU_IIC_Wait_Ack()) //等待ACK{MPU_IIC_Stop(); retuSEO靠我rn 1; } MPU_IIC_Stop(); return 0; }

 读取IIC多个字节数据

u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)SEO靠我 { MPU_IIC_Start(); MPU_IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令 if(MPU_IIC_Wait_Ack()) //等待应SEO靠我答{MPU_IIC_Stop(); return 1; }MPU_IIC_Send_Byte(reg); //写寄存器地址MPU_IIC_Wait_Ack(); //等待应答MPU_IIC_StartSEO靠我();MPU_IIC_Send_Byte((addr<<1)|1);//发送器件地址+读命令 MPU_IIC_Wait_Ack(); //等待应答 while(len){if(len==1)*buf=SEO靠我MPU_IIC_Read_Byte(0);//读数据,发送nACK else *buf=MPU_IIC_Read_Byte(1); //读数据,发送ACK len--;buf++; } MPU_IICSEO靠我_Stop(); //产生一个停止条件 return 0; }

代码连接: 

链接:https://pan.baidu.com/s/1SKYUonB0yKy9iG6hjabvGQ?pwd=aSEO靠我81l

提取码:a81l
“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2