arduino - 如何增加一个环绕整数?(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 的环绕值的许多研究都涉及自引导溢出以来的时间。这不适用于我的申请。
目标是一个变量,其中包含作为有符号整数的总传感器读数。
解决方案
我也遇到过这个问题,但是一天 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
推荐阅读
- javascript - 在运行我的 Phonegap 项目时出现给我控制台错误,如何解决这个错误?
- java - 位置 4 处的意外令牌左括号({)
- spring - 将 KTable 或 Kstream 与 Spring Cloud Stream 一起使用并使用 Avro
- vba - 如何将表中特定行的数据添加到另一个表
- android - 使用 buildToolsVersion 28.0.1 时发现多个文件具有操作系统独立路径“lib/mips/libRSSupport.so”
- android - 片段和活动中的 Backstack 问题
- python - python - 如果值 = 1,则熊猫数据框打印列
- java - 在其他项目中使用 AspectJ 项目作为 jar
- docker-compose - Docker_Error:-"socket.gaierror: [Errno -3] Temporary failure in name resolution" 在 docker 镜像上运行 celery 时出现错误
- php - 是否可以使用模型的记录在 Laravel 模型中声明动态常量?