#include #include typedef struct PID { /*K1=实际放大倍数,T1=实际积分时间,T2=实际微分时 间,T=采样周期*/ double SetPoint; /*定义PID结构体*/ double K1; double T1; double T2; double T; double Err1; /*前一时刻误差,E(K-1)*/ } PID; double PIDCalc( PID *pp, double NextPoint,double Ud1,double Ui1) /*PID计算 */ { double Ti,Td,Kp,Ki,Kd,Ud,Up,Ui,Err; Ti = pp-> T1 + pp-> T2; /*积分时间*/ Td = (pp-> T1 * pp-> T2) / (pp-> T1 + pp-> T2); /*微分时间*/ Kp = pp-> K1 * ((pp-> T1 + pp-> T2) / pp-> T1); /*比例系数*/ Ki =pp-> T / Ti * Kp; /*积分系数*/ Kd = Td / pp-> T * Kp; /*微分系数*/ Err = pp-> SetPoint-NextPoint; /*当前误差*/ Ud = pp->T2/ ((Kd * pp-> T) + pp-> T2) * Ud1+ Kd * (pp-> T2 + pp-> T) / (Kd * pp-> T + pp-> T2) * Err - Kd * pp-> T2 / (Kd * pp-> T + pp-> T2) *pp-> Err1; /*微分 作用*/ Ui = Ui1 + pp-> K1 * (pp-> T / pp-> T1) * Ud; /*积分作用*/ Up = pp-> K1 * Ud; /*比例作用*/ Ud1=Ud; /*UD1=ud(k-1),ui1=ui(k-1) */ Ui1=Ui; return (Ud + Up + Ui); /*y(k)*/ } void PIDInit (PID *pp) { memset ( pp,0,sizeof(PID)); } /*double sensor (void) { return 1.0; }*/ /*输入口*/ void actuator(double rDelta,double LastrDelta ) /*输出口*/ { double n; n=rDelta-LastrDelta; /*y(k)-y(k-1)*/ LastrDelta=rDelta; printf ( "%f\\n ",n); } void main(void) { int j,a[]= {15,14,12.5,10.5,5.5,6.7,9.5,11.3,9.6,10.2,10.035,9.2356,10.2356,9.3654,10.01101 }; PID sPID; double rOut; double LastrOut=0; /*y(k-1)*/ double rIn; double Ud1 = 1; double Ui1 = 1; PIDInit ( &sPID ); /*PID初始化*/ sPID.K1 = 1; sPID.T1 = 1; sPID.T2 = 1; sPID.T = 1; sPID.SetPoint = 10.0; /*设定值*/ sPID.Err1 = 1; for (j=0;j <15;j++) { rIn = a[j]; /*sensor ();*/ /*输入*/ rOut= PIDCalc ( &sPID,rIn,Ud1,Ui1 ); actuator ( rOut, LastrOut ); } }_ 这应该是个仿真程序. sensor原来是个输入函数,后来注释掉了,用数组代替了. actuator输出函数,这里现示跟踪情况. j,是15个点的循环变量. a[j],是个模拟的输入. 语句:return 1.0; 变量:rDelta LastrDelta 语句:n=rDelta-LastrDelta; LastrDelta=rDelta; printf ( "%f\\n ",n);又分别如何解释呢,新手上路,多指教.^_^下载本文