打印
[其他]

使用整数来计算PID,以提高MCU效率及减少生成的代码量

[复制链接]
楼主: 356053261
手机看帖
扫描二维码
随时随地手机跟帖
41
lzmm| | 2025-2-5 17:35 | 只看该作者 回帖奖励 |倒序浏览
在进行整数运算时,需要注意检查是否会发生溢出。可以在关键的计算步骤中添加溢出检查代码

使用特权

评论回复
42
robertesth| | 2025-2-5 19:17 | 只看该作者
由于运算速度更快,MCU可以更快完成任务并进入低功耗模式,从而降低整体功耗。

使用特权

评论回复
43
pl202| | 2025-2-5 19:51 | 只看该作者
整数运算的代码通常更紧凑,占用的闪存空间更少。

使用特权

评论回复
44
geraldbetty| | 2025-2-5 22:29 | 只看该作者
整数运算所需的指令较少,生成的代码量更小。

使用特权

评论回复
45
jdqdan| | 2025-2-6 04:31 | 只看该作者
处理速度差别大吗?效果如何?

使用特权

评论回复
46
lzmm| | 2025-2-6 10:41 | 只看该作者
整数PID控制器的调试和参数调整可能比浮点版本更复杂,需要仔细测试和验证。

使用特权

评论回复
47
alvpeg| | 2025-2-6 12:38 | 只看该作者
整数运算通常比浮点运算更快,尤其在没有硬件浮点单元的MCU上。

使用特权

评论回复
48
vivilyly| | 2025-2-6 14:15 | 只看该作者
对于比例、积分、微分系数以及误差等变量,根据实际需求和精度要求选择适当的整数类型,如short、int等。一般来说,如果系统对精度要求不是特别高,使用short类型可以在保证一定计算精度的同时,减少代码量和内存占用。例如在一个简单的温度控制系统中,使用short类型可能已经足够。

使用特权

评论回复
49
everyrobin| | 2025-2-6 14:51 | 只看该作者
选择合适的整数类型(如int8_t, int16_t, int32_t)来平衡精度和资源使用。

使用特权

评论回复
50
mmbs| | 2025-2-6 16:18 | 只看该作者
typedef struct {
    int16_t Kp;       // 比例增益
    int16_t Ki;       // 积分增益
    int16_t Kd;       // 微分增益
    int16_t integral; // 积分累加
    int16_t last_error; // 上一次误差
    int16_t output_max; // 输出最大值
    int16_t output_min; // 输出最小值
} PIDController;

int16_t PID_Compute(PIDController *pid, int16_t setpoint, int16_t measured_value) {
    int16_t error = setpoint - measured_value; // 误差计算
    int16_t proportional = pid->Kp * error;    // 比例项

    // 积分项(防止积分饱和)
    pid->integral += pid->Ki * error;
    if (pid->integral > pid->output_max) {
        pid->integral = pid->output_max;
    } else if (pid->integral < pid->output_min) {
        pid->integral = pid->output_min;
    }

    // 微分项
    int16_t derivative = pid->Kd * (error - pid->last_error);

    // 计算输出
    int16_t output = proportional + pid->integral + derivative;

    // 输出限制
    if (output > pid->output_max) {
        output = pid->output_max;
    } else if (output < pid->output_min) {
        output = pid->output_min;
    }

    // 更新上一次误差
    pid->last_error = error;

    return output;
}

使用特权

评论回复
51
mnynt121| | 2025-2-6 16:39 | 只看该作者
在整数计算中,将所有的变量和系数都转换为整数形式,避免了浮点数运算带来的性能开销。同时,积分项的计算采用累加的方式,微分项的计算采用差值的方式。

使用特权

评论回复
52
febgxu| | 2025-2-6 19:39 | 只看该作者
使用整数来计算PID可以显著提高MCU的效率并减少生成的代码量。

使用特权

评论回复
53
sdCAD| | 2025-2-6 19:58 | 只看该作者
在进行整数运算时,要注意防止溢出。可以通过限制积分项的范围或使用更大位宽的整数类型来避免。

使用特权

评论回复
54
天天向善| | 2025-2-6 23:02 | 只看该作者
如果我们用整数来计算,会不会降低它的准确性?

使用特权

评论回复
55
356053261|  楼主 | 2025-2-7 14:25 | 只看该作者
天天向善 发表于 2025-2-6 23:02
如果我们用整数来计算,会不会降低它的准确性?

如果用16位变量,分辨率是1/32768,精度已经足够高了

使用特权

评论回复
56
Pretext| | 2025-2-8 10:58 | 只看该作者
事实上,算法也可以用来避免强制乘法和除法运算,

使用特权

评论回复
57
理想阳| | 2025-2-8 22:06 | 只看该作者
用整数计算pid来提高mcu效率,减少生成代码量,需要综合考虑。

使用特权

评论回复
58
星闪动力| | 2025-2-9 16:07 | 只看该作者
整数运算需要的指令更少,生成的代码也更少。

使用特权

评论回复
59
dreamCar| | 2025-2-10 20:24 | 只看该作者
为了提高MCU效率和减少代码量,建议采用固定点数形式的PID计算而非浮点数。采用整数运算可降低内存消耗并提升处理速度。

使用特权

评论回复
60
356053261|  楼主 | 2025-2-12 15:36 | 只看该作者
Pretext 发表于 2025-2-8 10:58
事实上,算法也可以用来避免强制乘法和除法运算,

32位MCU都有单周期硬件乘法器了,不需要考虑乘法的效率问题,针对没有硬件除法器的M0系列MCU, 除法则需要考虑,如果需要提高MCU效率可适当使用乘法和移位来代替除法计算,比如 1000 / 50,可改为1000 * (uint16_t)(65536/50) / 65536, 使用单周期乘法和移位计算来代替强制除法,能减少代码量以提高MCU效率

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则