023 PID控制器的嵌入式优化:定点数运算
023 PID控制器的嵌入式优化:定点数运算一次让我熬夜到凌晨三点的调试去年做的一个四轴飞行器项目,STM32F405主控,MPU6050姿态传感器。PID控制频率设到1kHz,所有计算都用浮点。飞起来倒是稳,但一开摄像头图传,画面就开始抖——不是机械振动,是控制周期被图传中断抢占了CPU时间。用逻辑分析仪一看,PID计算最差情况跑了将近800微秒,而我的控制周期只有1000微秒。浮点运算单元虽然硬件支持,但频繁的浮点乘法和除法在中断上下文里还是太奢侈了。那天晚上我盯着示波器上的波形,突然意识到:如果能把PID计算全部换成定点数,至少能省下一半时间。说干就干,结果这一改就是通宵——不是算法难,是各种溢出、精度丢失、符号位搞错,差点把四轴飞成了砖头。为什么嵌入式PID必须考虑定点化先别急着喷我“现在MCU都有FPU了”。没错,Cortex-M4/M7确实有硬件浮点,但有几个现实问题:第一,浮点运算在中断里依然比定点慢。同样是乘法,浮点要3-5个时钟周期,定点只要1个。别小看这几个周期,当你的控制频率跑到10kHz甚至更高时,差距就出来了。第二,很多低成本的MCU根本没有FPU。Cortex-M0/M3、国产的GD32F103、ESP32的某些内核,浮点全靠软件模拟,一个浮点乘法能吃掉上百个周期。这种芯片上跑PID,不用定点数就是给自己挖坑。第三,即使有FPU,浮点数的精度问题在PID积分项里也会坑你。浮点数的分辨率是变化的——数值越大,相邻两个可表示数的间隔越大。积分项累加久了,小误差可能根本加不进去,这就是