最近写个小程序用到了pid算法,发现用单片机盲调pid参数很难找到合适点,
所以用软件模拟pid,把采集和设置的参数范围确定,用软件模拟,可以很清晰的看到计算过程,及时发现震荡,缩小收敛次数。最终效果还不错。
网上也有一些成品软件,我还是习惯看输出数据,更精确些,也可以自己定义输入参数范围,更灵活些。
源程序如下:
- //pid模拟
- import console;
- import math;
- var pid={
- set=0;
- get=0;
- err=0;
- err_next=0;
- err_last=0;
- kp=0.0;
- ki=0.28;
- kd=0.25;
- }
- calcpid=function(set,get){
- var inc;
- pid.set=set;
- pid.get=get;
- pid.err=pid.set-pid.get;
- inc=pid.kp*(pid.err-pid.err_next)+pid.ki*pid.err + pid.kd*(pid.err - 2 * pid.err_next + pid.err_last);
- pid.err_last=pid.err_next;
- pid.err_next=pid.err;
- return inc;
- }
- //测试
- var x=4096;//初始状态
- var t=0;
- for(i=1;1000;1){
- t=calcpid(2048,x); //调整到目标值
- console.log(x)
- x=x+t;
- if(math.abs(x-2048)<0.0000000001){
- console.log(i);
- break;
- }
- }
- console.pause(true);
复制代码
|