mirror of
https://gitee.com/dlmu-cone/tronone-h7-scaffold
synced 2026-07-24 11:37:44 +08:00
great changes
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* @file controller.c
|
||||
* @file pid.c
|
||||
* @author wanghongxi
|
||||
* @author modified by TuxMonkey
|
||||
* @brief PID控制器及前馈控制器
|
||||
@@ -82,6 +82,61 @@ static void f_Output_Filter(PIDInstance *pid)
|
||||
pid->Last_Output * pid->Output_LPF_RC / (pid->Output_LPF_RC + pid->dt);
|
||||
}
|
||||
|
||||
// 简单前馈模式: f_out = K_F * (Target - Pre_Target) / dt
|
||||
static void f_FeedForward_Control_Simple(PIDInstance *pid)
|
||||
{
|
||||
if (pid->dt > 0.000001f) { // 防止除以零
|
||||
pid->FFC_Output = pid->FFC_K * (pid->Ref - pid->FFC_Set_History[0]) / pid->dt;
|
||||
} else {
|
||||
pid->FFC_Output = 0.0f;
|
||||
}
|
||||
|
||||
// 更新设定值历史
|
||||
pid->FFC_Set_History[0] = pid->Ref; // 保存当前设定值用于下次计算
|
||||
}
|
||||
|
||||
// 复杂前馈模式: P + D + A 三阶前馈
|
||||
static void f_FeedForward_Control_Complex(PIDInstance *pid)
|
||||
{
|
||||
// 更新设定值历史
|
||||
pid->FFC_Set_History[2] = pid->FFC_Set_History[1]; // LLAST = LAST
|
||||
pid->FFC_Set_History[1] = pid->FFC_Set_History[0]; // LAST = NOW
|
||||
pid->FFC_Set_History[0] = pid->Ref; // NOW = 当前设定值
|
||||
|
||||
// 低通滤波处理
|
||||
float denominator = pid->FFC_LPF_RC + pid->dt;
|
||||
if (denominator > 0.000001f) {
|
||||
pid->FFC_Set_History[0] = pid->FFC_Set_History[0] * pid->dt / denominator +
|
||||
pid->FFC_Set_History[0] * pid->FFC_LPF_RC / denominator;
|
||||
}
|
||||
|
||||
// 前馈计算: P + D + A
|
||||
float p_term = pid->FFC_Kp * pid->FFC_Set_History[0]; // 比例项
|
||||
float d_term = 0.0f;
|
||||
float a_term = 0.0f;
|
||||
|
||||
if (pid->dt > 0.000001f) { // 防止除以零
|
||||
// 微分项: 速度前馈
|
||||
d_term = pid->FFC_Kd * (pid->FFC_Set_History[0] - pid->FFC_Set_History[1]) / pid->dt;
|
||||
|
||||
// 加速度项: 加速度前馈
|
||||
a_term = pid->FFC_Ka * (pid->FFC_Set_History[0] - 2 * pid->FFC_Set_History[1] + pid->FFC_Set_History[2]) / (pid->dt * pid->dt);
|
||||
}
|
||||
|
||||
pid->FFC_Output = p_term + d_term + a_term;
|
||||
}
|
||||
|
||||
// 前馈输出限幅
|
||||
static void f_FeedForward_Limit(PIDInstance *pid)
|
||||
{
|
||||
if (pid->FFC_Output > pid->MaxOut) {
|
||||
pid->FFC_Output = pid->MaxOut;
|
||||
}
|
||||
if (pid->FFC_Output < -(pid->MaxOut)) {
|
||||
pid->FFC_Output = -(pid->MaxOut);
|
||||
}
|
||||
}
|
||||
|
||||
// 前馈控制计算(后续考虑写成电流/速度前馈)
|
||||
|
||||
static void f_FeedForward_Control(PIDInstance *pid)
|
||||
@@ -226,9 +281,18 @@ float PIDCalculate(PIDInstance *pid, float measure, float ref)
|
||||
pid->Iout += pid->ITerm; // 累加积分
|
||||
pid->Output = pid->Pout + pid->Iout + pid->Dout; // 计算输出
|
||||
|
||||
// 前馈控制
|
||||
if (pid->Improve & PID_FeedForward)
|
||||
f_FeedForward_Control(pid);
|
||||
// 前馈控制 (根据模式选择)
|
||||
if (pid->Improve & PID_FeedForward) {
|
||||
if (pid->Improve & PID_FFC_SimpleMode) {
|
||||
// 简单前馈模式
|
||||
f_FeedForward_Control_Simple(pid);
|
||||
} else {
|
||||
// 复杂前馈模式
|
||||
f_FeedForward_Control_Complex(pid);
|
||||
}
|
||||
// 前馈输出限幅
|
||||
f_FeedForward_Limit(pid);
|
||||
}
|
||||
|
||||
// 输出滤波
|
||||
if (pid->Improve & PID_OutputFilter)
|
||||
|
||||
@@ -28,16 +28,17 @@
|
||||
// PID 优化环节使能标志位
|
||||
typedef enum
|
||||
{
|
||||
PID_IMPROVE_NONE = 0b000000000, // 无优化 0
|
||||
PID_Integral_Limit = 0b000000001, // 积分限幅 1
|
||||
PID_Derivative_On_Measurement = 0b000000010, // 微分先行 2
|
||||
PID_Trapezoid_Intergral = 0b000000100, // 梯形积分 4
|
||||
PID_Proportional_On_Measurement = 0b000001000, // 比例先行 8
|
||||
PID_OutputFilter = 0b000010000, // 输出滤波 16
|
||||
PID_ChangingIntegrationRate = 0b000100000, // 变速积分 32
|
||||
PID_DerivativeFilter = 0b001000000, // 微分滤波 64
|
||||
PID_ErrorHandle = 0b010000000, // 错误处理 128
|
||||
PID_FeedForward = 0b100000000, // 前馈控制 256
|
||||
PID_IMPROVE_NONE = 0b0000000000, // 无优化 0
|
||||
PID_Integral_Limit = 0b0000000001, // 积分限幅 1
|
||||
PID_Derivative_On_Measurement = 0b0000000010, // 微分先行 2
|
||||
PID_Trapezoid_Intergral = 0b0000000100, // 梯形积分 4
|
||||
PID_Proportional_On_Measurement = 0b0000001000, // 比例先行 8
|
||||
PID_OutputFilter = 0b0000010000, // 输出滤波 16
|
||||
PID_ChangingIntegrationRate = 0b0000100000, // 变速积分 32
|
||||
PID_DerivativeFilter = 0b0001000000, // 微分滤波 64
|
||||
PID_ErrorHandle = 0b0010000000, // 错误处理 128
|
||||
PID_FeedForward = 0b0100000000, // 前馈控制 256
|
||||
PID_FFC_SimpleMode = 0b1000000000, // 简单前馈模式 (与PID_FeedForward组合使用) 512
|
||||
} PID_Improvement_e;
|
||||
|
||||
/* PID 报错类型枚举*/
|
||||
@@ -74,9 +75,10 @@ typedef struct
|
||||
|
||||
//-----------------------------------
|
||||
// Feed Forward Control (FFC) parameters
|
||||
float FFC_Kp; // 前馈比例系数
|
||||
float FFC_Kd; // 前馈微分系数
|
||||
float FFC_Ka; // 前馈加速度系数
|
||||
float FFC_K; // 简单前馈增益系数
|
||||
float FFC_Kp; // 前馈比例系数 (复杂模式)
|
||||
float FFC_Kd; // 前馈微分系数 (复杂模式)
|
||||
float FFC_Ka; // 前馈加速度系数 (复杂模式)
|
||||
float FFC_LPF_RC; // 前馈低通滤波器系数
|
||||
float FFC_Output; // 前馈输出值
|
||||
float FFC_Set_History[3]; // 前馈设定值历史 [NOW, LAST, LLAST]
|
||||
@@ -125,9 +127,10 @@ typedef struct // config parameter
|
||||
float Derivative_LPF_RC;
|
||||
|
||||
// Feed Forward Control (FFC) parameters
|
||||
float FFC_Kp; // 前馈比例系数
|
||||
float FFC_Kd; // 前馈微分系数
|
||||
float FFC_Ka; // 前馈加速度系数
|
||||
float FFC_K; // 简单前馈增益系数
|
||||
float FFC_Kp; // 前馈比例系数 (复杂模式)
|
||||
float FFC_Kd; // 前馈微分系数 (复杂模式)
|
||||
float FFC_Ka; // 前馈加速度系数 (复杂模式)
|
||||
float FFC_LPF_RC; // 前馈低通滤波器系数
|
||||
} PID_Init_Config_s;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user