《pid算法c语言实现》由会员分享,可在线阅读,更多相关《pid算法c语言实现(3页珍藏版)》请在金锄头文库上搜索。
1、这是一个 PID 算法的 C 语言实现程序: “double sensor (void),void actuator(double rDelta,double LastrDelta )各函数的功能及语句的作用, 以及主函数里的变量 j 和数值 a的设置的作用,以及 for 循环语句的作用, “望大家再分享的同时,给份详细注释,在线等待,大家帮助大家,_. #include #include typedef struct PID /*K1=实际放大倍数,T1=实际积分时间,T2=实际微分时 间,T=采样周期*/ double SetPoint; /*定义 PID 结构体*/ double K1;
2、 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) /
3、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 /
4、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-La
5、strDelta; /*y(k)-y(k-1)*/ LastrDelta=rDelta; printf ( “%fn “,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 ( /*PID 初始化*/ sPID.K1 =
6、 1; sPID.T1 = 1; sPID.T2 = 1; sPID.T = 1; sPID.SetPoint = 10.0; /*设定值*/ sPID.Err1 = 1; for (j=0;j 15;j+) rIn = aj; /*sensor ();*/ /*输入*/ rOut= PIDCalc ( actuator ( rOut, LastrOut ); 这应该是个仿真程序. sensor 原来是个输入函数,后来注释掉了,用数组代替了. actuator 输出函数,这里现示跟踪情况. j,是 15 个点的循环变量. aj,是个模拟的输入.语句:return 1.0; 变量:rDelta LastrDelta 语句:n=rDelta-LastrDelta; LastrDelta=rDelta; printf ( “%fn “,n);又分别如何解释呢,新手上路,多指教._