发新帖我要提问
123
返回列表
打印
[其他]

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

[复制链接]
楼主: 356053261
手机看帖
扫描二维码
随时随地手机跟帖
41
robertesth| | 2025-2-5 19:17 | 只看该作者 回帖奖励 |倒序浏览
由于运算速度更快,MCU可以更快完成任务并进入低功耗模式,从而降低整体功耗。

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

评论回复
49
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;
}

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

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

使用特权

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

使用特权

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

使用特权

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

本版积分规则