非线性系统怎么闭环?前馈查表 + PI 反馈 + 死区,三步组合

发布时间:2026/7/17 8:38:12
非线性系统怎么闭环?前馈查表 + PI 反馈 + 死区,三步组合 一句话: 纯反馈控制非线性系统收敛太慢——增益会随工作点变化。加一个离线标定的前馈查表先查表得到近似的初始输出跳到目标附近PI 再做小范围精调。收敛时间从秒级降到毫秒级。适合谁读适合嵌入式开发者、单片机初学者及遇到类似问题的工程师问题非线性系统的反馈控制很慢一个系统的输入和输出不是线性的——比如电流转光功率低电流时转换效率高高电流时增益饱和。纯 PI 反馈的困境低功率区 PI 增益刚好高功率区变得太软放大不够。重新调参只解决一端的矛盾——另一端还是不对。三步组合方案第一步离线标定建一张对照表在实验室测 20 个点记录输入值→输出值输入: 0 50 100 150 200 ... (mA) 输出: 0 0.8 1.5 2.1 2.5 ... (mW)这张表体现的就是非线性关系。存在代码里的const数组。第二步前馈查表跳到目标附近给定目标功率 1.8mW查表插值得到大概需要的电流float Lookup_InputForOutput(float fTargetOutput) { // 二分查表 线性插值 // 返回近似的输入值 return fApproxInput; } // 先前馈 fCurrent Lookup_InputForOutput(fTargetPower); DAC_Write(fCurrent);这一步把系统从0拉到离目标很近的地方。第三步静默等稳定Delay_Us(5000); // 等物理系统稳定不是猜它该稳了吧——是给硬件响应时间。电流设完后光功率需要几个毫秒到达稳态。第四步PI 精调 死区float PI_Control(float fTarget, float fActual) { fError fTarget - fActual; // 死区误差太小不调 if (fabs(fError) DEAD_ZONE) return 0; // PI 计算 fP KP * fError; fI KI * fError; // 抗积分饱和 if (fI MAX_I) fI MAX_I; if (fI MIN_I) fI MIN_I; return fP fI; }前馈已经把系统拉到目标附近了PI 只需要在很小的范围内精调。KP 和 KI 可以设得比较保守——前馈承担了主要的搬运动作。目标变了怎么办如果运行中目标功率变了重新查表if (fTargetChanged) { fCurrent Lookup_InputForOutput(fNewTarget); // 重新前馈 DAC_Write(fCurrent); Delay_Us(5000); ResetIntegral(); // 积分归零从新起点开始 }这套方案的适用场景场景是否适用输出-输入非线性适用——查表解决非线性热惯性大的慢系统适用——前馈跳到附近PI 小范围调纯线性系统不需要查表直接 PI 就行快速响应系统1ms静默期太长要缩短总结组件做什么查表前馈跳到目标附近解决非线性静默期等物理系统稳定PI 反馈小范围精调死区目标附近不微调积分归零目标变了从新起点算组合控制的核心思想能用物理知识查表解决的问题不要全甩给数学PID。前馈负责搬大段反馈负责精修。有用的话点个收藏下次调试直接用。有问题欢迎评论区交流看到了都会回。下一篇用分和元讲透附代码——NTC测温、SPI通信、I2C从机、定点数运算——外设驱动从入门到精通