// 定义PID结构体
typedef struct {
float SetPoint; // 设定目标值
float Proportion; // 比例系数 Kp
float Integral; // 积分系数 Ki
float Derivative; // 微分系数 Kd
float LastError; // 上一次的误差
float PrevError; // 上上次误差
float SumError; // 误差和
} PID;
// 初始化PID控制器
void PID_Init(PID *pid) {
pid->SetPoint = 0.0;
pid->Proportion = 0.0;
pid->Integral = 0.0;
pid->Derivative = 0.0;
pid->LastError = 0.0;
pid->PrevError = 0.0;
pid->SumError = 0.0;
}
// 计算PID输出
float PID_Calculate(PID *pid, float NextPoint) {
float error, output;
error = pid->SetPoint - NextPoint; // 偏差
pid->SumError += error; // 积分
output = pid->Proportion * error +
pid->Integral * pid->SumError +
pid->Derivative * (error - pid->LastError);
pid->LastError = error; // 保存上一次的误差,用于下次计算
return output;
}
// 主程序
void main() {
PID pid;
float currentPoint;
float output;
// 初始化PID参数
PID_Init(&pid);
pid.SetPoint = 100.0; // 设定目标值
pid.Proportion = 1.0; // 比例系数
pid.Integral = 0.1; // 积分系数
pid.Derivative = 0.01; // 微分系数
while(1) {
// 获取当前系统输出值
currentPoint = GetSystemOutput();
// 计算PID输出
output = PID_Calculate(&pid, currentPoint);
// 应用PID输出
SetSystemInput(output);
// 延时,控制采样周期
DelaySomeTime();
}
}
|