在两个之前帖子我们讨论了如何校准磁力计的数据才能得到精确的测量,以及如何测量收购首先是数据。在这篇文章中,我们将通过最后一个主要步骤,如何将数据从高斯单位转换成一个真正的指南针使用PMOD CMPS2.举个例子。
数据转换
的美新MMC34160PJPmod CMPS2上的磁力计以高斯为单位提供了每个轴的数据,但当以罗盘航向表示时,这些信息通常更清晰。将高斯单位转换为罗经航向的方法如下所示。
-
计算默认情况下LSB值的LSB的量为0.48828125毫克的LSB值的真实高斯值,导致每个高斯的2048 LSB。xG一个u年代年代D一个t一个=xD一个t一个l年代B∗0.48828125米G
yG一个u年代年代D一个t一个=yD一个t一个l年代B∗0.48828125米G -
计算出方向D首先检查X高斯数据是否等于0,以防止在未来的计算中除以0 0错误。如果X高斯数据是0,检查Y高斯数据是否小于0。如果Y小于0高斯,方向D为90度;如果Y大于等于0高斯,方向D是0度。
-
如果X高斯数据不为零,计算Y高斯和X高斯数据的反正切,并将极坐标转换为度数。D=一个rct一个n(yG一个u年代年代D一个t一个/xG一个u年代年代D一个t一个)∗(180 /π)
-
如果方向D大于360度,就用这个值减去360度。
-
如果方向D小于0度,则在这个值上加360度。
-
然后由方向值D确定罗经航向:
-
如果D大于337.25度或小于22.5度 - 北方
-
如果D在292.5度和337.25度之间-西北
-
如果D在247.5度和292.5度之间-西经
-
如果D在202.5度到247.5度之间,则向西南方向
-
如果D在157.5度和202.5度之间 - 南方
-
如果D在112.5度和157.5度之间-东南
-
如果D在67.5度和112.5度之间,向东
-
如果D在0度和67.5度之间 - 东北部
-
如果您想了解最初或如何校准磁力计的日期,您可以访问主题中的上一篇文章,或转到PMOD CMPS2参考手册.
如果您希望看到在Arduino IDE中写入的示例代码,我们如何从PMOD CMPS2获取,校准和转换数据,请参阅PMOD CMPS2资源中心.

有关问题或意见,请在以下评论部分发布或访问Digilent论坛!

我用了你的代码,它在某一点上工作,但在90和270之间缺乏数据。如果D的数据在这两个数字之间,它会从这两个数字切换。也许你能解释我的问题!
嗨,菲利普,
我建议在Digilent论坛发布你的问题(链接在页面的顶部,因为它看起来不像我可以提供一个url链接),一个Digilent工程师将能够看到和回复你的问题在一个环境更好的适合故障诊断。
谢谢,
詹姆斯·科尔文
我认为问题是您使用的是Arctan函数而不是Arctan2功能
谢谢! ! !
这种稻草配有9250 MPU,但我必须将传感器颠倒,或者我很少得到任何东方运动..:}
//获得DEG标题
浮动标题= atan2(my,mx)* 180 / m_pi;
如果(标题> 360)
标题=标题-360;
Else if(heading = 337.25 || heading = 292.5 && heading = 247.5 && heading = 202.5 && heading = 157.5 && heading = 112.5 && heading = 67.5 && heading = 22.5 && heading < 67.5) Else if(heading = 337.25 || heading = 292.5 && heading = 247.5 && heading = 202.5 && heading = 157.5 && heading = 112.5 && heading = 67.5 && heading = 22.5 && heading < 67.5)
mydirection =“东北”;
serial.print(“,标题:”);
系列。println(标题,5);
serial.print(“,dir:”);
以Mydirection);
if (xGaussData = 0); / /{
如果(yGaussData 360)
D = D - 360;
否则if(d <0)
d = d + 360;
if(337.25 <= D <22.5)
Printf(“北”);
否则if(292.5 <= D <337.25)
Printf(“西北”);
Else if (247.5 <= d < 292.5)
printf("西方");
Else if (202.5 <= d < 247.5)
printf(“西南”);
Else if (157.5 <= d < 202.5)
printf("南");
Else if (112.5 <= d < 157.5)
printf(“东南”);
否则if(67.5 <= D <112.5)
printf(“东”);
Else if (0 <= d < 67.5)
Printf(“东北”);
嘿,
你的伪代码有一个bug:
如果D大于337.25度或小于22.5度 - 北方
如果D在0度和67.5度之间 - 东北部
假设d = 0到22.5之间的任何内容,那么这两个条件都是真的。