#include ""
// 定义PID参数
#define Kp 0.5f
#define Ki 0.2f
#define Kd 0.1f
// 定义采样时间
#define SampleTime 0.01f
// 定义PID结构体
typedef struct {
float SetPoint;
float Input;
float Output;
float Integral;
float Derivative;
float LastError;
float Kp;
float Ki;
float Kd;
float SampleTime;
} PID_TypeDef;
// 初始化PID结构体
void PID_Init(PID_TypeDef *pid, float kp, float ki, float kd, float sampleTime) {
pid->SetPoint = 0.0f;
pid->Input = 0.0f;
pid->Output = 0.0f;
pid->Integral = 0.0f;
pid->Derivative = 0.0f;
pid->LastError = 0.0f;
pid->Kp = kp;
pid->Ki = ki;
pid->Kd = kd;
pid->SampleTime = sampleTime;
}
// 更新PID计算结果
void PID_Update(PID_TypeDef *pid) {
float error = pid->SetPoint - pid->Input;
pid->Integral += error * pid->SampleTime;
pid->Derivative = (error - pid->LastError) / pid->SampleTime;
pid->Output = pid->Kp * error + pid->Ki * pid->Integral + pid->Kd * pid->Derivative;
pid->LastError = error;
}
int main(void) {
// 初始化PID结构体
PID_TypeDef pid;
PID_Init(&pid, Kp, Ki, Kd, SampleTime);
// 循环更新PID计算结果
while (1) {
// 读取输入值
pid.Input = ADC_GetValue();
// 更新PID计算结果
PID_Update(&pid);
// 输出PID控制量
PWM_SetDutyCycle(pid.Output);
// 等待下一个采样时间
delay(SampleTime);
}
}