关于数据跳变的解决办法
关于数据跳变的解决办法
原代码存在问题:比如 9.9 → 直接变成 9,10.1 → 直接变成 10,肉眼看就是跳变
// 计算使用量
if(forward_rounds_11 > reverse_rounds_12)
{
fertilize_weight = fertilize_sta * forward_rounds_11 * (204.0 - Ultrasonic_distance) * 10.0;
}
else
{
fertilize_weight = fertilize_sta * reverse_rounds_12 * (204.0 - Ultrasonic_distance) * 10.0;
}
可能原因如下:
-
Ultrasonic_distance是实时传感器值,本身会轻微抖动,差 0.1cm → 整个结果直接跳 1~2 甚至更多 -
变量类型是 int(整数),没有小数缓冲,比如 9.9 → 直接变成 9,10.1 → 直接变成 10,肉眼看就是跳变
-
乘数太大(×10),传感器轻微抖动被放大 10 倍
-
没有做平滑滤波,传感器原始值直接参与计算,必然跳
解决方案 :浮点计算 + 四舍五入
// 在代码文件最顶部,加上头文件
#include <math.h>
// 先算浮点值
float temp_weight;
if(forward_rounds_11 > reverse_rounds_12)
{
temp_weight = fertilize_sta * forward_rounds_11 * (204.0f - Ultrasonic_distance) * 10.0f;
}
else
{
temp_weight = fertilize_sta * reverse_rounds_12 * (204.0f - Ultrasonic_distance) * 10.0f;
}
// 关键:四舍五入,避免 9.999 变成 9,10.001 变成 10
fertilize_weight = round(temp_weight);
浙公网安备 33010602011771号