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效率