如何增加包裹整数? (0-360角度传感器环绕)

时间:2019-06-11 04:24:37

标签: arduino

我有一个角度传感器,读数为0-360,它是绝对位置传感器。该值只能读取0-360,然后从360开始从0开始。小于0的值会回绕到360。

我在17:1传动比的应用中使用此传感器(汽车上的1个方向盘旋转=传感器看到的17〜360度旋转)。方向盘可以旋转几次以锁定。

角度传感器并不总是线性地读取角度(0,1,2,3 ... 360,0),因为角度更新可以跳过基于RPM的数字(但幸运的是,不会错过整个旋转) 。因此,我无法编写基于绝对0/360交叉的增量/减量代码。

我正在努力编写一些代码来处理环绕,因为我需要“读取”大于“ 360度”的角度。

许多关于Arduino环绕值的研究都涉及自启动溢出以来的时间。这不适用于我的应用程序。

目标是一个变量,其中包含传感器的总读数作为带符号的整数。

2 个答案:

答案 0 :(得分:0)

首先,0°和360°是相同的角度。是不是0到359°?

为什么不像这样扩展零交叉检测:

angle += sensor

If 240<=lastsensor<=359 and 0<=sensor<=120:
    angle +=360
If 240<=sensor<=359 and 0<=lastsensor<=120:
    angle -= 360
lastsensor=sensor

答案 1 :(得分:0)

我也曾经有过这个问题,但是每天24小时都是这样。

如果您的传感器始终报告每个样本之间的机械跳变(远)小于180°,那么它将起作用。

diff = currentsensor - lastsensor

if Math.Abs(diff) < 180 // no wrapparound
    angle += diff;
else // wraparound (diff >= 180) // values around 180 are critical, was it a wrap around or not?
    diff = -1 * Math.Sign(diff) * (360 - Math.Abs(diff)) // so 181 ... 359 --> -179 ... -1 or -181 ... -359 --> +179 ... +1
    angle += diff;

lastsensor = currrentsensor

PS:您很可能被否决了,因为您的问题没有显示任何代码,就像您在此处委派解决方案那样。 而且您没有编写所需的编程语言。