魔立方 网站建设,wordpress源码系统下载,加强网站网络安全建设方案,网站正在建设中请稍后前言#xff1a;MPU6050是一款强大的六轴传感器#xff0c;需要理解MPU6050首先得有IIC的基础#xff0c;MPU6050 内部整合了 3 轴陀螺仪和 3 轴加速度传感器#xff0c;并且含有一个第二 IIC 接口#xff0c;可用于连接外部磁力传感器#xff0c;内部有硬件算法支持.
1…前言MPU6050是一款强大的六轴传感器需要理解MPU6050首先得有IIC的基础MPU6050 内部整合了 3 轴陀螺仪和 3 轴加速度传感器并且含有一个第二 IIC 接口可用于连接外部磁力传感器内部有硬件算法支持.
1.IO分配(MPU6050模块) 1. SCL 和 SDA 是连接 MCU 的 IIC 接口 MCU 通过这个 IIC 接口来控制 MPU6050 另外还有一个 IIC 接口
2.AUX_CL 和 AUX_DA这个接口可用来连接外部从设备比如磁传感 器这样就可以组成一个九轴传感器。
3.AD0 是从 IIC 接口接 MCU的地址控制引脚该引脚控制 IIC 地址的最低位。如果接 GND则 MPU6050 的 IIC 地址是 0X68如果接 VDD则是 0X69.
2.MPU6050初始化PA15 接 AD0 GND
注意PA15默认是JTAG引脚使用PA15时需要使用IO的重映射功能。
1设置MPU6050的地址(AD0的电平) RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开辅助功能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Pin GPIO_Pin_15; // GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);MPU_AD0_CTRL0; //设置为低电平
注这里使用PA15是默认是JTAG引脚 需要重映射。
2完成IIC的初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//ÏÈʹÄÜÍâÉèIO PORTBʱÖÓ GPIO_InitStructure.GPIO_Pin GPIO_Pin_10|GPIO_Pin_11; // ¶Ë¿ÚÅäÖÃGPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; //ÍÆÍìÊä³öGPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; //IO¿ÚËÙ¶ÈΪ50MHzGPIO_Init(GPIOB, GPIO_InitStructure); //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIO GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11); //PB10,PB11 Êä³ö¸ß
3配置MPU6050的设置 MPU_IIC_Init();//初始化IIC总线MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); //复位MPU6050delay_ms(100);MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00); //唤醒MPU6050 MPU_Set_Gyro_Fsr(3); //陀螺仪传感器,±2000dpsMPU_Set_Accel_Fsr(0); //加速度传感器,±2gMPU_Set_Rate(50); //设置采样率50HzMPU_Write_Byte(MPU_INT_EN_REG,0X00); //关闭所有中断MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //I2C主模式关闭MPU_Write_Byte(MPU_FIFO_EN_REG,0X00); //关闭FIFOMPU_Write_Byte(MPU_INTBP_CFG_REG,0X80); //INT引脚低电平有效resMPU_Read_Byte(MPU_DEVICE_ID_REG);if(resMPU_ADDR)//器件ID正确{MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01); //设置CLKSEL,PLL X轴为参考MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00); //加速度与陀螺仪都工作MPU_Set_Rate(50); //设置采样率为50Hz}
注这里配置MPU6050的操作都是通过IIC协议直接对MPU6050的寄存器进行访问.
这里提供一个芯片初始化是否成功的小技巧通常每个芯片都有自己的芯片ID通常可以把初始化函数设置为u8类型通过读取ID是否正确返回不同类型的值return 1或0如while(mpu_dmp_init()) 3.MPU6050通信协议分析
发送一个字节
1MCU发送一个起始信号。
2传输从机7位地址读/写位等待应答信号
3发送寄存器地址等待应答
4发送1个字节数据等待应答
5结束信号
使用IIC写一个字节数据程序如下
u8 MPU_Write_Byte(u8 reg,u8 data)
{ MPU_IIC_Start(); MPU_IIC_Send_Byte((MPU_ADDR1)|0);//发送器件地址写命令 if(MPU_IIC_Wait_Ack()) //等待应答{MPU_IIC_Stop(); return 1; }MPU_IIC_Send_Byte(reg); //写寄存器地址MPU_IIC_Wait_Ack(); //等待应答 MPU_IIC_Send_Byte(data);//发送数据if(MPU_IIC_Wait_Ack()) //等待ACK{MPU_IIC_Stop(); return 1; } MPU_IIC_Stop(); return 0;
} 读取IIC多个字节数据
u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{ MPU_IIC_Start(); MPU_IIC_Send_Byte((addr1)|0);//发送器件地址写命令 if(MPU_IIC_Wait_Ack()) //等待应答{MPU_IIC_Stop(); return 1; }MPU_IIC_Send_Byte(reg); //写寄存器地址MPU_IIC_Wait_Ack(); //等待应答MPU_IIC_Start();MPU_IIC_Send_Byte((addr1)|1);//发送器件地址读命令 MPU_IIC_Wait_Ack(); //等待应答 while(len){if(len1)*bufMPU_IIC_Read_Byte(0);//读数据,发送nACK else *bufMPU_IIC_Read_Byte(1); //读数据,发送ACK len--;buf; } MPU_IIC_Stop(); //产生一个停止条件 return 0;
} 代码连接 链接https://pan.baidu.com/s/1SKYUonB0yKy9iG6hjabvGQ?pwda81l 提取码a81l