这是我的代码,当我运行程序时,油门输出为-18,当我进行数学计算时,我得到77.941......这就是我正在寻找的。我正在 Windows 10 上使用 Arduino IDE 在 Atmega 328P 上对其进行编程。
下面的示例打印 -18,根据我的计算,它应该是 77.941:
int throttle = (((800 - 270) * 100) / 680);
Serial.println(throttle);
这是可视化代码:
throttle = (((throttleSensor - oldMinValue) * (newMax - newMin)) / (oldMax - oldMin));
我正在尝试这样做,将数字范围转换为另一个范围,保持比率
另外,我应该补充一点,当结果低于 47 时它工作正常,高于 47 时它会翻转为负数。
简短的答案是,
(800 - 270) * 100
= 53000。对于为计算结果分配的空间来说,这个数字太大了,整数溢出。
因此更改代码...
int throttle = (((800 - 270) * 100) / 680);
对此...
long largeValue = 100;
int throttle = (((800 - 270) * largeValue) / 680);
解决了问题。数字
100
或 (newMax - newMin)
的值必须是“long”,否则处理器会计算错误。有人,如果需要的话请纠正我,或者如果你有更好的答案,请发布一个更好的答案。另外,如果有人对标题有更好的建议,以便将来遇到相同问题的人可以更容易地找到它,请继续并在下面推荐它。
感谢 StackOverflow 社区帮助我解决这个问题!
as
@edgar_wideman
答案表明您的子结果(53000
)不适合16位整数<-32768,+32767>
。您可以通过位移位(除以 2 的幂)来避免使用 long
,如下所示:
int sh=1; // shift stuff so it fits 16 bit
int throttle = (((800 - 270) * (100>>sh)) / (680>>sh));
这可能不是您正在寻找的,但有一个函数可以将值从一个范围更改为另一个范围。
int y = map(value, minOld, maxOld, minNew, maxNew);
例如:
int y = map(10, 0, 50, 0, 100); // y would be 20