在一个以前的文章,我们以Pmods CMPS2为例,讨论了如何从磁力计中获取数据。Pmod CMPS2使用I2C通信协议,因此I2C控制器的指令以伪代码形式给出。同样的道理也适用于这里。
校准磁强计通常是使用这种传感器并成功地将其转换成数字罗盘最困难的部分。说明就在下面,但要做好准备,因为它很长。
校准
为了校准磁强计,需要计算与磁传感器和环境相关的偏移量,并将其从未来的测量中去除。内部偏移量的计算方法如下:
-
-
将Pmod CMPS2上电,等待10ms后再进行操作。
-
提供一个START条件,用一个写位调用设备ID
I2CBegin (0 xa0);//设备ID 0x30,写(0)位
-
等待收到来自Pmod CMPS2的ACK。
-
发送内部控制寄存器0(地址0x07)作为要通信的寄存器
I2CWrite (0 x07);//地址0x07对应控制寄存器0
-
等待收到来自Pmod CMPS2的ACK。
-
编写对电容充电的命令,为SET动作做准备。
I2CWrite (0 x80);//0x80填充电容
-
等待收到来自Pmod CMPS2的ACK。
-
延迟至少50毫秒,让Pmod CMPS2完成准备工作。
-
提供一个START条件,用一个写位调用设备ID
I2CBegin (0 xa0);//设备ID 0x30,写(0)位
-
等待收到来自Pmod CMPS2的ACK。
-
发送内部控制寄存器0(地址0x07)作为要通信的寄存器
I2CWrite (0 x07);//地址0x07对应控制寄存器0
-
等待收到来自Pmod CMPS2的ACK。
-
编写启动SET操作的命令。
I2CWrite (0 x20);//0x20启动SET动作
-
等待收到来自Pmod CMPS2的ACK。
-
延迟至少1毫秒,以允许Pmod CMPS2完成SET操作。
-
提供一个START条件,用一个写位调用设备ID
I2CBegin (0 xa0);//设备ID 0x30,写(0)位
-
等待收到来自Pmod CMPS2的ACK。
-
发送内部控制寄存器0(地址0x07)作为要通信的寄存器
I2CWrite (0 x07);//地址0x07对应控制寄存器0
-
等待收到来自Pmod CMPS2的ACK。
-
通过设置高位0和停止位来写入测量的命令。
I2CWrite (0 x01);//0x01启动数据采集
-
默认情况下,延迟至少7.92 mS,以允许Pmod CMPS2完成数据收集。
-
提供一个START条件,用一个写位调用设备ID
I2CBegin (0 xa0);//设备ID 0x30,写(0)位
-
等待收到来自Pmod CMPS2的ACK。
-
发送状态寄存器(0x03)作为要读取的寄存器
I2CWrite (0 x03);//表示您希望与地址0x03交互
-
提供一个START条件,用一个读取位调用设备ID
I2CBegin (0 xa1);//设备ID 0x30,读取(1)位
-
等待收到来自Pmod CMPS2的ACK。
-
循环SCL线路以接收SDA线路上的状态寄存器数据。通过重复步骤8到13,直到第0位设置为“1”,表示所有3个轴上的数据都可以被读取。
-
提供一个START条件,用一个写位调用设备ID
I2CBegin (0 xa0);//设备ID 0x30,写(0)位
-
等待收到来自Pmod CMPS2的ACK。
-
发送Xout LSB (0x00)对应的第一个寄存器地址作为要读取的寄存器。
I2CWrite (0 x00);//地址0x00作为第一个要读取的寄存器
-
提供一个START条件,用一个读取位调用设备ID
I2CBegin (0 xa1);//设备ID 0x30,读取(1)位
-
等待收到来自Pmod CMPS2的ACK。
-
循环SCL行,从SDA行中的X、Y和Z寄存器接收数据位,在每个数据字节之间提供一个ACK。Pmod CMPS2地址指针自动移动到每个连续的字节。通过发送一个NACK和一个STOP命令来结束通信。
I2CReadMultiple (6);//读取6个字节,在接收到的每个字节和最后一个字节之后的NACK之间向从设备发送一个ACK
-
每个读数都包含外部磁场H此外,偏移与通过SET动作的线圈的电流有关。
Output1=+H+Off年代etOutput1 = + H +偏移量 -
现在将执行一个RESET动作来反转感应电阻的磁化,从而得到反向偏移值。
-
提供一个START条件,用一个写位调用设备ID
I2CBegin (0 xa0);//设备ID 0x30,写(0)位
-
等待收到来自Pmod CMPS2的ACK。
-
发送内部控制寄存器0(地址0x07)作为要通信的寄存器
I2CWrite (0 x07);//地址0x07对应控制寄存器0
-
等待收到来自Pmod CMPS2的ACK。
-
写命令给电容充电,准备RESET动作。
I2CWrite (0 x80);//0x80填充电容
-
等待收到来自Pmod CMPS2的ACK。
-
延迟至少50毫秒,让Pmod CMPS2完成准备工作。
-
提供一个START条件,用一个写位调用设备ID
I2CBegin (0 xa0);//设备ID 0x30,写(0)位
-
等待收到来自Pmod CMPS2的ACK。
-
发送内部控制寄存器0(地址0x07)作为要通信的寄存器
I2CWrite (0 x07);//地址0x07对应控制寄存器0
-
等待收到来自Pmod CMPS2的ACK。
-
编写启动RESET操作的命令。
I2CWrite (0 x40);//0x40启动RESET动作
-
等待收到来自Pmod CMPS2的ACK。
-
延迟至少1毫秒,以允许Pmod CMPS2完成SET操作。
-
提供一个START条件,用一个写位调用设备ID
I2CBegin (0 xa0);//设备ID 0x30,写(0)位
-
等待收到来自Pmod CMPS2的ACK。
-
发送内部控制寄存器0(地址0x07)作为要通信的寄存器
I2CWrite (0 x07);//地址0x07对应控制寄存器0
-
等待收到来自Pmod CMPS2的ACK。
-
通过设置高位0和停止位来写入测量的命令。
I2CWrite (0 x01);//0x01启动数据采集
-
默认情况下,延迟至少7.92 mS,以允许Pmod CMPS2完成数据收集。
-
提供一个START条件,用一个写位调用设备ID
I2CBegin (0 xa0);//设备ID 0x30,写(0)位
-
等待收到来自Pmod CMPS2的ACK。
-
发送状态寄存器(0x03)作为要读取的寄存器
I2CWrite (0 x03);//表示您希望与地址0x03交互
-
提供一个START条件,用一个读取位调用设备ID
I2CBegin (0 xa1);//设备ID 0x30,读取(1)位
-
等待收到来自Pmod CMPS2的ACK。
-
循环SCL线路以接收SDA线路上的状态寄存器数据。通过重复步骤8到13,直到第0位设置为“1”,表示所有3个轴上的数据都可以被读取。
-
提供一个START条件,用一个写位调用设备ID
I2CBegin (0 xa0);//设备ID 0x30,写(0)位
-
等待收到来自Pmod CMPS2的ACK。
-
发送Xout LSB (0x00)对应的第一个寄存器地址作为要读取的寄存器。
I2CWrite (0 x00);//地址0x00作为第一个要读取的寄存器
-
提供一个START条件,用一个读取位调用设备ID
I2CBegin (0 xa1);//设备ID 0x30,读取(1)位
-
等待收到来自Pmod CMPS2的ACK。
-
循环SCL行,从SDA行中的X、Y和Z寄存器接收数据位,在每个数据字节之间提供一个ACK。Pmod CMPS2地址指针自动移动到每个连续的字节。通过发送一个NACK和一个STOP命令来结束通信。
I2CReadMultiple (6);//读取6个字节,在接收到的每个字节和最后一个字节之后的NACK之间向从设备发送一个ACK
-
每个读数都包含外部磁场H此外,与通过RESET动作的线圈的电流相关联的偏移。Output2=−H+Off年代et
-
与该设备相关的偏移量可以计算出来,然后从未来的测量中减去,从而获得实际的磁场。Off年代et= (Output1+Output2) /2
-
校准的其他方法是努力消除铁偏差引入磁强计的周边环境通过测量(连续或一组时间)所有可能的磁强计读数笛卡尔球体和跟踪每个轴的最高及最低的读数。然后可以按照上面描述的SET和RESET动作的相同方式计算偏移量。这种方法的优点是当Pmod CMPS2不断改变位置或当其他外部磁场可能被引入到测试环境时。
别忘了,数据还需要从高斯单位转换成正确的罗盘航向。以后的文章将详细描述这一点,或者您可以访问PmodCMPS2参考手册。
如果您想查看在Arduino IDE中编写的一些示例代码,以了解如何从Pmod CMPS2获取、校准和转换数据,请参阅Pmod CMPS2资源中心.
如有问题或意见,请在下面的评论区留言或访问Digilent论坛!

感谢您的指导。我感到不知所措