generated from hulk/gd32f4xx_template_cmake_vscode
Heater: force output off in overtemp region (err<0); Kp 4->10
This commit is contained in:
+17
-12
@@ -111,21 +111,26 @@ static void pid_compute(void) {
|
||||
float u_noi = HEATER_PID_KP * err
|
||||
+ HEATER_PID_KD * (err - s_prev_err); /* 比例 + 微分 */
|
||||
float integ_new = s_integral + err;
|
||||
float u = u_noi + HEATER_PID_KI * integ_new;
|
||||
|
||||
if (u > 100.0f) {
|
||||
u = 100.0f;
|
||||
if (err < 0.0f) s_integral = integ_new; /* 超上限:仅误差为负(降温方向)才吸收 */
|
||||
} else if (u < 0.0f) {
|
||||
u = 0.0f;
|
||||
if (err > 0.0f) s_integral = integ_new; /* 超下限:仅误差为正(升温方向)才吸收 */
|
||||
/* 超温区间(实际温度高于内部目标):加热器只能加热、不能制冷,
|
||||
输出必须为 0(此前积分正残量会算出小占空在超调段续灌加热);
|
||||
积分按负误差同步回退,为温度回落后的重新加热保留正确初始态 */
|
||||
if (err < 0.0f) {
|
||||
s_integral = integ_new;
|
||||
s_prev_err = err;
|
||||
s_duty10 = 0;
|
||||
} else {
|
||||
s_integral = integ_new; /* 未饱和:正常积分 */
|
||||
/* 误差为正(未达/低于内部目标):正常 PID + 抗积分饱和 */
|
||||
float u = u_noi + HEATER_PID_KI * integ_new;
|
||||
if (u > 100.0f) {
|
||||
u = 100.0f;
|
||||
/* 超上限:仅误差为负才吸收——err>=0 分支不会发生,保持积分不动 */
|
||||
} else {
|
||||
s_integral = integ_new;
|
||||
}
|
||||
/* 输出量化到 10% 档位(四舍五入) */
|
||||
s_duty10 = (uint8_t)((u + (float)HEATER_PWM_STEP_PCT / 2.0f) / (float)HEATER_PWM_STEP_PCT);
|
||||
}
|
||||
s_prev_err = err;
|
||||
|
||||
/* 输出量化到 10% 档位(四舍五入) */
|
||||
s_duty10 = (uint8_t)((u + (float)HEATER_PWM_STEP_PCT / 2.0f) / (float)HEATER_PWM_STEP_PCT);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
Reference in New Issue
Block a user