最近寫個小程序用到了pid算法,發現用單片機盲調pid參數很難找到合適點,
所以用軟件模擬pid,把采集和設置的參數范圍確定,用軟件模擬,可以很清晰的看到計算過程,及時發現震蕩,縮小收斂次數。最終效果還不錯。
網上也有一些成品軟件,我還是習慣看輸出數據,更精確些,也可以自己定義輸入參數范圍,更靈活些。
無法收斂.jpg (207.32 KB, 下載次數: 71)
下載附件
2022-4-7 12:23 上傳
震蕩.jpg (187.51 KB, 下載次數: 54)
下載附件
2022-4-7 12:23 上傳
359次.jpg (186.33 KB, 下載次數: 64)
下載附件
2022-4-7 12:23 上傳
Image 1.jpg (169.61 KB, 下載次數: 60)
下載附件
2022-4-7 12:23 上傳
源程序如下:
- //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);
復制代碼
|