登录站点

用户名

密码

PID代码及注释

已有 45 次阅读  2018-06-01 10:55   标签PID代码及注释 
/****************************所谓PID即为P(比例)+I(积分)+D(微分**************************/ **(1)P控制(比例控制): e(t) = SP - y(t); SP--设定值 e(t)--误差值(设定的值和当前的误差) y(t)--反馈值(当前值) **适用于滞后性不大的系统 u(t) = e(t) * P; u(t)--输出值(需要输出的) P--比例系数 ** **(2)PI控制(比例+积分): u(t) = Kp*e(t) + Ki∑e(t) + u0 **可使系统进入稳态无稳态误差u(t)--输出 Kp--比例放大系数 ki--积分放大系数 e(t)--误差 u0--控制量基准值(基础偏差) ** **(3)PD控制(微分控制): **微分项解决响应速度问题 积分项解决稳定性 **(4)PID控制(比例积分微分控制): **微分项解决响应速度问题 u(t) = Kp*e(t) + Ki∑e(t)+ Kd[e(t) – e(t-1)] + u0 **采样周期(即反馈值的采样周期) **控制周期(就是每隔多长时间进行一次PID运算,并将结果输出) ****************************小结:P(比例)--即时性 I(积分)--响应速度 D(微分)--稳定性************************************ */ #include<stdio.h> #include<string.h> #include"StandardPID.h" //#include<stdib.h> //对变量的声明 typedef struct PID{ double SetPoint; //设定值 double Kp; //比例系数 double Ki; //积分系数 double Kd; //微分系数 double LastError; //最后一次误差数Er[-1] double PrevError; //最后第二次误差数er[-2] double SumError; //误差积分 }PID; /* **PID计算部分 */ double PIDCalc(PID *pp, double NextPoint) { double dError, //当前微分 Error; //偏差 Error = pp->SetPoint - NextPoint; //偏差值=设定值-输入值(当前值) pp->SumError += Error; //积分=积分+偏差 --偏差的累加 dError = pp->LastError - pp->PrevError; //当前微分 = 最后误差 - 之前误差 pp->PrevError = pp->LastError; //更新“之前误差” pp->LastError = Error; //更新“最后误差” return (pp->Kp * Error //比例项 = 比例常数 * 偏差 + pp->Ki * pp->SumError //积分项 = 积分常数 * 误差积分 + pp->Kd * dError //微分项 = 微分常数 * 当前微分 ); } //为PID变量申请内存,范围指向pp的指针 void PIDInit (PID *pp) { //memset是计算机中C / C++语言函数。将s所指向的某一块内存中的前n个 memset(pp, 0, sizeof(PID)); //字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定, } //这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针。 double sensor(void) //输入 { double shuru; scanf("%lf", &shuru); return shuru; } void actuator(double rDelta) //输出 { printf("%lf\n", rDelta); } int main() { PID sPID; //PID结构体 double rOut; //输出变量 double rIn; //输入变量 PIDInit(&sPID); //初始化结构体 sPID.Kp = 0.5; sPID.Ki = 0.5; sPID.Kd = 0.5; sPID.SetPoint = 100.0; for (;;){ rIn = sensor(); //取输入值 rOut = PIDCalc(&sPID, rIn); //PID运算 actuator(rOut); //输出 } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
#define __StandardPID_H double PIDCalc(PID *pp, double NextPoint); void PIDInit (PID *pp); double sensor(void); void actuator(double rDelta); #endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
分享 举报