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
Sau khi khai báo trong PID.h, ta sẽ tạo file PID.c và include vào
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
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)
Cuối cùng chúng ta sẽ lấy giá trị sau khi hàm PID xử lý để điều khiển PWM
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!!!!
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
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;
}
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};
Code:
PID_PROCESS(&PID_set_parameters, 2,0)
Code:
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_3,PID_ReadValue (&PID_set_parameters))
Last edited: