stm32正点原子子GPS程序.有人能给解释一样么,没有看懂

21ic官方微信-->
后使用快捷导航没有帐号?
大家怎么看正点原子的代码?
&&已结帖(5)
主题帖子积分
高级技术员, 积分 901, 距离下一级还需 99 积分
高级技术员, 积分 901, 距离下一级还需 99 积分
主题帖子积分
专家等级:结帖率:38%
主题帖子积分
高级技术员, 积分 901, 距离下一级还需 99 积分
高级技术员, 积分 901, 距离下一级还需 99 积分
没有意义的东西,给大学生玩玩,对实际项目没有任何意义,就像之前 郭天祥 老师 讲的C51代码,一个按键,叫你在那while()死等松手。就像你想做一个MP3播放方案,如果开发板的方案,淘汰800年,产品跟学习不一样,性价比。但他们都值得 尊敬,为电工的基础学习提供了不错的资源。
主题帖子积分
高级技术员, 积分 901, 距离下一级还需 99 积分
高级技术员, 积分 901, 距离下一级还需 99 积分
主题帖子积分
专家等级:结帖率:38%
主题帖子积分
高级技术员, 积分 901, 距离下一级还需 99 积分
高级技术员, 积分 901, 距离下一级还需 99 积分
真真好的东西,国内哪家做开发板的都没有开源,我们在每一本书,每一套开发板上都件有 串口、RS485等一些通信,就连一个串口通信,没有一个做开发板的把它解析说好了,相信他们在项目中肯定不是例程那么用的。
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
看来兄弟恨我不浅啊。。。
我们也有库函数版本例程,兄台是否有看到?
正点原子做的是业界良心,从寄存器入手可以加深基础,如果你到了系统级别就知道寄存器和汇编是多么的重要
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
我们代码有寄存器库函数两个版本。
所以,看我们的代码,请看全面了再做定论。
支持正点原子,正点原子准备推出EFM32不,我们公司一直在用的M3单片机
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
不喜欢寄存器方式,可读性差,还是喜欢库函数方式
记得有一次我在项目里面加看门狗,但是一直不起作用,最后我们经理来用jink调试运行,然后查看寄存器的状态,几分钟就搞定,没有写过大型代码的人是不懂得在线调试过程中查看寄存器的重要性的,如果不看寄存器有时候就是调到死也调补出结果
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
1.原子的资料是不错的,我现就是直接操作寄存器的,用的是STM32F030K6,MDK版本是5.11a.建工程方法没用到原 ...
我教你怎么用寄存器最快,拿到原子的库函数版本,比如设置GPIO口的那几个函数,你一层一层把寄存器往里面剥,就能看到寄存器怎么设置,快速方便,要能直接看懂,指针,结构体等至少要看得懂吧
主题帖子积分
初级技术员, 积分 92, 距离下一级还需 8 积分
初级技术员, 积分 92, 距离下一级还需 8 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 92, 距离下一级还需 8 积分
初级技术员, 积分 92, 距离下一级还需 8 积分
原子的方式好,提供了寄存器版本与库的版本,让喜欢用寄存器的或库的可以自由选择;
先不论哪样好坏,像你们,让人选择的机会都没有,独断,从这点来说,还用评论吗?
主题帖子积分
中级技术员, 积分 105, 距离下一级还需 195 积分
中级技术员, 积分 105, 距离下一级还需 195 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
中级技术员, 积分 105, 距离下一级还需 195 积分
中级技术员, 积分 105, 距离下一级还需 195 积分
木秀于林,风必摧之
主题帖子积分
中级工程师, 积分 3198, 距离下一级还需 1802 积分
中级工程师, 积分 3198, 距离下一级还需 1802 积分
主题帖子积分
专家等级:结帖率:1%打赏:0.00受赏:0.10
主题帖子积分
中级工程师, 积分 3198, 距离下一级还需 1802 积分
中级工程师, 积分 3198, 距离下一级还需 1802 积分
正点原子做的是业界良心,从寄存器入手可以加深基础,如果你到了系统级别就知道寄存器和汇编是多么的重要 ...
正点原子-专业的STM32开发平台供应商。
主题帖子积分
初级工程师, 积分 2053, 距离下一级还需 947 积分
初级工程师, 积分 2053, 距离下一级还需 947 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级工程师, 积分 2053, 距离下一级还需 947 积分
初级工程师, 积分 2053, 距离下一级还需 947 积分
没有意义的东西,给大学生玩玩,对实际项目没有任何意义,就像之前 郭天祥 老师 讲的C51代码,一个按键,叫 ...
赞同,两位再加上周立功一起共三位,出品的东西实际上在企业都没什么用,在项目上不可能用,哄哄大学生就算了,就是做做入门、科普的意义
51的寄存器就那么几个,后来的处理器随便一个外设的寄存器都N个,越是高级的处理器越是如此,从企业的角度出发,是希望尽快把产品推向市场,没空等你在那里一个一个搞寄存器,基本上都是直接使用板支持包搞定。而且很多刚毕业的大学生都高不明白:我对你操作寄存器不感兴趣,我对你程序能解决的问题才感兴趣。不要告诉我你能用寄存器把串口收发写的如何如何的NB,我感兴趣的只是你如何处理接受回来的数据。
主题帖子积分
初级工程师, 积分 2053, 距离下一级还需 947 积分
初级工程师, 积分 2053, 距离下一级还需 947 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级工程师, 积分 2053, 距离下一级还需 947 积分
初级工程师, 积分 2053, 距离下一级还需 947 积分
不需要你去写寄存器,但是你要看得懂,了解寄存器,出问题时可以通过看寄存器的值和RM资料解决问题
国内的大学培养的大学生是没有区分清楚的,实际上大学生要么是工程型的,要么是学术型。对于现在国内的经济结构来说,工程型是企业最需要的,也是量比较大的,学术型的一般是高校、研究所或者华为之类的大型企业才需要。而作为工程型大学生,最重要的就是能高速高效把产品实现
主题帖子积分
中级技术员, 积分 195, 距离下一级还需 105 积分
中级技术员, 积分 195, 距离下一级还需 105 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 195, 距离下一级还需 105 积分
中级技术员, 积分 195, 距离下一级还需 105 积分
本人顶原子,比其它好多了,F0的库不好用,资料也少,如果原子能出资料就好了
主题帖子积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
根据实需求了,我都是混用,能用库的就用库,库不能解决的就用寄存器。当你的代码量达到几万行的时候,如果还是满篇的寄存器,看代码的人要奔溃掉的
主题帖子积分
初级技术员, 积分 63, 距离下一级还需 37 积分
初级技术员, 积分 63, 距离下一级还需 37 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 63, 距离下一级还需 37 积分
初级技术员, 积分 63, 距离下一级还需 37 积分
主题帖子积分
初级技术员, 积分 63, 距离下一级还需 37 积分
初级技术员, 积分 63, 距离下一级还需 37 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 63, 距离下一级还需 37 积分
初级技术员, 积分 63, 距离下一级还需 37 积分
主题帖子积分
助理工程师, 积分 1315, 距离下一级还需 685 积分
助理工程师, 积分 1315, 距离下一级还需 685 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:3.00
主题帖子积分
助理工程师, 积分 1315, 距离下一级还需 685 积分
助理工程师, 积分 1315, 距离下一级还需 685 积分
这个帖子,又出来了。我们2009年用NXP的ARM7-lpc2103 lpc2478 全部是寄存器操作。后来采用LPC1768,发现移植出问题了。后来用STM32发现库的出现,彻底改变了移植的难度。从此与LPC分道扬镳。
主题帖子积分
初级工程师, 积分 2162, 距离下一级还需 838 积分
初级工程师, 积分 2162, 距离下一级还需 838 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级工程师, 积分 2162, 距离下一级还需 838 积分
初级工程师, 积分 2162, 距离下一级还需 838 积分
主题帖子积分
初级技术员, 积分 66, 距离下一级还需 34 积分
初级技术员, 积分 66, 距离下一级还需 34 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 66, 距离下一级还需 34 积分
初级技术员, 积分 66, 距离下一级还需 34 积分
原子兄有库函数版本的,楼主不知道?还有就是编程不看寄存器怎么可能?相比野火,红牛的程序,原子哥的程序杠杠的,还有开发指南,对于新手而言,受益匪浅啊
主题帖子积分
中级技术员, 积分 195, 距离下一级还需 105 积分
中级技术员, 积分 195, 距离下一级还需 105 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 195, 距离下一级还需 105 积分
中级技术员, 积分 195, 距离下一级还需 105 积分
原子的不错,全面,顶起
欢快之小溪
发帖类勋章
技术奇才奖章
人才类勋章
时间类勋章
社区建设奖章
等级类勋章
技术高手奖章
人才类勋章查看: 2189|回复: 10
正点原子GPS程序。有人能给解释一样么,没有看懂,谢谢
主题帖子精华
新手上路, 积分 43, 距离下一级还需 7 积分
在线时间0 小时
由于本人对结构体不太了解,正在看这方面知识,有几个地方没有看懂,希望有人能给讲一讲,谢谢!!!
1、__packed typedef struct &
//卫星编号
u8 //卫星仰角
u16 //卫星方位角
这样定义了结构体,放在GPS.H里,如果别的.C文件#include "gps.h" ,这样的话结构体的变量算是全局变量吗?
2、nmea_msg &
在mian.c的开头有上面这句话,这句话的作用是什么?
3、//分析GPGSV信息
//gpsx:nmea信息结构体
//buf:接收到的GPS数据缓冲区首地址
void NMEA_GPGSV_Analysis(nmea_msg *gpsx,u8 *buf)
u8 *p,*p1,
u8 len,i,j,slx=0;
p1=(u8*)strstr((const char *)p,"$GPGSV");
len=p1[7]-'0';
//得到GPGSV的条数
posx=NMEA_Comma_Pos(p1,3);
//得到可见卫星总数
if(posx!=0XFF)gpsx-&svnum=NMEA_Str2num(p1+posx,&dx);
for(i=0;i&i++)
p1=(u8*)strstr((const char *)p,"$GPGSV"); &
for(j=0;j&4;j++)
posx=NMEA_Comma_Pos(p1,4+j*4);
if(posx!=0XFF)gpsx-&slmsg[slx].num=NMEA_Str2num(p1+posx,&dx); //得到卫星编号
posx=NMEA_Comma_Pos(p1,5+j*4);
if(posx!=0XFF)gpsx-&slmsg[slx].eledeg=NMEA_Str2num(p1+posx,&dx);//得到卫星仰角&
posx=NMEA_Comma_Pos(p1,6+j*4);
if(posx!=0XFF)gpsx-&slmsg[slx].azideg=NMEA_Str2num(p1+posx,&dx);//得到卫星方位角
posx=NMEA_Comma_Pos(p1,7+j*4);
if(posx!=0XFF)gpsx-&slmsg[slx].sn=NMEA_Str2num(p1+posx,&dx); //得到卫星信噪比
p=p1+1;//切换到下一个GPGSV信息
为什么要这样写函数,u8 *buf &是指向收到数据的首地址,nmea_msg *gpsx &是什么作用,怎么通过它就指向了nmea_msg中的的结构体变量,
4、void GPS_Analysis(nmea_msg *gpsx,u8 *buf)
NMEA_GPGSV_Analysis(gpsx,buf); //GPGSV解析
NMEA_GPGGA_Analysis(gpsx,buf); //GPGGA解析
NMEA_GPGSA_Analysis(gpsx,buf); //GPGSA解析
NMEA_GPRMC_Analysis(gpsx,buf); //GPRMC解析
NMEA_GPVTG_Analysis(gpsx,buf); //GPVTG解析
如何调用这个函数,没有看懂主函数中调用的方法GPS_Analysis(&gpsx,(u8*)USART1_TX_BUF);//分析字符串
总结:也许叙述的有点混乱,我的总体问题就是,如何实现调用GPS.c中的函数,分析出GPS的参数。
可能问的问题比较弱智,但是我真的没有看明白,谢谢大神解答!!!
1,这是个结构体类型定义,不是结构体。
2,定义结构体变量:gpsx
3,这是两个参数。
4,给合法参数,就可以调用该函数。
总结:你C语言不熟,好好练习。
主题帖子精华
在线时间307 小时
1,这是个结构体类型定义,不是结构体。
2,定义结构体变量:gpsx
3,这是两个参数。
4,给合法参数,就可以调用该函数。
总结:你C语言不熟,好好练习。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
在线时间65 小时
前面3个都是c语言问题,结构体类型定义,结构体变量定义,结构体传参
最后一个是在main里循环调用,功能就是从一串串口数据里取出有用数据,可以不去关心具体做了什么,直接用
博观而约取,厚积而薄发。
主题帖子精华
新手上路, 积分 43, 距离下一级还需 7 积分
在线时间0 小时
回复【3楼】正点原子:
---------------------------------谢谢
主题帖子精华
新手上路, 积分 43, 距离下一级还需 7 积分
在线时间0 小时
回复【2楼】:
---------------------------------
谢谢
主题帖子精华
新手上路, 积分 43, 距离下一级还需 7 积分
在线时间0 小时
回复【3楼】正点原子:
---------------------------------
1、为什么pps引脚有时候不能正常输出方波
主题帖子精华
在线时间307 小时
回复【6楼】易州许:
---------------------------------
没定位就不能输出
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
新手上路, 积分 43, 距离下一级还需 7 积分
在线时间0 小时
回复【7楼】正点原子:
---------------------------------
但是日期等其他信息都正常输出
主题帖子精华
在线时间307 小时
回复【8楼】易州许:
---------------------------------
日期输出,不一定定位了。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
初级会员, 积分 99, 距离下一级还需 101 积分
在线时间0 小时
回复【9楼】正点原子:
---------------------------------
原子哥,你好。我引用你的程序做实验。怎么gpsx-&svnum一直是12,gpsx-&slmsg里面的卫星编号好多重复的,只有4&5个编号不一样。而gpsx.posslnum有9个以上。这是为什么?
一分耕耘一分收获
主题帖子精华
初级会员, 积分 99, 距离下一级还需 101 积分
在线时间0 小时
len=p1[7]-'0'; //得到GPGSV的条数
posx=NMEA_Comma_Pos(p1,3);&//得到可见卫星总数
if(posx!=0XFF)gpsx-&svnum=NMEA_Str2num(p1+posx,&dx);
for(i=0;i&i++)
{ &
p1=(u8*)strstr((const&char&*)p,"$GPGSV");&&
for(j=0;j&4;j++)
{ &
posx=NMEA_Comma_Pos(p1,4+j*4);
if(posx!=0XFF)gpsx-&slmsg[slx].num=NMEA_Str2num(p1+posx,&dx); //得到卫星编号
else&&
posx=NMEA_Comma_Pos(p1,5+j*4);
if(posx!=0XFF)gpsx-&slmsg[slx].eledeg=NMEA_Str2num(p1+posx,&dx);//得到卫星仰角&
else&
posx=NMEA_Comma_Pos(p1,6+j*4);
if(posx!=0XFF)gpsx-&slmsg[slx].azideg=NMEA_Str2num(p1+posx,&dx);//得到卫星方位角
else&&
posx=NMEA_Comma_Pos(p1,7+j*4);
if(posx!=0XFF)gpsx-&slmsg[slx].sn=NMEA_Str2num(p1+posx,&dx); //得到卫星信噪比
else&
slx++; &&
}&&&
& p=p1+1;//切换到下一个GPGSV信息
}&&&
}
这个GPGSV是3条,但svnum不是12&&或者是10的话。按这程序来读,那也会照样读到12组slmsg数据,是不?
一分耕耘一分收获
Powered by查看: 24609|回复: 87
【正点原子探索者STM32F407开发板例程连载+教学】第37章 MPU6050六轴传感器实验
主题帖子精华
在线时间32 小时
第三十七章 MPU6050六轴传感器实验
&1.硬件平台:正点原子探索者STM32F407开发板&&2.软件平台:MDK5.1&&3.固件库版本:V1.4.0&
本章,我们介绍当下最流行的一款六轴(三轴加速度+三轴角速度(陀螺仪))传感器:MPU6050,该传感器广泛用于四轴、平衡车和空中鼠标等设计,具有非常广泛的应用范围。ALIENTEK探索者STM32F4开发板自带了MPU6050传感器。本章我们将使用STM32F4来驱动MPU6050,读取其原始数据,并利用其自带的DMP实现姿态解算,结合匿名四轴上位机软件和LCD显示,教大家如何使用这款功能强大的六轴传感器。本章分为如下几个部分:
37.1 MPU6050简介
37.2 硬件设计
37.3 软件设计
37.4 下载验证
MPU6050简介
本节,我们将分2个部分介绍:1,MPU6050基础介绍。2,DMP使用简介。
37.1.1 MPU6050基础介绍
MPU6050是InvenSense公司推出的全球首款整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时之轴间差的问题,减少了安装空间。
MPU6050内部整合了3轴陀螺仪和3轴加速度传感器,并且含有一个第二IIC接口,可用于连接外部磁力传感器,并利用自带的数字运动处理器(DMP: Digital Motion Processor)硬件加速引擎,通过主IIC接口,向应用端输出完整的9轴融合演算数据。有了DMP,我们可以使用InvenSense公司提供的运动处理资料库,非常方便的实现姿态解算,降低了运动处理运算对操作系统的负荷,同时大大降低了开发难度。
MPU6050的特点包括:
①&&&&&& 以数字形式输出6轴或9轴(需外接磁传感器)的旋转矩阵、四元数(quaternion)、欧拉角格式(Euler Angle forma)的融合演算数据(需DMP支持)
②&&&&&& 具有131 LSBs/°/sec 敏感度与全格感测范围为±250、±500、±1000与±2000°/sec 的3轴角速度感测器(陀螺仪)
③&&&&&& 集成可程序控制,范围为±2g、±4g、±8g和±16g的3轴加速度传感器
④&&&&&& 移除加速器与陀螺仪轴间敏感度,降低设定给予的影响与感测器的飘移
⑤&&&&&& 自带数字运动处理(DMP: Digital Motion Processing)引擎可减少MCU复杂的融合演算数据、感测器同步化、姿势感应等的负荷
⑥&&&&&& 内建运作时间偏差与磁力感测器校正演算技术,免除了客户须另外进行校正的需求
⑦&&&&&& 自带一个数字温度传感器
⑧&&&&&& 带数字输入同步引脚(Sync pin)支持视频电子影相稳定技术与GPS
⑨&&&&&& 可程序控制的中断(interrupt),支持姿势识别、摇摄、画面放大缩小、滚动、快速下降中断、high-G中断、零动作感应、触击感应、摇动感应功能
⑩&&&&&& VDD供电电压为2.5V±5%、3.0V±5%、3.3V±5%;VLOGIC可低至1.8V± 5%
?&&&&&& 陀螺仪工作电流:5mA,陀螺仪待机电流:5uA;加速器工作电流:500uA,加速器省电模式电流:40uA@10Hz
?&&&&&& 自带1024字节FIFO,有助于降低系统功耗
?&&&&&& 高达400Khz的IIC通信接口
?&&&&&& 超小封装尺寸:4x4x0.9mm(QFN)
MPU6050传感器的检测轴如图37.1.1.1所示:
5f78dc9cc6c_670.jpg (0 Bytes, 下载次数: 29)
22:54 上传
图37.1.1.1 MPU6050检测轴及其方向
MPU6050的内部框图如图37.1.1.2所示:
4f5d07df938b62c251f36b_528.jpg (0 Bytes, 下载次数: 25)
22:54 上传
图37.1.1.2 MPU6050框图
&&&&&& 其中,SCL和SDA是连接MCU的IIC接口,MCU通过这个IIC接口来控制MPU6050,另外还有一个IIC接口:AUX_CL和AUX_DA,这个接口可用来连接外部从设备,比如磁传感器,这样就可以组成一个九轴传感器。VLOGIC是IO口电压,该引脚最低可以到1.8V,我们一般直接接VDD即可。AD0是从IIC接口(接MCU)的地址控制引脚,该引脚控制IIC地址的最低位。如果接GND,则MPU6050的IIC地址是:0X68,如果接VDD,则是0X69,注意:这里的地址是不包含数据传输的最低位的(最低位用来表示读写)!!
&&&&&& 在探索者STM32F4开发板上,AD0是接GND的,所以MPU6050的IIC地址是0X68(不含最低位),IIC通信的时序我们在之前已经介绍过(第二十九章,IIC实验),这里就不再细说了。
&&&&&& 接下来,我们介绍一下利用STM32F4读取MPU6050的加速度和角度传感器数据(非中断方式),需要哪些初始化步骤:
1)初始化IIC接口
MPU6050采用IIC与STM32F4通信,所以我们需要先初始化与MPU6050连接的SDA和SCL数据线。这个在前面的IIC实验章节已经介绍过了,这里MPU6050与24C02共用一个IIC,所以初始化IIC完全一模一样。
2)复位MPU6050
&&&&&& 这一步让MPU6050内部所有寄存器恢复默认值,通过对电源管理寄存器1(0X6B)的bit7写1实现。
复位后,电源管理寄存器1恢复默认值(0X40),然后必须设置该寄存器为0X00,以唤醒MPU6050,进入正常工作状态。
3)设置角速度传感器(陀螺仪)和加速度传感器的满量程范围
&&&&&& 这一步,我们设置两个传感器的满量程范围(FSR),分别通过陀螺仪配置寄存器(0X1B)和加速度传感器配置寄存器(0X1C)设置。我们一般设置陀螺仪的满量程范围为±2000dps,加速度传感器的满量程范围为±2g。
4)设置其他参数
&&&&&& 这里,我们还需要配置的参数有:关闭中断、关闭AUX IIC接口、禁止FIFO、设置陀螺仪采样率和设置数字低通滤波器(DLPF)等。本章我们不用中断方式读取数据,所以关闭中断,然后也没用到AUX IIC接口外接其他传感器,所以也关闭这个接口。分别通过中断使能寄存器(0X38)和用户控制寄存器(0X6A)控制。MPU6050可以使用FIFO存储传感器数据,不过本章我们没有用到,所以关闭所有FIFO通道,这个通过FIFO使能寄存器(0X23)控制,默认都是0(即禁止FIFO),所以用默认值就可以了。陀螺仪采样率通过采样率分频寄存器(0X19)控制,这个采样率我们一般设置为50即可。数字低通滤波器(DLPF)则通过配置寄存器(0X1A)设置,一般设置DLPF为带宽的1/2即可。
5)配置系统时钟源并使能角速度传感器和加速度传感器
&&&&&& 系统时钟源同样是通过电源管理寄存器1(0X1B)来设置,该寄存器的最低三位用于设置系统时钟源选择,默认值是0(内部8M RC震荡),不过我们一般设置为1,选择x轴陀螺PLL作为时钟源,以获得更高精度的时钟。同时,使能角速度传感器和加速度传感器,这两个操作通过电源管理寄存器2(0X6C)来设置,设置对应位为0即可开启。
&&&&&& 至此,MPU6050的初始化就完成了,可以正常工作了(其他未设置的寄存器全部采用默认值即可),接下来,我们就可以读取相关寄存器,得到加速度传感器、角速度传感器和温度传感器的数据了。不过,我们先简单介绍几个重要的寄存器。&&&&&&
&&&&&& 首先,我们介绍电源管理寄存器1,该寄存器地址为0X6B,各位描述如图37.1.1.3所示:
f9ffe2ba1db525b7d967f34ffde4b986_673.jpg (0 Bytes, 下载次数: 18)
22:54 上传
图37.1.1.3 电源管理寄存器1各位描述
&&&&&& 其中,DEVICE_RESET位用来控制复位,设置为1,复位MPU6050,复位结束后,MPU硬件自动清零该位。SLEEEP位用于控制MPU6050的工作模式,复位后,该位为1,即进入了睡眠模式(低功耗),所以我们要清零该位,以进入正常工作模式。TEMP_DIS用于设置是否使能温度传感器,设置为0,则使能。最后CLKSEL[2:0]用于选择系统时钟源,选择关系如表37.1.1.1所示:
CLKSEL[2:0]
内部8M RC晶振
PLL,使用X轴陀螺作为参考
PLL,使用Y轴陀螺作为参考
PLL,使用Z轴陀螺作为参考
PLL,使用外部32.768Khz作为参考
PLL,使用外部19.2Mhz作为参考
关闭时钟,保持时序产生电路复位状态
图37.1.1.1 CLKSEL选择列表
&&&&&& 默认是使用内部8M RC晶振的,精度不高,所以我们一般选择X/Y/Z轴陀螺作为参考的PLL作为时钟源,一般设置CLKSEL=001即可。
&&&&&& 接着,我们看陀螺仪配置寄存器,该寄存器地址为:0X1B,各位描述如图37.1.4所示:
939f73bd388a61afbcda360_727.jpg (0 Bytes, 下载次数: 20)
22:54 上传
图37.1.1.4 陀螺仪配置寄存器各位描述
&&&&&& 该寄存器我们只关心FS_SEL[1:0]这两个位,用于设置陀螺仪的满量程范围:0,±250°/S;1,±500°/S;2,±1000°/S;3,±2000°/S;我们一般设置为3,即±2000°/S,因为陀螺仪的ADC为16位分辨率,所以得到灵敏度为:=16.4LSB/(°/S)。
&&&&&& 接下来,我们看加速度传感器配置寄存器,寄存器地址为:0X1C,各位描述如图37.1.1.5所示:
de2ec1da8a078b.jpg (0 Bytes, 下载次数: 21)
22:54 上传
图37.1.1.5 加速度传感器配置寄存器各位描述
&&&&&& 该寄存器我们只关心AFS_SEL[1:0]这两个位,用于设置加速度传感器的满量程范围:0,±2g;1,±4g;2,±8g;3,±16g;我们一般设置为0,即±2g,因为加速度传感器的ADC也是16位,所以得到灵敏度为:84LSB/g。
&&&&&& 接下来,我看看FIFO使能寄存器,寄存器地址为:0X1C,各位描述如图37.1.1.6所示:
0fb1f00f67630aea67b109_736.jpg (0 Bytes, 下载次数: 18)
22:54 上传
图37.1.1.6 FIFO使能寄存器各位描述
&&&&&& 该寄存器用于控制FIFO使能,在简单读取传感器数据的时候,可以不用FIFO,设置对应位为0即可禁止FIFO,设置为1,则使能FIFO。注意加速度传感器的3个轴,全由1个位(ACCEL_FIFO_EN)控制,只要该位置1,则加速度传感器的三个通道都开启FIFO了。
&&&&&& 接下来,我们看陀螺仪采样率分频寄存器,寄存器地址为:0X19,各位描述如图37.1.1.7所示:
cffb4a7e5f8ad05625eec165d497cf1d_573.jpg (0 Bytes, 下载次数: 23)
22:54 上传
图37.1.1.7 陀螺仪采样率分频寄存器各位描述
&&&&&& 该寄存器用于设置MPU6050的陀螺仪采样频率,计算公式为:
采样频率 = 陀螺仪输出频率 / (1+SMPLRT_DIV)
&&&&&& 这里陀螺仪的输出频率,是1Khz或者8Khz,与数字低通滤波器(DLPF)的设置有关,当DLPF_CFG=0/7的时候,频率为8Khz,其他情况是1Khz。而且DLPF滤波频率一般设置为采样率的一半。采样率,我们假定设置为50Hz,那么SMPLRT_DIV==19。
&&&&&& 接下来,我们看配置寄存器,寄存器地址为:0X1A,各位描述如图37.1.1.8所示:
1db7e82ee6f90b0.jpg (0 Bytes, 下载次数: 20)
22:54 上传
图37.1.1.8 配置寄存器各位描述
&&&&&& 这里,我们主要关心数字低通滤波器(DLPF)的设置位,即:DLPF_CFG[2:0],加速度计和陀螺仪,都是根据这三个位的配置进行过滤的。DLPF_CFG不同配置对应的过滤情况如表37.1. 1. 2所示:
DLPF_CFG[2:0]
加速度传感器
角速度传感器
(陀螺仪)
延迟(ms)
延迟(ms)
图37.1.1.2 DLPF_CFG配置表
&&&&&& 这里的加速度传感器,输出速率(Fs)固定是1Khz,而角速度传感器的输出速率(Fs),则根据DLPF_CFG的配置有所不同。一般我们设置角速度传感器的带宽为其采样率的一半,如前面所说的,如果设置采样率为50Hz,那么带宽就应该设置为25Hz,取近似值20Hz,就应该设置DLPF_CFG=100。
&&&&&& 接下来,我们看电源管理寄存器2,寄存器地址为:0X6C,各位描述如图37.1.1.9所示:
8dd3fb711fcef164092de_742.jpg (0 Bytes, 下载次数: 16)
22:54 上传
图37.1.1.9 电源管理寄存器2各位描述
&&&&&& 该寄存器的LP_WAKE_CTRL用于控制低功耗时的唤醒频率,本章用不到。剩下的6位,分别控制加速度和陀螺仪的x/y/z轴是否进入待机模式,这里我们全部都不进入待机模式,所以全部设置为0即可。&
&&&&&& 接下来,我们看看陀螺仪数据输出寄存器,总共有6个寄存器组成,地址为:0X43~0X48,通过读取这6个寄存器,就可以读到陀螺仪x/y/z轴的值,比如x轴的数据,可以通过读取0X43(高8位)和0X44(低8位)寄存器得到,其他轴以此类推。
&&&&&& 同样,加速度传感器数据输出寄存器,也有8个,地址为:0X3B~0X40,通过读取这8个寄存器,就可以读到加速度传感器x/y/z轴的值,比如读x轴的数据,可以通过读取0X3B(高8位)和0X3C(低8位)寄存器得到,其他轴以此类推。
&&&&&& 最后,温度传感器的值,可以通过读取0X41(高8位)和0X42(低8位)寄存器得到,温度换算公式为:
Temperature = 36.53 + regval/340
其中,Temperature为计算得到的温度值,单位为℃,regval为从0X41和0X42读到的温度传感器值。
关于MPU6050的基础介绍,我们就介绍到这。MPU6050的详细资料和相关寄存器介绍,请参考光盘:7,硬件资料àMPU6050资料àMPU-6000 and
MPU-6050 Product Specification.pdf和MPU-6000 and
MPU-6050 Register Map and Descriptions.pdf这两个文档,另外该目录还提供了部分MPU6050的中文资料,供大家参考学习。
37.1.2 DMP使用简介
&&&&&& 经过37.1.1节的介绍,我们可以读出MPU6050的加速度传感器和角速度传感器的原始数据。不过这些原始数据,对想搞四轴之类的初学者来说,用处不大,我们期望得到的是姿态数据,也就是欧拉角:航向角(yaw)、横滚角(roll)和俯仰角(pitch)。有了这三个角,我们就可以得到当前四轴的姿态,这才是我们想要的结果。
要得到欧拉角数据,就得利用我们的原始数据,进行姿态融合解算,这个比较复杂,知识点比较多,初学者
不易掌握。而MPU6050自带了数字运动处理器,即DMP,并且,InvenSense提供了一个MPU6050的嵌入式运动驱动库,结合MPU6050的DMP,可以将我们的原始数据,直接转换成四元数输出,而得到四元数之后,就可以很方便的计算出欧拉角,从而得到yaw、roll和pitch。
使用内置的DMP,大大简化了四轴的代码设计,且MCU不用进行姿态解算过程,大大降低了MCU的负担,从而有更多的时间去处理其他事件,提高系统实时性。
使用MPU6050的DMP输出的四元数是q30格式的,也就是浮点数放大了2的30次方倍。在换算成欧拉角之前,必须先将其转换为浮点数,也就是除以2的30次方,然后再进行计算,计算公式为:
&&&&&& q0=quat[0]
/ q30;&& //q30格式转换为浮点数
&&&&&& q1=quat[1]
&&&&&& q2=quat[2]
&&&&&& q3=quat[3]
&&&&&& //计算得到俯仰角/横滚角/航向角
&&&&&& pitch=asin(-2
* q1 * q3 + 2 * q0* q2)* 57.3;&&&&& //俯仰角
&&&&&& roll=atan2(2
* q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3;&&&& //横滚角
&&&&&& yaw=atan2(2*(q1*q2
+ q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3; &&&&&& //航向角
&&&&&& 其中quat[0]~ quat[3]是MPU6050的DMP解算后的四元数,q30格式,所以要除以一个2的30次方,其中q30是一个常量:,即2的30次方,然后带入公式,计算出欧拉角。上述计算公式的57.3是弧度转换为角度,即180/π,这样得到的结果就是以度(°)为单位的。关于四元数与欧拉角的公式推导,这里我们不进行讲解,感兴趣的朋友,可以自行查阅相关资料学习。
&&&&&& InvenSense提供的MPU6050运动驱动库是基于MSP430的,我们需要将其移植一下,才可以用到STM32F4上面,官方原版驱动在光盘:7,硬件资料àMPU6050资料àDMP资料àEmbedded_MotionDriver_5.1.rar,这就是官方原版的驱动,代码比较多,不过官方提供了两个资料供大家学习:Embedded Motion Driver V5.1.1 API 说明.pdf和Embedded Motion Driver V5.1.1 教程.pdf,这两个文件都在DMP资料文件夹里面,大家可以阅读这两个文件,来熟悉官方驱动库的使用。
官方DMP驱动库移植起来,还是比较简单的,主要是实现这4个函数:i2c_write,i2c_read,delay_ms和get_ms,具体细节,我们就不详细介绍了,移植后的驱动代码,我们放在本例程àHARDWAREàMPU6050àeMPL文件夹内,总共6个文件,如图37.1.2.1所示:
45cfdd71e00b2d.jpg (0 Bytes, 下载次数: 24)
22:54 上传
图37.1.2.1 移植后的驱动库代码
&&&&&& 该驱动库,重点就是两个c文件:inv_mpu.c和inv_mpu_dmp_motion_driver.c。其中我们在inv_mpu.c添加了几个函数,方便我们使用,重点是两个函数:mpu_dmp_init和mpu_dmp_get_data这两个函数,这里我们简单介绍下这两个函数。
&&&&&& mpu_dmp_init,是MPU6050 DMP初始化函数,该函数代码如下:
//mpu6050,dmp初始化
//返回值:0,正常
//&&& 其他,失败
u8 mpu_dmp_init(void)
&&&&&& IIC_Init();
&&&&&&&&&& //初始化IIC总线
&&&&&& if(mpu_init()==0)& //初始化MPU6050
&&&&&& {&&&&
&&&&&&&&&&&&& res=mpu_set_sensors(INV_XYZ_GYRO|INV_XYZ_ACCEL);//设置需要的传感器
&&&&&&&&&&&&& if(res)return
&&&&&&&&&&&&& res=mpu_configure_fifo(INV_XYZ_GYRO|INV_XYZ_ACCEL);//设置FIFO
&&&&&&&&&&&&& if(res)return
&&&&&&&&&&&&& res=mpu_set_sample_rate(DEFAULT_MPU_HZ);&&&&&& //设置采样率
&&&&&&&&&&&&& if(res)return
&&&&&&&&&&&&& res=dmp_load_motion_driver_firmware();&&&&&&&&&&&&&&&& //加载dmp固件
&&&&&&&&&&&&& if(res)return
&&&&&&&&&&&&& res=dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation));
//设置陀螺仪方向
&&&&&&&&&&&&& if(res)return
&&&&&&&&&&&&& res=dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT|DMP_FEATURE_TAP|
DMP_FEATURE_ANDROID_ORIENT|DMP_FEATURE_SEND_RAW_ACCEL|
DMP_FEATURE_SEND_CAL_GYRO|DMP_FEATURE_GYRO_CAL);
//设置dmp功能
&&&&&&&&&&&&& if(res)return
&&&&&&&&&&&&& res=dmp_set_fifo_rate(DEFAULT_MPU_HZ);//设置DMP输出速率(最大200Hz)
&&&&&&&&&&&&& if(res)return
&&&&&&&&&&&&& res=run_self_test();&&&&&&&&&&&&&& //自检
&&&&&&&&&&&&& if(res)return
&&&&&&&&&&&&& res=mpu_set_dmp_state(1);&& //使能DMP
&&&&&&&&&&&&& if(res)return
&&&&&& return
&&&&&& 此函数首先通过IIC_Init(需外部提供)初始化与MPU6050连接的IIC接口,然后调用mpu_init函数,初始化MPU6050,之后就是设置DMP所用传感器、FIFO、采样率和加载固件等一些列操作,在所有操作都正常之后,最后通过mpu_set_dmp_state(1)使能DMP功能,在使能成功以后,我们便可以通过mpu_dmp_get_data来读取姿态解算后的数据了。
&&&&&& mpu_dmp_get_data函数代码如下:
//得到dmp处理后的数据(注意,本函数需要比较多堆栈,局部变量有点多)
//pitch:俯仰角 精度:0.1°&& 范围:-90.0° &---& +90.0°
//roll:横滚角& 精度:0.1°&& 范围:-180.0°&---& +180.0°
//yaw:航向角&& 精度:0.1°& 范围:-180.0°&---& +180.0°
//返回值:0,正常&&& 其他,失败
u8 mpu_dmp_get_data(float *pitch,float *roll,float
&&&&&& float
q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f;
&&&&&& unsigned
long sensor_
&&&&&& short
gyro[3], accel[3],
&&&&&& unsigned
&&&&&& long
&&&&&& if(dmp_read_fifo(gyro,
accel, quat, &sensor_timestamp, &sensors,&more))return 1;&&&&&&
&&&&&& if(sensors&INV_WXYZ_QUAT)
&&&&&&&&&&&&& q0
= quat[0] / q30; //q30格式转换为浮点数
&&&&&&&&&&&&& q1
= quat[1] / q30;
&&&&&&&&&&&&& q2
= quat[2] / q30;
&&&&&&&&&&&&& q3
= quat[3] / q30;
&&&&&&&&&&&&& //计算得到俯仰角/横滚角/航向角
&&&&&&&&&&&&& *pitch
= asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3;// pitch
&&&&&&&&&&&&& *roll
= atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3;// roll
&&&&&&&&&&&&& *yaw=
atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;//yaw
&&&&&& }else
&&&&&& return
&&&&&& 此函数用于得到DMP姿态解算后的俯仰角、横滚角和航向角。不过本函数局部变量有点多,大家在使用的时候,如果死机,那么请设置堆栈大一点(在startup_stm32f40_41xxx.s里面设置,默认是400)。这里就用到了我们前面介绍的四元数转欧拉角公式,将dmp_read_fifo函数读到的q30格式四元数转换成欧拉角。
&&&&&& 利用这两个函数,我们就可以读取到姿态解算后的欧拉角,使用非常方便。DMP部分,我们就介绍到这。
37.2 硬件设计
本实验采用STM32F4的3个普通IO连接MPU6050,本章实验功能简介:程序先初始化MPU6050等外设,然后利用DMP库,初始化MPU6050及使能DMP,最后,在死循环里面不停读取:温度传感器、加速度传感器、陀螺仪、DMP姿态解算后的欧拉角等数据,通过串口上报给上位机(温度不上报),利用上位机软件(ANO_Tech匿名四轴上位机_V2.6.exe),可以实时显示MPU6050的传感器状态曲线,并显示3D姿态,可以通过KEY0按键开启/关闭数据上传功能。同时,在LCD模块上面显示温度和欧拉角等信息。DS0来指示程序正在运行。
所要用到的硬件资源如下:
1)& 指示灯DS0
2)& KEY0按键
3) TFTLCD模块
5)& MPU6050
&&& 前4个,在之前的实例已经介绍过了,这里我们仅介绍MPU6050与探索者STM32F4开发板的连接。该接口与MCU的连接原理图如37.2.1所示:
86e091cf39c31e5af9ad1a28d3f8a9a6_257.jpg (0 Bytes, 下载次数: 16)
22:54 上传
&&&&&& &&&&&&&&&& 图37.2.1 MPU6050与STM32F4的连接电路图
从上图可以看出,MPU6050通过三根线与STM32F4开发板连接,其中IIC总线时和24C02以及WM8978共用,接在PB8和PB9上面。MPU6050的中断输出,连接在STM32F4的PC0脚,不过本例程我们并没有用到中断。另外,AD0接的GND,所以MPU6050的器件地址是:0X68。 &
37.3 软件设计
&软件设计部分请直接下载附件的pdf和实验源码学习
37.4 下载验证
在代码编译成功之后,我们通过下载代码到ALIENTEK探索者STM32F4开发板上,可以看到LCD显示如图37.4.1所示的内容:
279d1f63cc7ef31df746e_168.jpg (0 Bytes, 下载次数: 19)
22:54 上传
图37.4.1 程序运行时LCD显示内容
屏幕显示了MPU6050的温度、俯仰角(pitch)、横滚角(roll)和航向角(yaw)的数值。然后,我们可以晃动开发板,看看各角度的变化。
另外,通过按KEY0可以开启或关闭数据上报,开启状态下,我们可以打开:ANO_Tech匿名四轴上位机_V2.6.exe(该软件双击后,会弹出一个蓝色的小界面,直接关闭即可。然后才会进入主界面),这个软件,接收STM32F4上传的数据,从而图形化显示传感器数据以及飞行姿态,如图37.4.2和图37.4.3所示:
de750fa6bc3abe_624.jpg (0 Bytes, 下载次数: 26)
22:54 上传
ecc5a2e96da9a1d1fbe3a_383.jpg (0 Bytes, 下载次数: 24)
22:54 上传
实验详细手册和源码下载地址:
正点原子探索者STM32F407开发板购买地址:
18:13 上传
点击文件名下载附件
1.27 MB, 下载次数: 4383
18:13 上传
点击文件名下载附件
616.89 KB, 下载次数: 4725
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!
主题帖子精华
新手上路, 积分 34, 距离下一级还需 16 积分
在线时间0 小时
。。原子哥你好,,我用的是STM32F439II,现在在做驱动MPU6050&初始化都在下面。。
[C] 纯文本查看 复制代码
/* I2C2 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
/* GPIOB clock enable */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
/*!& GPIO configuration */
/* Configure I2C2 GPIOs */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Connect I2C2 pins to AF4 */
GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_I2C2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_I2C2);
/*Configure I2C2*/
I2C_DeInit(I2C2);
I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStruct.I2C_OwnAddress1 = 0x30;//I2C_SLAVE_ADDRESS7;
这里原来就是6050的地址。。不是很理解。这里不应该是STM32的地址么
I2C_InitStruct.I2C_Ack = I2C_Ack_E
I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7
I2C_InitStruct.I2C_ClockSpeed = I2C_SPEED;
/* Initialize the I2C peripheral w/ selected parameters */
I2C_Cmd(I2C2, ENABLE);
/* Apply I2C configuration after enabling it */
I2C_Init(I2C2, &I2C_InitStruct);
然后他丫的一直卡在这里。。。
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
延时是{ timeout = 100000;}timeout--;等于0的时候就return 0xff;
& & & & & & & & & & & & & & & & & & &
听不懂粤语好心塞!
主题帖子精华
新手上路, 积分 34, 距离下一级还需 16 积分
在线时间0 小时
回复【2楼】June_不会说粤语:
---------------------------------
本人2逼了。。读写地址搞错了。。。。。
听不懂粤语好心塞!
主题帖子精华
初级会员, 积分 103, 距离下一级还需 97 积分
在线时间19 小时
准备用mini板调试6050了,期望成功~
主题帖子精华
新手上路, 积分 21, 距离下一级还需 29 积分
在线时间0 小时
请问这个匿名上位机有下载地址吗?
主题帖子精华
在线时间307 小时
回复【5楼】jinzhong:
---------------------------------
开发板光盘就有。论坛置顶帖就有开发板光盘资料下载地址
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
中级会员, 积分 333, 距离下一级还需 167 积分
在线时间55 小时
回复【6楼】正点原子:
---------------------------------
u8&mpu_dmp_init(void)&函数里面是否要在“return&9;”之后紧跟着加个“return&0;”,而将函数最后一行的return&0改为返回一个非零的值?
急不来总有障碍客观的存在...
主题帖子精华
新手上路, 积分 23, 距离下一级还需 27 积分
在线时间0 小时
原子哥,小妹弱弱的问一个问题,这个实验用到STM32F103ZE也可以吧??
主题帖子精华
中级会员, 积分 333, 距离下一级还需 167 积分
在线时间55 小时
当然可以,注意配置好IO
急不来总有障碍客观的存在...
主题帖子精华
新手上路, 积分 23, 距离下一级还需 27 积分
在线时间0 小时
回复【9楼】文刀言身寸:
---------------------------------
Thank&you&.
主题帖子精华
新手上路, 积分 34, 距离下一级还需 16 积分
在线时间1 小时
这个程序MINI板可以吗
主题帖子精华
中级会员, 积分 333, 距离下一级还需 167 积分
在线时间55 小时
回复【11楼】飓风:
---------------------------------
根据IO做相应的修改配置就行了吧
急不来总有障碍客观的存在...
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间3 小时
回复【9楼】文刀言身寸:
---------------------------------
原子哥,我把程序移植到stm32f103上,为什么在MPU_Init(void)这个函数里头的res=MPU_Read_Byte(MPU_DEVICE_ID_REG);这个读出来不是0x68而是oxd1(我用的是模块,ad0接地了),后来改成0xd1试了一下,主函数里面的mpu_dmp_get_data(&pitch,&roll,&yaw)这个函数一直不会为0,读不出欧拉角,那移植后要怎么改?我只是想读取欧拉角,我改完整个程序编译是没有出错。
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间3 小时
原子哥,我把程序移植到stm32f103上,为什么在MPU_Init(void)这个函数里头的res=MPU_Read_Byte(MPU_DEVICE_ID_REG);这个读出来不是0x68而是oxd1(我用的是模块,ad0接地了),后来改成0xd1试了一下,主函数里面的mpu_dmp_get_data(&pitch,&roll,&yaw)这个函数一直不会为0,读不出欧拉角,那移植后要怎么改?我只是想读取欧拉角,我改完整个程序编译是没有出错。
主题帖子精华
在线时间307 小时
回复【14楼】幸运果:
---------------------------------
杜邦线接的?
杜邦线搞短一点,长了很容易出这个问题,最好直接插板子.
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
新手上路, 积分 21, 距离下一级还需 29 积分
在线时间0 小时
原子哥你好,我目前使用移植的DMP之后发现加速度回大于1G(16384)。把传感器翻过来之后得到的结果又小于-1G,目前手上有两个传感器,状态都一样。不过加速度值也不一样,按理说自测之后Z方向的加速度应该很接近于1G啊。这个会是什么原因呢?
主题帖子精华
在线时间307 小时
回复【16楼】kufan_561:
---------------------------------
这我也不太清楚
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间3 小时
回复【15楼】正点原子:
---------------------------------
原子哥,之前那个地址的问题是解决了,谢谢哈!可是我移植的程序还是有问题mpu_dmp_get_data(&pitch,&roll,&yaw)这个值不会为0,这还要改哪些吗?堆栈我改到800和1200都不行,求原子哥赐教一下。
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间3 小时
回复【15楼】正点原子:
---------------------------------
原子哥,我发现这个res=dmp_load_motion_driver_firmware(); 返回值不为0,那是什么问题?这个函数是在mpu_dmp_init(void)这个函数里头的,求原子哥教下
主题帖子精华
在线时间307 小时
回复【19楼】幸运果:
---------------------------------
这个你跟踪进去,看看哪里出的问题了。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间3 小时
回复【20楼】正点原子:
---------------------------------
原子哥,这个函数memcmp(firmware+ii,&cur,&this_write)出问题,这个函数是在int&mpu_load_firmware(unsigned&short&length,&const&unsigned&char&*firmware,
&&&&unsigned&short&start_addr,&unsigned&short&sample_rate)里头,为什么找不到它该子函数的编写?它是要实现什么作用?
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间3 小时
回复【20楼】正点原子:
---------------------------------
原子哥,我最后检查了我DMP在dmp_load_motion_driver_firmware(),这步返回值是-2.。这样是哪里出错&?要改哪里?求解
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间3 小时
原子哥,我最后检查了我DMP在dmp_load_motion_driver_firmware(),这步返回值是-2.。这样是哪里出错&?要改哪里?求解
主题帖子精华
在线时间307 小时
回复【23楼】幸运果:
---------------------------------
这个我也不知道。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间3 小时
回复【24楼】正点原子:
--------------------------------
问题解决了,模块放的时候倾斜角不能太大,不然自检返回值不是3.倾斜幅度不一样返回值会不一样,应该是程序自检本身是那样写的。
主题帖子精华
在线时间307 小时
回复【25楼】幸运果:
---------------------------------
额,谢谢分享。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
新手上路, 积分 34, 距离下一级还需 16 积分
在线时间1 小时
回复【6楼】正点原子:
---------------------------------
原子哥匿名四轴上位机mini版子上能用吗?我用mini版读不出数据啊...
主题帖子精华
在线时间307 小时
回复【27楼】飓风:
---------------------------------
可以啊,你发送正确的数据给上位机就行了。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间9 小时
原子哥,我用F103移植了这个程序,发现一个问题:我用4.3寸的液晶显示姿态角,发现会有一定的延时,不是特别灵敏,上传到上位机上,也是会卡顿,但我吧液晶全关了,上传到上位机上就挺灵敏。那是不是因为液晶扫屏占用的时间太长的原因?
主题帖子精华
在线时间307 小时
回复【29楼】叮咚呾:
---------------------------------
不是这个问题,看看是不是你供电不足
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间9 小时
回复【30楼】正点原子:
---------------------------------
我就用的USB转串口供电,但是我用探索者的时候也单纯用的USB供电倒是一切正常,不管开液晶关液晶都是反应很快的。。。
主题帖子精华
新手上路, 积分 34, 距离下一级还需 16 积分
在线时间1 小时
回复【28楼】正点原子:
---------------------------------
回复【27楼】飓风:
---------------------------------
原子哥开发板上写的I2C是推挽输出,其实是没有用到I2C库。如果用引脚直接外接MPU6050是读不到数据的还是要外接上啦电阻。不知道说的对不对。我用的是I2C1,PB6,PB7。
主题帖子精华
在线时间307 小时
回复【32楼】飓风:
---------------------------------
我们用的MCU自带的上啦电阻,也可以用。
不过最好模块自带上拉电阻,这样就免去了麻烦。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
新手上路, 积分 34, 距离下一级还需 16 积分
在线时间1 小时
回复【33楼】正点原子:
---------------------------------
回复【33楼】正点原子:
---------------------------------
原子个今天我对f4的mpu6050移植到mini板上读不出数据上面没有显示接受的数据。求原子哥帮忙啊
主题帖子精华
中级会员, 积分 285, 距离下一级还需 215 积分
在线时间6 小时
看到题目,必须得点赞,
点赞,点赞,点赞,点赞,点赞,点赞,点赞,点赞,点赞,点赞,点赞,点赞,
主题帖子精华
在线时间307 小时
回复【34楼】飓风:
---------------------------------
论坛有现成的,自己找
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
新手上路, 积分 44, 距离下一级还需 6 积分
在线时间0 小时
回复【21楼】幸运果:
---------------------------------
我也出现了你这个问题,if&(memcmp(firmware+ii,&cur,&this_write))
&&&&&&&&&&&&return&-2;返回值是-2,我把模块放平了还是不行,这函数是干嘛的啊,到底咋解决啊?
主题帖子精华
新手上路, 积分 49, 距离下一级还需 1 积分
在线时间3 小时
回复【37楼】王子期待:
---------------------------------
那个值会变,你可以加一个while,这样就没问题了,直到检测的值是正常的才跳出循环
主题帖子精华
初级会员, 积分 113, 距离下一级还需 87 积分
在线时间3 小时
打开就这样 怎么办啊 新版的通讯协议已经改了
http://blog.csdn.net/kiti1013
人都有梦 在遥远的未来
主题帖子精华
初级会员, 积分 198, 距离下一级还需 2 积分
在线时间19 小时
非常感谢!终于看到更合适新手的资料了。
主题帖子精华
初级会员, 积分 198, 距离下一级还需 2 积分
在线时间19 小时
回复【4楼】阿拓:
---------------------------------
请问你成功了没有?
主题帖子精华
初级会员, 积分 103, 距离下一级还需 97 积分
在线时间19 小时
回复【41楼】弦子的弦:
---------------------------------
必须的呀
主题帖子精华
初级会员, 积分 198, 距离下一级还需 2 积分
在线时间19 小时
回复【42楼】阿拓:
---------------------------------
好棒,等我MPU来了试试,不懂再请教你^_^
主题帖子精华
初级会员, 积分 198, 距离下一级还需 2 积分
在线时间19 小时
回复【42楼】阿拓:
---------------------------------
用杜邦线连的,测试效果怎样?
主题帖子精华
初级会员, 积分 103, 距离下一级还需 97 积分
在线时间19 小时
回复【44楼】弦子的弦:
---------------------------------
测试时一直都用杜邦线连着的,没有问题。
从其他方面找找原因吧。
主题帖子精华
初级会员, 积分 198, 距离下一级还需 2 积分
在线时间19 小时
回复【45楼】阿拓:
---------------------------------
本来MPU今天到了,结果短信被拦截了,所以没有还没有试过。
主题帖子精华
新手上路, 积分 33, 距离下一级还需 17 积分
在线时间0 小时
在STM32F10系列中有函数FLASH_ReadOutProtection()对FLASH进行读出保护,
但在STM32F4系列中没有该函数
求高手解决
主题帖子精华
新手上路, 积分 33, 距离下一级还需 17 积分
在线时间0 小时
原子哥:&在STM32F10系列中有函数FLASH_ReadOutProtection()对FLASH进行读出保护,&
但在STM32F4系列中没有该函数,有对应替换函数吗
主题帖子精华
在线时间307 小时
回复【48楼】详见恨晚:
---------------------------------
请看我们教程。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
高级会员, 积分 613, 距离下一级还需 387 积分
在线时间32 小时
上位机软件也一起发一下啊!原子哥
Powered by

我要回帖

更多关于 正点原子官网 的文章

 

随机推荐