IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于STM32的MPU6050 -> 正文阅读

[嵌入式]基于STM32的MPU6050

热泪盈眶?

最近的考核任务是基于STM32的MPU6050

我移植的是正点的模板

1.第一个出现的问题

#define SDA_IN() ?{GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=0<<9*2;}?? ?//PB9输入模式
#define SDA_OUT() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=1<<9*2;} //PB9输出模式

正点软件模拟IIC用的IO口是B8B9

我的板子是B6B7

而上面两句话不知道怎么改 在网上看了很多资料后初步了解?

复制一下

?

3是二进制的11,~(3<<(92)是将11左移9*2=18位,也就是第18位和第19位为11,其他各位为0,。然后取反,即除了第18位和第19位为0,其他各位都为1。这里可能默认3是int型,占据4个字节32位。然后再与GPIOB组的moder寄存器取与,即将moder寄存器第18位和第19位置0,其他各位保持不变。由moder寄存器各位功能可知,就是讲PB9口设置为复位模式(即输入模式)。而GPIOB->MODER|=0<<92同样的过程,由于0<<92最后的结果是各位都是0,再与moder寄存器取或,即moder寄存器各位都不变,所以最终设置PB9为输入模式。
第二行同样,不过是后面变成了1<<9*2,则运算完成之后,moder寄存器第18位和第19位变为01,即为输出模式。这样通过位运算,最终实现了对PB9口的输入输出模式的设置。
————————————————
版权声明:本文为CSDN博主「只作人间不老仙」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43358213/article/details/88648173?

?所以??变为B6B7则变成

#define SDA_IN() ?{GPIOB->MODER&=~(3<<(7*2));GPIOB->MODER|=0<<7*2;}?? ? ? ?//PB7输入模式
#define SDA_OUT() {GPIOB->MODER&=~(3<<(7*2));GPIOB->MODER|=1<<7*2;} ? ? //PB7输出模式

不得不说? 看完上边博主的话我直接恍然大悟

2,第二个出现的问题?

?? ?MPU_Init();?? ??? ??? ??? ??? ?//初始化MPU6050? ? ? ?? ??
? ?mpu_dmp_init()

第二个是? MPU和DMP的初始化

MPU与单片机的连线 VCC接5V? GND接GND SCL SDA是初始化IIC中的两个IO口

还有一根线 AD0(这里太太太需要注意了)

//如果AD0脚(9脚)接地,IIC地址为0X68(不包含最低位).
//如果接V3.3,则IIC地址为0X69(不包含最低位).
#define MPU_ADDR?? ??? ??? ??? ?0X68

这是正点原子里例程的原话!!!

如果你的AD0接地或者接3.3V时地址没改会出现以下问题

(1)定义全局变量a 使a=MPU_Init();? ? ? ?则debug显示值会为1或非0即MPU初始化失败

我一开始并没有debug? ?MPU_Init();? 的值就导致接下来一直卡在

?? ?while(mpu_dmp_init())//? 检验dmp是否初始化成功
?? ?{
?? ??? ?delay_ms(200);
?? ?}

通过设置全局变量a检测到?mpu_dmp_init() 的值为1 。。。。。。。。。。

网上各种找以为是FIFO没有开启? 也特意在mpu_write_mem中设置延时。。并没用。。

并没有用!于是我发现了? 我的AD0接3.3v 而地址初始设置的是 0X68 (微笑🙂)

AD0接地后MPU初始化成功

(2)mpu_dmp_init()返回值为4

!!!有和我一样设置全局变量的好兄弟们注意!!

?mpu_dmp_init()为4是加载DMP固件库失败 !!!!

大家一定要记得看看前面是否加载过DMP 比如设置a=mpu_dmp_init()来debugDMP是否初始化成功🙂

(3)mpu_dmp_init()返回值为8

返回值为8是自检未通过? ?可以将MPU6050水平放置

水平放置之后我的就为0啦??

------------------------------------------------------------------------

(吃完饭继续调)

3.第三个出现的问题

mpu_dmp_get_data(&pitch,&roll,&yaw)返回值为1

网上有很多mpu_dmp_get_data(&pitch,&roll,&yaw)的解决方案

我真傻真的(哭泣)

但大多都是这么写的

while(mpu_dmp_get_data(&pitch,&roll,&yaw)!=0);//返回值:0,DMP成功解出欧拉角   
        printf("pitch=%f\troll=%f\tyaw=%f\r\n",pitch,roll,yaw);

结合正点原子的代码应该是这样的

? ??? ?while(1)
?? ??? ??? ?{
?? ??? ??? ????while(mpu_dmp_get_data(&pitch,&roll,&yaw)!=0){}
?? ??? ? ? ?}

过程——————在debug中一直查看Go to definition of

mpu_dmp_get_data——dmp_read_fifo——mpu_read_fifo_stream——mpu_read_fifo_stream

?这才发现 fifo_count < length 也就是FIFO溢出

这时候只需要一直重复读取FIFO寄存器

值得一说的是在??MPU_Init(void )? ?即MPU初始化代码中进行了

MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);?? ?//关闭FIFO

但在mpu_dmp_init 即DMP初始化函数中又打开了FIFO

?? ?res=mpu_configure_fifo(INV_XYZ_GYRO | INV_XYZ_ACCEL);//设置FIFO

今天的任务结束啦? 明天再继续!

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-04 13:00:11  更:2021-10-04 13:00:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:43:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码