这 是 一 个 PID 算 法 的 C 语 言 实 现 程 序 :
"double sensor (void),void actuator(double rDelta,double LastrDelta )各函数的功能及
语句的作用, 以及主函数里的变量 j 和数值 a[]的设置的作用,以及 for 循环语句的作用, "望大家再分享的
同时,给份详细注释,在线等待,大家帮助大家,^_^.
#include <string.h>
#include <stdio.h>
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)*/
}