fix: 快速 IIR 输入改为限幅后原始值,不再经慢速 IIR 滞后
根因: CAPVD_fast = (CAPVD_fast + CAPVD) / 2 中 CAPVD 已被
ALFA_CAP1=18 (τ=135ms) 严重滞后。快速 IIR 的 α=0.5 无法
恢复前级丢失的响应速度,导致 ALFA_CAP1=18 的实际进入灵敏度
显著低于 ALFA_CAP1=79(旧设计)。
修复: 快速 IIR 直接吃斜率限幅后的 clamped_value / Value,
完全跳过慢速 IIR,真正实现 τ≈28ms 的响应速度。
数据流:
旧: Value → 斜率限幅 → IIR_slow(α=18/256) → CAPVD
└→ CAPVD_fast = avg(CAPVD_fast, CAPVD) ← 滞后
新: Value → 斜率限幅 → IIR_slow(α=18/256) → CAPVD
└→ CAPVD_fast = avg(CAPVD_fast, clamped_value) ← 快速
This commit is contained in:
@@ -654,9 +654,12 @@ void vd1_task(void)
|
||||
*================================================================*/
|
||||
|
||||
/* 1a. 慢速 IIR — 斜率限幅 */
|
||||
{
|
||||
uint32_t fast_input; // 快速 IIR 的输入:限幅后的原始值,不经慢速 IIR 滞后
|
||||
|
||||
if (loop1_CAPVD == 0) {
|
||||
loop1_CAPVD = loop1_Value;
|
||||
loop1_CAPVD_fast = loop1_Value;
|
||||
fast_input = loop1_Value;
|
||||
} else {
|
||||
/* 斜率限幅: 物理车辆不可能让频率瞬间跳变 > MAX_SLOPE_RATE% */
|
||||
int32_t raw_delta = (int32_t)loop1_Value - (int32_t)loop1_CAPVD;
|
||||
@@ -666,13 +669,16 @@ void vd1_task(void)
|
||||
if (raw_delta < -max_step) raw_delta = -max_step;
|
||||
uint32_t clamped_value = (uint32_t)((int32_t)loop1_CAPVD + raw_delta);
|
||||
loop1_CAPVD = get_flt_value(clamped_value, loop1_CAPVD);
|
||||
fast_input = clamped_value;
|
||||
}
|
||||
|
||||
/* 1b. 快速 IIR — α=0.5: (old + new) / 2 */
|
||||
/* 1b. 快速 IIR — α=0.5: (old + new) / 2
|
||||
* 输入直接用限幅后的原始值,不经过慢速 IIR,保持 τ≈28ms 的响应速度 */
|
||||
if (loop1_CAPVD_fast == 0) {
|
||||
loop1_CAPVD_fast = loop1_CAPVD; // 首次直接锁定
|
||||
loop1_CAPVD_fast = fast_input;
|
||||
} else {
|
||||
loop1_CAPVD_fast = (loop1_CAPVD_fast + loop1_CAPVD) / 2;
|
||||
loop1_CAPVD_fast = (loop1_CAPVD_fast + fast_input) / 2;
|
||||
}
|
||||
}
|
||||
|
||||
/*--- 2. 稳定期:只跟踪基线,不检测车辆 ---*/
|
||||
|
||||
Reference in New Issue
Block a user