『壹』 怎麼做PLC PID程序
PID指令不需要自己寫,不管是那家公司的PLC(不包括OMRON的小PLC)都有PID專用指令或者向導模塊來建立PID功能,你只需要搞懂就可以了
『貳』 求教:舵機如何通過程序減速舵機的轉速太快,如何通過程序給減速。
PWM就不用說了。我給你一段PID的代碼:
#define AA_KPVALUE 150 #define AA_KIVALUE 100 #define AA_KDVALUE 30
typedef struct PID { sint an_Ref; //角度PID,角度設定值 sint an_FeedBack; //角度PID,角度反饋值 sint an_PreError; //角度PID,前一次,角度誤差,,an_Ref - an_FeedBack sint an_PreDerror; //角度PID,前一次,角度誤差之差,d_error-PreDerror; sint an_Kp; //角度PID,Ka = Kp sint an_Ki; //角度PID,Kb = Kp * ( T / Ti ) sint an_Kd; //角度PID, sint an_PreU; //舵機控制輸出值}PID;
PID sPID;//申請一個PID類型的變數
void PIDInit(void)//PID初始化 { sPID.an_Ref = 0 ; sPID.an_FeedBack = 0 ; sPID.an_PreError = 0 ; sPID.an_PreDerror = 0 ; sPID.an_Kp = AA_KPVALUE; sPID.an_Ki = AA_KIVALUE; sPID.an_Kd = AA_KDVALUE; sPID.an_PreU = 0 ; }
unsigned int PIDCalc( PID *pp )//返回值賦給舵機 { sint error,d_error,dd_error; error = pp->an_Ref - pp->an_FeedBack; d_error = error - pp->an_PreError; dd_error = d_error - pp->an_PreDerror; pp->an_PreError = error; pp->an_PreDerror = d_error; pp->an_PreU +=pp->an_Kp*error+pp->an_Ki*d_error+pp->an_Kd*dd_error ; return ( pp->an_PreU ); }在主函數中初始化PID,將設定值與返回值設置好後,調用unsigned int PIDCalc( PID *pp )把返回值給舵機。
設定值就是你想要讓舵機轉的角度賦給sPID.an_Ref,返回值就是舵機現在的角度。因為是一個閉環控制系統,需要將角度量化以後的值返回,賦給sPID.an_FeedBack,這個演算法會根據設定值與現在所處的角度計算出下一次所偏轉的角度,這是一種增量式數字PID的演算法。若想修改轉的速度就修改宏定義中這三個參數的值,其中AA_KPVALUE影響最大。PID的東西很多,我也只是初窺門徑。希望對你有所幫助
『叄』 pid控制的C語言編程
#include<unistd.h>
#include<stdio.h>
int main(int argc,int **argv)
{
int pid=fork();
if(pid==-1)
{
printf("error");
}
else if(pid==0)
{
printf("This is the child process!\n");
}
else
{
printf("This is the parent process! child process id=%d\n",pid);
}
return 0;
}
首先為什麼這段代碼gcc編譯不了,只能用g++編譯,gcc編譯顯示結果如下
Undefined first referenced
symbol in file
__gxx_personality_v0 /var/tmp//ccuHN8IS.o
ld: fatal: Symbol referencing errors. No output written to t5
collect2: ld returned 1 exit status
其次,g++編譯後運行結果如下
This is the parent process! child process id=27406
This is the child process!
『肆』 pid控制演算法的DSP程序設計與實現
typedef struct PID {
int SetPoint; // 設定目標 Desired value
int Proportion; // 比例常數 Proportional Const
int Integral; // 積分常數 Integral Const
int Derivative; // 微分常數 Derivative Const
unsigned int LastError; // Error[-1]
unsigned int PrevError; // Error[-2]
unsigned int SumError; // Sums of Errors
// double Lastout; //上次輸出
unsigned int E1; // e1>e2
unsigned int E2; //
int Pmax;//上限
int Pmin;//下限
} PID;
/*====================================================================================================
PID計算部分,遇限消弱積分PID防飽和,積分分離演算法實現
=====================================================================================================*/
int PIDCalc( PID *pp, unsigned int NextPoint )
{
int dError,
Error;
Error = pp->SetPoint - NextPoint; //偏差
if (Error<=-pp->E1) return (pp->Pmin); //飽和
else if (Error>=pp->E1)
return (pp->Pmax);
else
{
dError = pp->LastError - pp->PrevError; // 當前微分
pp->PrevError = pp->LastError;
pp->LastError = Error;
if (Error>=pp->E2||Error<=-pp->E2) //分離
return (pp->Proportion * Error // 比例項
+ pp->Derivative * dError );//PD,考慮限幅
else //位置式
{
pp->SumError += Error; // 積分
return (pp->Proportion * Error // 比例項
+ pp->Integral * pp->SumError // 積分項
+ pp->Derivative * dError // 微分項 //PID
);
}
}
}