lzmm 发表于 2025-2-5 17:35

在进行整数运算时,需要注意检查是否会发生溢出。可以在关键的计算步骤中添加溢出检查代码

robertesth 发表于 2025-2-5 19:17

由于运算速度更快,MCU可以更快完成任务并进入低功耗模式,从而降低整体功耗。

pl202 发表于 2025-2-5 19:51

整数运算的代码通常更紧凑,占用的闪存空间更少。

geraldbetty 发表于 2025-2-5 22:29

整数运算所需的指令较少,生成的代码量更小。

jdqdan 发表于 2025-2-6 04:31

处理速度差别大吗?效果如何?

lzmm 发表于 2025-2-6 10:41

整数PID控制器的调试和参数调整可能比浮点版本更复杂,需要仔细测试和验证。

alvpeg 发表于 2025-2-6 12:38

整数运算通常比浮点运算更快,尤其在没有硬件浮点单元的MCU上。

vivilyly 发表于 2025-2-6 14:15

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

everyrobin 发表于 2025-2-6 14:51

选择合适的整数类型(如int8_t, int16_t, int32_t)来平衡精度和资源使用。

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;
}

mnynt121 发表于 2025-2-6 16:39

在整数计算中,将所有的变量和系数都转换为整数形式,避免了浮点数运算带来的性能开销。同时,积分项的计算采用累加的方式,微分项的计算采用差值的方式。

febgxu 发表于 2025-2-6 19:39

使用整数来计算PID可以显著提高MCU的效率并减少生成的代码量。

sdCAD 发表于 2025-2-6 19:58

在进行整数运算时,要注意防止溢出。可以通过限制积分项的范围或使用更大位宽的整数类型来避免。

天天向善 发表于 2025-2-6 23:02

如果我们用整数来计算,会不会降低它的准确性?

356053261 发表于 2025-2-7 14:25

天天向善 发表于 2025-2-6 23:02
如果我们用整数来计算,会不会降低它的准确性?

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

Pretext 发表于 2025-2-8 10:58

事实上,算法也可以用来避免强制乘法和除法运算,

理想阳 发表于 2025-2-8 22:06

用整数计算pid来提高mcu效率,减少生成代码量,需要综合考虑。

星闪动力 发表于 2025-2-9 16:07

整数运算需要的指令更少,生成的代码也更少。

dreamCar 发表于 2025-2-10 20:24

为了提高MCU效率和减少代码量,建议采用固定点数形式的PID计算而非浮点数。采用整数运算可降低内存消耗并提升处理速度。

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效率
页: 1 2 [3] 4 5
查看完整版本: 使用整数来计算PID,以提高MCU效率及减少生成的代码量