最近在做一个恒定气压(负压)控制的PID算法,真空泵会持续的从气缸中吸气,气缸连接有一个气压传感器和两个进气口A和B。其中A进气口连接了一个流量比例阀控制补气量,B进气口会有打开和关闭两种状态。要求当B进气口关闭后通过控制A进气口的补气量维持气压传感器值恒定。普通的单级PID算法实际控制效果差强人意,给大家看看打印csv文件的波形图:
交代一下传感器的输出为模拟电压,负压越强电压越低。可以看到过冲很严重,在反复调校PID参数后无果,增大微分可以有效减小过冲但是却增加了系统不稳定性,有些目标AD值会出现震荡的情况:
过冲还是可以勉强接受的但是振荡就零容忍,所以事情似乎就陷入僵局。单靠调整PID参数已经无法满足要求了。受四轴飞行器控制高度算法的启发我想引入串级PID控制算法,通过第一级PID输出目标微分值(传感器值变化率),当前值,目标值,输出值之间的关系为:
①当前值离目标值远则输出值大;
②当前值接近目标值则输出值小;
③当前值高于目标值则输出值负;
④当前值低于目标值则输出值正;
当前值为传感器值,目标值为设定目标值,输出值为输出目标微分值。
第二级PID将第一级PID的输出目标微分值作为目标值,控制输出使当前微分值跟随目标微分值变化。
总结下来控制策略就是:当前值离目标值远则让其快速接近目标值,当当前值接近目标值后则慢速接近目标值防止发生过冲。经过一通操作下来发现这不就是把PID算法去掉'I'并把位置PID改成增量的形式(输出 += 比例 + 微分)吗,还要啥串级PID?要啥自行车?经过我的魔改之后发现确实也可以实现恒定气压控制,只是多数档位都会发生振荡只有最高档可以实现比较好的控制效果:
从波形上来看微分太弱了基本看不到起伏,几乎没有发挥什么作用,所以接下来应该是加强微分...
|