第九章-PID整定方法
9.1-調整合適的采樣周期和PID調參方法
正如之前所說,現(xiàn)在我們PID控制函數(shù)是在主函數(shù)中循環(huán)調用,這樣的調用方式并不能保證實時性,不能保證周期得到調用
所以我們要把PID控制函數(shù)放到中斷里面定時執(zhí)行,那么如何放到中斷里面執(zhí)行,執(zhí)行的周期是多少合適那?
if(TimerCount %10 ==0)//每20ms一次
{
Motor_Set(PID_realize(&pidMotor1Speed,Motor1Speed),0);
TimerCount=0;
}
}
燒錄測試一下,是否可以改變波形和調整參數(shù)
借助上位機調節(jié)PID
- 調節(jié)P 把I=0、D=0先給正值或負值值測試P 正負、然后根據(jù)PID函數(shù)輸入和輸出估算P 大小,然后I=0 D=0去測試,調節(jié)一個較大值
- 調節(jié)I 把P等于前面的值 然后測試I給較大正值和負值 測試出I正負,然后I從小值調節(jié),直到?jīng)]有偏差存在
- 一般系統(tǒng)不使用D
然后當前系統(tǒng)特點 :I 對于系統(tǒng)更重要
下面我們調節(jié)I
給一個較小的i 發(fā)現(xiàn) 有一個大的超調,我們就減少p 、減小一半p
下面是減少一半p 的效果
這個效果還可以
整理雙電機速度控制
首先我們的需要是控制兩個電機,那么這兩個電機的特點不同,他們的P I D 參數(shù)不同,要控制不同的目標速度,那么他們的目標值、實際值、偏差等都會不同,所以我們的PID函數(shù)就要能夠根據(jù)輸入?yún)?shù)控制電機
我們增加tPid 類型函數(shù)的定義用于控制電機
tPid pid1_speed;//電機1的轉速控制
tPid pid2_speed;//電機2的轉速控制
//初始化PID參數(shù)
void PID_init()
{
pid1_speed.actual_val=0.0;//初始化電機1轉速PID 結構體
pid1_speed.target_val=0.0;
pid1_speed.err=0.0;
pid1_speed.err_last=0.0;
pid1_speed.err_sum=0.0;
pid1_speed.Kp=0.0;
pid1_speed.Ki=0.0;
pid1_speed.Kd=0.0;
pid2_speed.actual_val=0.0;//初始化電機2轉速PID 結構體
pid2_speed.target_val=0.0;
pid2_speed.err=0.0;
pid2_speed.err_last=0.0;
pid2_speed.err_sum=0.0;
pid2_speed.Kp=0.0;
pid2_speed.Ki=0.0;
pid2_speed.Kd=0.0;
}
更改一下PID函數(shù),這里我們使用結構體作為函數(shù)地址
訪問因為是地址,訪問結構體變量要用->
float PID_realize(tPid * pid,float actual_val)
{
pid->actual_val = actual_val;//傳遞真實值
pid->err = pid->target_val - pid->actual_val;//目標值減去實際值等于誤差值
pid->err_sum += pid->err;//誤差累計求和
//使用PID控制
pid->actual_val = pid->Kp*pid->err + pid->Ki*pid->err_sum + pid->Kd*(pid->err - pid->err_last);
//保存上次誤差:最近一次 賦值給上次
pid->err_last = pid->err;
return pid->actual_val;
}
更改主函數(shù),對PID函數(shù)的使用
然后可以分別調節(jié)電機1的參數(shù)和電機二的參數(shù)
把測試好的PID 參數(shù)分別寫在PID_init里面
以上是入門篇
通過上面的學習與實操,大家對:PWM、電機驅動、PID閉環(huán)控制、串口通信等有了一定掌握,如果上面那個章節(jié)掌握不好,一定要多看兩遍視頻,多敲邊代碼,還有疑惑可以百度查找或者留言問題。
后面的內容就是偏應用比較簡單了。
這樣咱們第九章就結束了,PID就完成了,后面的章節(jié)利用PID做小車控制。
聯(lián)系:Q,1930299709