npu6050初始化代码链接:https://pan.baidu.com/s/1v0-cd5EL4zLfq9L1ZNiJ7g?pwd=xa5r
提取码:xa5r
iic通信在硬件资源不足的情况下,可以用软件iic来代替。
iic通信靠两条线,一条时钟线,输出方波,所以将引脚配置为推挽输出output push pull,这里选用的是pb4(任意一个gpio都可)
另一条数据线,这条线有接收,有发送,配置为开漏输出out open drain,mpu6050是自带上拉电阻的,上拉电阻就不用我们操心了。
配置完成
接下来是软件驱动部分
将这些初始化的.c文件都放入魔法棒到的编译部分,给编译器指个路,在哪里找他
再将这些文件的.h文件包含进去,iic软件部分要修改的地方只有一处,再文件最上方,改一下你定义的引脚就可以,不需要在主函数里面再初始化了,因为刚才cubemx配置的时候,gpio已经被初始化,这段代码的可移植性非常高,值得借鉴。
iic接口初始化完成,接下来就是初始化mpu6050了,调用MPU_int(),唤醒mpu6050
uint8_t MPU_Init(void)
{
uint8_t res;
MPU_IIC_Init();//初始化IIC总线
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); //复位MPU6050
delay_ms(100);
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00); //唤醒MPU6050
MPU_Set_Gyro_Fsr(3); //陀螺仪传感器,±2000dps
MPU_Set_Accel_Fsr(0); //加速度传感器,±2g
MPU_Set_Rate(50); //设置采样率50Hz
MPU_Write_Byte(MPU_INT_EN_REG,0X00); //关闭所有中断
MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //I2C主模式关闭
MPU_Write_Byte(MPU_FIFO_EN_REG,0X00); //关闭FIFO
MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80); //INT引脚低电平有效
res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
if(res==MPU_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
} else return 1;
return 0;
}
接下来是初始化mpu6050内部的数据处理部分即dmp,调用mpu_dmp_init();mpu6050有这个功能我觉得十分的高级,既给单片机减轻了工作量,又方便我们使用,而且mpu6050的精度和可靠性都很高,很多航模用他进行姿态检测。还很便宜,几块钱一片
DMP就是MPU6050内部的运动引擎,全称Digital Motion Processor,直接输出四元数,可以减轻外围微处理器的工作负担且避免了繁琐的滤波和数据融合。
初始化完就可以调用mpu_dmp_get_data(float *pitch,float *roll,float *yaw);来获取处理好的数据了,三个参量pitch是围绕X轴旋转,也叫做俯仰角。 yaw是围绕Y轴旋转,也叫偏航角。 roll是围绕Z轴旋转,也叫翻滚角,注意他们都是浮点数,不要设置为整形int,设置为float
接下来就是显示了,如果你的显示和我一样只能显示字符串,不能显示浮点数,那就用spritf((char*)buf,“%.2f”,pitch)来将pitch转化为保留两位小数的浮点数,放入定义的缓存数组buf,再显示就好了。