[C20] Hướng dẫn code PID cơ bản và cách sử dụng

an_phan

Thành Viên PIF
Chào các bạn,
Hôm nay mình sẽ chia sẻ thư viện PID cơ bản và cách sử dụng hàm PID trong hàm main.c
- Tạo file PID.h dùng để định nghĩa và khai báo cơ bản
Code:
#ifndef _PID_H_
#define _PID_H_

typedef struct
{
            float Kp;
            float Ki;
            float Kd;
            float error ;
            float pre_error;
            float pre2_error;
            float Ts;
            float KP_part;
            float KI_part;
            float KD_part;
            float Out;
            float pre_Out;
            float PID_Saturation;
}PID_parameter;

void PID_SET_PARAMs(PID_parameter* pid_parameters,float Kp,float Ki,float Kd);

void PID_PROCESS(PID_parameter* pid_parameter, float vitri,float setpoint);

float PID_ReadValue(PID_parameter* pid_parameter);

#endif
Sau khi khai báo trong PID.h, ta sẽ tạo file PID.c và include vào

Code:
#include "PID.h"

void PID_SET_PARAMs(PID_parameter* pid_parameters,float Kp,float Ki,float Kd)
{
    pid_parameters->Kp = Kp;
    pid_parameters->Ki = Ki;
    pid_parameters->Kd = Kd;
}
void PID_PROCESS(PID_parameter* pid_parameter, float vitri,float setpoint)   //setpoint = 0;
{
    pid_parameter->pre2_error = pid_parameter->pre_error;
    pid_parameter->pre_error = pid_parameter->error;
    pid_parameter->error =  vitri - setpoint;

    pid_parameter->pre_Out = pid_parameter->Out;

    pid_parameter->KP_part = pid_parameter->Kp * (pid_parameter->error - pid_parameter->pre_error);
    pid_parameter->KI_part = 0.5* pid_parameter->Ki * pid_parameter->Ts * (pid_parameter->error + pid_parameter->pre_error);
    pid_parameter->KD_part =(pid_parameter->Kd / pid_parameter->Ts) * (pid_parameter->error - 2*pid_parameter->pre_error +pid_parameter->pre2_error);

    pid_parameter->Out = pid_parameter->pre_Out+ pid_parameter->KP_part + pid_parameter->KI_part +pid_parameter->KD_part;

    if (pid_parameter->Out > pid_parameter->PID_Saturation)
      {
            pid_parameter->Out = pid_parameter->PID_Saturation;
       }
      else if (pid_parameter->Out < (-pid_parameter->PID_Saturation))
      {
            pid_parameter->Out = -pid_parameter->PID_Saturation;
      }
}

float PID_ReadValue (PID_parameter* pid_parameter){
    return pid_parameter->Out;
}
Trong hàm main.c, mình sẽ khai báo các thông số ban đầu cho bộ PID. Trong đó, Kp, Ki và Kd là các thông số do các bạn tự tìm trong quá trình tune động cơ xe của mình
Code:
PID_parameter PID_set_parameters = {.Kp =40,.Ki=0.0001,.Kd=25,.Ts = 0.005,.PID_Saturation = 180
                                                                            ,.error =0,.pre_error =0,.pre2_error=0,.pre_Out =0,.Out = 0};
Sau đó chúng ta sẽ lấy giá trị vị trí cảm biến để đưa vào PID xử lý, ở đây mình ví dụ là cảm biến đọc mà nhận thấy lệch 2 đơn vị so với setpoint(=0)
Code:
 PID_PROCESS(&PID_set_parameters, 2,0)
Cuối cùng chúng ta sẽ lấy giá trị sau khi hàm PID xử lý để điều khiển PWM
Code:
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_3,PID_ReadValue (&PID_set_parameters))
Chúc các bạn vui vẻ với project của mình và kiên trì để hoàn thành xong bài thi!!!!:brick:
 
Last edited:
  • Like
Reactions: Ref
Top