**(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"
typedef struct PID{
double SetPoint;
double Kp;
double Ki;
double Kd;
double LastError;
double PrevError;
double SumError;
}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
);
}
void PIDInit (PID *pp)
{
memset(pp, 0, sizeof(PID));
}
double sensor(void)
{
double shuru;
scanf("%lf", &shuru);
return shuru;
}
void actuator(double rDelta)
{
printf("%lf\n", rDelta);
}
int main()
{
PID sPID;
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);
actuator(rOut);
}
}
#define __StandardPID_H
double PIDCalc(PID *pp, double NextPoint);
void PIDInit (PID *pp);
double sensor(void);
void actuator(double rDelta);
#endif