首页 > 解决方案 > 如何增加一个环绕整数?(0-360角度传感器环绕)

问题描述

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

我在 17:1 齿轮比应用中使用此传感器(汽车中的 1 个方向盘旋转 = 17~ 360 度旋转,如传感器所见)。方向盘可旋转数次锁定锁定。

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

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

对 Arduino 的环绕值的许多研究都涉及自引导溢出以来的时间。这不适用于我的申请。

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

标签: arduino

解决方案


我也遇到过这个问题,但是一天 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

推荐阅读