隔了好久我又来了。前阵子粗略学习算法,,,,嗯,好难,先把驱动写完再说吧。
今天带来的是使用硬件IIC驱动三个最重要的传感器。
磁罗盘HMC5883L,六轴惯性MPU6050,气压计MS5611。总的来说,罗盘最简单,气压计最麻烦。
参考网上的资料,很多人都做了这三种元件的驱动例程,我就不太废话了,简单就是初始化后读取数据,要注意一些时间上的问题参考他们的数据手册,有一些AD时间要注意,因为如果读取太快,AD转换未完成,读取的数值是没有意义的,一般6050超级快,不用管,5883一般初始化为75Hz,那么读取就不能比75Hz快,考虑协调舵机的控制,用50Hz读罗盘比较合适。最慢的是气压计,气压计读取要分别读取温度AD和压力AD,根据数据手册,最长时间都是10ms,也就是50Hz,我这里只是做例程,就同意10Hz读取,避免麻烦。在后面的写飞控框架的时候我会精调时序。(当然融合,解算,控制可还没学懂,到时候打算用几ms延时代替相应的函数)
非常值得说的有两点。
一、DMA方式操作时,占用CPU的时间只是链接通道和启动传输,所以很快就完成了,但实际上DMA在传输中最好不要更新链接通道或启动传输命令,以免造成意想不到的错误,我在例程中用了延时1ms,在实际飞控中,这些时间也要用来进行计算。具体需要多久来传输,最简单的方法时用逻辑分析仪来看,例程中有一个TSET_PIN就是用来测时序的,我最终用过后把它删了,可以再"gpio.h"中看到他的对应IO,用的是板子上的PWM输出的一个引脚,具体忘记了,哈哈。
二、关于MS5611 ,有两个小点,首先是读取校准值,不知为什么,虽然他们的寄存器是连续的,却不能一次读出,必须分成6次读取六个值。一次读取只会得到一堆0xFF。其次,网上很多例程一个抄一个,都是错的。在读取校准值时,C1对应的地址是0xA2,不是首地址0xA0,0xA0是制造商序号,没有实际意义。网上很多例程都是0xA0开始读取,肯定没有测试就抄过来,很不负责任。官方给的例程是Arduino的,十分详细,也是正确的,可以参考。
下面链接包含了数据手册和例程。
例程:
链接:https://pan.baidu.com/s/1hwzzZCtMuKcrVn_QrALkuw 密码:c9l5
小彩蛋等一会儿再写一个SPI驱动WS2812的简单例程。
链接:https://pan.baidu.com/s/19RFv9coA_tmdgrS_7oAb0w 密码:zjmo
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>