I2C接口读取MPU9250磁力数值

余生长醉 提交于 2020-01-13 17:26:53

一开始拿到芯片手册云里雾里,根本没有找到关于磁力数据的寄存器,结果上网一查才知道,这芯片竟然是个胶水芯片。。。

MPU9250内部是MPU6050和AK8963两个芯片合并在一起的,感觉傻傻的。

内部的AK8963是负责三轴磁力传感器采样的芯片,它通过I2C总线与MPU9250连接在一起。

如上图所示,MPU9250还集成了一个I2C主机控制器。默认情况下MPU9250用它的I2C主机控制器与AK8963通信,把磁力值读到出放到指定的寄存器中,这需要设置一堆寄存器,真是麻烦得一逼!!!

幸好MPU9250还预留了I2C直通模式,这个模式相当于MPU9250和AK8963共同使用一条I2C总线,因为它们的通信地址不一样,

MPU9250的地址:0xD0/0xD1

AK8963的地址:0x18/0x19

在写驱动程序的时候,可以把它们当作硬件上分离的两个芯片挂在同一条I2C总线上。

直通模式需要设置MPU9250的第55号寄存器的Bit1写1即可开启。


有了直通模式我们就可以直接与AK8963通信了,AK8963的寄存器不多。

下面讲讲几个关键寄存器操作:

0x00:这个寄存器是芯片ID=0x48,能读出这个ID证明通信OK了。

0x0A:设置工作模式,建议上电后先写入0x0F,读取出芯片校准系数;然后再写0x01,进行单次采样。

0x02:状态寄存器,BIT0为1表示采样完成,可以读取采样数据了。网上有人说读不到数据,加上10毫秒延时就能读出数据,就是因为没有检查状态值。经过实验测试单次采样大概需要6-8毫秒。

0x03-0x08:数据寄存器,三个轴,每个轴的数据都分为高8位和低8位,组成16位的有符号整数。

0x10-0x12:校准寄存器,出厂设置的校准参数,当0x0A寄存器写入0x0F后才可以读出来。

手册上写了数据校准参数的用法:

Hadj是校准后的数据;

H是读出来的原始采样数据;

ASA是校准寄存器读出来的参数;


得到正确的三轴磁力数值后,就可以用来实现一个简单的电子指南针了。

在水平面的方向=180 + arctan(Y, X) * 180 / PI; 

由于环境干扰,还需要加入一个平面校准算法:将芯片在水平面原地转360度,记录三个轴的采样值的最大值和最小值,求得(最大值+最小值)除以2得到偏移值。将原始采样值减去偏移值之后,再送入上面的公式计算角度会更准确。

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!