STM32F10x 实现PID算法(笔记)

时间:2025-05-11 07:19:01
  • #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);
  • }
  • }