c语言程序位置式pid算法,增量式与位置式PID算法(C语言实现与电机控制项目)...
4.2核心代碼
/**************************************************************************
函數功能:增量PI控制器
入口參數:編碼器測量值,目標速度
返回??值:電機PWM
根據增量式離散PID公式
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
e(k)代表本次偏差
e(k-1)代表上一次的偏差??以此類推
pwm代表增量輸出
在我們的速度控制閉環系統里面,只使用PI控制
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)
**************************************************************************/
int Incremental_PI (int Encoder,int Target)
{
float Kp=20,Ki=30;
static int Bias,Pwm,Last_bias;? ?? ?? ?//相關內部變量的定義。
Bias=Encoder-Target;? ?? ?? ?? ?? ? //求出速度偏差,由測量值減去目標值。
Pwm+=Kp*(Bias-Last_bias)+Ki*Bias;? ?//使用增量 PI 控制器求出電機 PWM。
Last_bias=Bias;? ?? ?? ?? ?? ?? ?? ???//保存上一次偏差
return Pwm;? ?? ?? ?? ?? ?? ?? ?? ? //增量輸出
}復制代碼
這里可以看到使用的是增量式比例積分控制器,Kp和Ki的值在函數中臨時設置,完全按照公式編寫,簡單易懂。
4.3定時控制
int Target_velocity=50;??//設定速度控制的目標速度為50個脈沖每10ms
int TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001)//10ms定時中斷
{
TIM3->SR&=~(1<<0);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//===清除定時器1中斷標志位
Encoder=Read_Encoder(2);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//===讀取編碼器的值,M法測速,輸出為每10ms的脈沖數
Led_Flash(100);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//===LED閃爍;指示單片機正常運行
Moto1=Incremental_PI(Encoder,Target_velocity);? ?? ?? ???//===速度PI控制器
Xianfu_Pwm();? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//===PWM限幅
Set_Pwm(Moto1);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//===賦值給PWM寄存器
}
return 0;
}復制代碼
這里控制周期設定的是每10ms控制一次,設置在10ms的中斷中進行,得到控制量后,在經過簡單的賦值和去絕對值來輸出給驅動的PWM控制器。
4.4其他代碼
/**************************************************************************
函數功能:賦值給PWM寄存器
入口參數:PWM
返回??值:無
**************************************************************************/
void Set_Pwm(int moto1)
{
if(moto1>0)? ?? ?? ?AIN2=1,? ?? ?? ?AIN1=0;
else? ?? ?? ?? ???AIN2=0,? ?? ?? ???AIN1=1;
PWMA=myabs(moto1);
}
/**************************************************************************
函數功能:限制PWM賦值
入口參數:無
返回??值:無
**************************************************************************/
void Xianfu_Pwm(void)
{
int Amplitude=7100;? ? //===PWM滿幅是7200 限制在7100
if(Moto1
if(Moto1>Amplitude)??Moto1=Amplitude;
}
/**************************************************************************
函數功能:絕對值函數
入口參數:int
返回??值:unsigned int
**************************************************************************/
int myabs(int a)
{
int temp;
if(a<0)??temp=-a;
else temp=a;
return temp;
}復制代碼
主函數
int main(void)
{
Stm32_clock_Init(9);? ?? ?? ?? ?//系統時鐘設置
...
MiniBalance_PWM_Init(7199,0);? ?//=====初始化PWM 10KHZ 高頻可以防止電機低頻時的尖叫聲
Encoder_Init_TIM2();? ?? ?? ?? ?//初始化編碼器
Timer3_Init(99,7199);? ?? ?? ???//=====10MS進一次中斷服務函數,中斷服務函數在control.c
while(1);
}復制代碼
5、電機位置閉環控制位置閉環控制就是根據編碼器的脈沖累加測量電機的位置信息,并與目標值進行比較,得到控制偏差,然后通過對偏差的比例、積分、微分進行控制,使偏差趨向于零的過程。
5.1核心代碼
/**************************************************************************
函數功能:位置式PID控制器
入口參數:編碼器測量位置信息,目標位置
返回??值:電機PWM
根據位置式離散PID公式
pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
e(k)代表本次偏差
e(k-1)代表上一次的偏差
∑e(k)代表e(k)以及之前的偏差的累積和;其中k為1,2,,k;
pwm代表輸出
**************************************************************************/
int Position_PID (int Encoder,int Target)
{
float Position_KP=80,Position_KI=0.1,Position_KD=500;
static float Bias,Pwm,Integral_bias,Last_Bias;
Bias=Encoder-Target;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? //求出速度偏差,由測量值減去目標值。
Integral_bias+=Bias;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//求出偏差的積分
Pwm=Position_KP*Bias+Position_KI*Integral_bias+Position_KD*(Bias-Last_Bias);? ?? ? //位置式PID控制器
Last_Bias=Bias;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//保存上一次偏差
return Pwm;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? //增量輸出
}復制代碼
這里采用稍微復雜一點的PID控制,相比之前的速度控制多了個微分環節,但是由于是位置式控制,所以代碼較為簡單,容易理解。
5.2控制中斷函數
int Target_position=11000;? ? //初始值是10000,目標值是11000
int TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001)//10ms定時中斷
{
TIM3->SR&=~(1<<0);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//===清除定時器1中斷標志位
Encoder=Read_Encoder(2);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? //===讀取編碼器的位置數據 初始值是10000
Led_Flash(100);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? //===LED閃爍;指示單片機正常運行
Moto1=Position_PID(Encoder,Target_position);? ?? ?? ?? ???//===位置PID控制器
Xianfu_Pwm();? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//===PWM限幅
Set_Pwm(Moto1);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//===賦值給PWM寄存器
}
return 0;
}復制代碼
其他代碼和上面類似
6.參數整定
首先我們需要明確我們的控制目標,也就是滿足控制系統的 3 個要求:
穩定性
快速性
準確性
具體的評估指標有最大超調量、上升時間、靜差等。
最大超調量是響應曲線的最大峰值與穩態值的差,是評估系統穩定性的一個重要指標;上升時間是指響應曲線從原始工作狀態出發,第一次到達輸出穩態值所需的時間,是評估系統快速性的一個重要指標;靜差是被控量的穩定值與給定值之差,一般用于衡量系統的準確性,具體可以參考前文的講解。
在實踐生產工程中,不同的控制系統對控制器效果的要求不一樣。比如平衡車、倒立擺對系統的快速性要求很高,響應太慢會導致系統失控。智能家居里面的門窗自動開合系統,對快速性要求就不高,但是對穩定性和準確性的要求就很高,所以需要嚴格控制系統的超調量和靜差。所以 PID 參數在不同的控制系統中是不一樣的。只要我們理解了每個 PID 參數的作用,我們就可以應對工程中的各種項目的 PID 參數整定了。
一般而言,一個控制系統的控制難度,一般取決于系統的轉動慣量和對響應速度的要求等。轉動慣量越小、對響應速度要求越低,PID 參數就越不敏感。比如現在我們控制電機轉 90°,需要嚴格控制超調量、和靜差。但是對響應速度無要求。因為電機處于輕載的情況下,轉動慣量很小,這是一個很容易完成的工作。根據上面的理論分析和實踐,因為響應速度無要求,一般 P 應該給小一點,然后加大系統的阻尼防止超調,也就是 D 參數盡量大,另外因為 P 值較小,應該加入I 控制減小靜差。
7.總結
調試裝置的過程中會遇到各種各樣的問題,硬件隨外界環境會不斷的出現變化,會干擾我們的調試以及運行結果。整定出能適應各種環境的參數,必須對每個環境都加以測試,綜合得出最合適的參數。所以在圖形化的調試整定過程能夠快速直觀的得出結論。
轉自網絡_zero.
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的c语言程序位置式pid算法,增量式与位置式PID算法(C语言实现与电机控制项目)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国内跨度最大、桥面最宽!东莞滨海湾大桥通
- 下一篇: 打印心形c语言,C语言打印心形