我有一个角度传感器,读数为0-360,它是绝对位置传感器。该值只能读取0-360,然后从360开始从0开始。小于0的值会回绕到360。
我在17:1传动比的应用中使用此传感器(汽车上的1个方向盘旋转=传感器看到的17〜360度旋转)。方向盘可以旋转几次以锁定。
角度传感器并不总是线性地读取角度(0,1,2,3 ... 360,0),因为角度更新可以跳过基于RPM的数字(但幸运的是,不会错过整个旋转) 。因此,我无法编写基于绝对0/360交叉的增量/减量代码。
我正在努力编写一些代码来处理环绕,因为我需要“读取”大于“ 360度”的角度。
许多关于Arduino环绕值的研究都涉及自启动溢出以来的时间。这不适用于我的应用程序。
目标是一个变量,其中包含传感器的总读数作为带符号的整数。
答案 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:您很可能被否决了,因为您的问题没有显示任何代码,就像您在此处委派解决方案那样。 而且您没有编写所需的编程语言。