????????當stm32RCT6使用位置環pid控制麥輪轉動一定路程時,在這個時間段內想讓一邊輪胎速度加大應該怎么做?
????????比如我pid的目標脈沖值為9000,在運行到3000的時候車偏左了,那我應該怎樣讓他回正,我想到的辦法是增加其最大的脈沖值,但在到達目標脈沖值前較多的時間內其速度是pwm波的最大值,所以難以增大速度。還有辦法是在pid函數中將其最大pwm輸出的值限制為9000(滿pwm為10000),當出現左偏的時候,給左輪的pid算完的pwm進行加1000,但實際效果難以看出,現在應該用什么方法。
????????換種思路,用pid速度環控速,陀螺儀偏離后更改速度大小來矯正,在使用pid時會記錄脈沖數,再使用位置環中的脈沖值相加來看圈數或目標位置,到了直接pwm給0讓其停。
????????在使用pwm讓車停止時,pid計算的定時器中pwm會重新賦值,就會造成車在一瞬間停止,過一會又會自動啟動,所以使用pwm讓其停止不可取。
????????則可以直接設置目標速度為零讓其停止:在PID控制系統中,目標速度是關鍵的輸入信號。如果希望車輛停止,最直接的方法就是將目標速度設置為0。
????????現在直接使用設置目標速度為0會停止,但使用判斷目標值是否到達后讓其速度為0,不能停止。
????????在對于目標值的判斷開始放在主函數的while中,但無法實現,可能因為在執行別的代碼
????????然后一位在定時器中斷中的if判斷可以不斷地進行判斷,并且有優先級,但在定時器中的if好像不能成功判斷
????????
最開始時是將其封裝在一個函數中
void PanDuan(int b)
{if(Position_L==b || Position_R==b || Position_HL==b || Position_HR==b){Stop();}
}
void Stop(void)
{MuBiao(0,0,0,0);//給目標值為0,速度將會清0,但會有個過程
}
然后將其放在while中
if(Position_L== Get_MuB() || Position_R== Get_MuB() || Position_HL== Get_MuB() || Position_HR== Get_MuB() ){Stop();}
并且將目標值封裝在一個函數中,保證數值的準確
int Get_MuB(void)
{return MuB;}
然后放在定時器中斷中,但要明白定時器是一段時間進一次,則不一定進的那一次恰好相等,所以寫為
if(Position_L>= Get_MuB() || Position_R>=Get_MuB() || Position_HL>=Get_MuB() || Position_HR>=Get_MuB()){Stop();}
當然在while中或一開始封裝的函數中可以加else來判斷是否成功進入if,但定時器中不行,會一直中斷發數據,會使程序卡死。
else
{Serial_SendByte(1);}
?結語
還在學習中,如有錯誤還請大佬們指出,有問題可相互交流