20.4-使用兩個通道進行PID電磁循跡
面我們沒有使用PID完成了循跡
循跡部分代碼如下、我們是利用計算的差比和值 根據差比和大小和正負數控制電機,那么我們用PID循跡也是利用這個值,非PID循跡中我們目標是讓g_fVoltageOuter 值等于零 ,所以我們每當 g_fVoltageOuter 大于0.5或者小于-0.5時候電機就會發生反應,想做或者右邊運動,
PID中也是我們的
目標: 讓g_fVoltageOuter變量等于零
輸入: 當前g_fVoltageOuter 值
輸出: 兩個輪子的要控制速度 這里輸出一個差速值,兩個電機一個加 另一個電機減 這個差速值 就可以控制電機趨向 正確方向運動。
先按照筆記講解說明,然后按照講解已經改好的代碼,然后教一下如何改代碼。比較難理解,大家結合之前篇章多理解學習。
復制一下20.3 的代碼 然后再這基礎修改。
定義保存PID計算結果的變量
float g_fVoltagePidOut;//電磁循跡PID計算輸出
定義一個用于電磁循跡PID參數的結構體
tPid pidVoltage;//電磁循跡PID代碼
然后初始化一下PID的參數,給PID參數賦值。這里說一下如何計算PID參數
首先我們先看P I D 的計算函數,這個是我們在電機控制時候寫的
我們做電磁循跡 ,循跡不需要關歷史累計誤差結果,所以我們只用 P D 參數 I=0可以
然后我們做一個假設,假設兩次程序第一次g_fVoltageOuter 值是0 、第二次g_fVoltageOuter 是0.5 并且我們知道我們的目標值是零。
然后分析先定P -3 、D 比P 小很多定 -1 。后面我們在調整。
所以我們的PID初始化先這么寫
pidVoltage.actual_val=0.0;
pidVoltage.target_val=0.00;//電磁循跡PID 的目標值為0
pidVoltage.err=0.0;
pidVoltage.err_last=0.0;
pidVoltage.err_sum=0.0;
pidVoltage.Kp=-3.00;
pidVoltage.Ki=0;
pidVoltage.Kd=-1.00;
聲明一下變量
extern tPid pidVoltage;//電磁循跡PID代碼
編寫PID控制部分代碼
PID輸出控制部分代碼
g_fVoltagePidOut = PID_realize(&pidVoltage,g_fVoltageOuter);//PID計算輸出偏差目標速度 這個速度,會和基礎速度加減
?
g_fHW_PID_Out1 = 1 + g_fVoltagePidOut;//電機1速度=基礎速度+電磁PID輸出速度
g_fHW_PID_Out2 = 1 - g_fVoltagePidOut;//電機1速度=基礎速度-電磁PID輸出速度
if(g_fHW_PID_Out1 >5) g_fHW_PID_Out1 =5;//進行限幅 限幅速度在0-5之間
if(g_fHW_PID_Out1 < 0) g_fHW_PID_Out1 =0;
if(g_fHW_PID_Out2 >5) g_fHW_PID_Out2 =5;//進行限幅 限幅速度在0-5之間
if(g_fHW_PID_Out2 < 0) g_fHW_PID_Out2 =0;
motorPidSetSpeed(g_fHW_PID_Out1,g_fHW_PID_Out2);//通過計算的速度控制電機
搖擺十分嚴重 我們把PD 縮小一些,然后提高基礎速度到1.5
PID參數調整如下
pidVoltage.actual_val=0.0;
pidVoltage.target_val=0.00;//電磁循跡PID 的目標值為0
pidVoltage.err=0.0;
pidVoltage.err_last=0.0;
pidVoltage.err_sum=0.0;
pidVoltage.Kp=-1.0; //電磁循跡P參數
pidVoltage.Ki=0;
pidVoltage.Kd=-0.2;//電磁D參數
如果更改了電感,電感的最大電壓值可能會變化,需要修改
這個變量
float g_fVoltageMax[4]={2.89,2.89,2.89,2.89};//用于歸一化的最大ADC電壓采集值 不同賽道要獲得更好循跡效果 需要重新采集這個值
審核編輯 黃宇
-
電磁
+關注
關注
15文章
1133瀏覽量
51794 -
智能車
+關注
關注
21文章
403瀏覽量
76952 -
循跡
+關注
關注
0文章
14瀏覽量
13063
發布評論請先 登錄
相關推薦
評論