feat(V4B): 释放手感对齐 PD132T — 释放慢滤波(方案A, 固件 V4.03)
现场金属板测试: 灵敏度表已对齐, 但释放高度 V4B 比 PD132T 低 (刚离开触发位置即释放 vs 需离更远)。根因: IIR 滤波时间常数差异 (V4B 10ms+α79→τ32ms vs PD132T 43.7ms+α79/64→τ142~175ms), 释放阈值浅(进入20%)放大差异。 修复(USE_SLOW_RELEASE 开关, 默认 1): - 新增独立慢滤波 loop1_CAPVD_slow(α=18/256 @10ms→τ≈142ms), 吃原始 Value 不经斜率限幅, 复刻 PD132T 恢复速度 - 离开判定改用慢滤波值, 进入路径不变 - RELEASE_ALFA=18 可调(PD132T SET_FLT=ON 时用 15≈τ170ms) - 同步: INIT_VD/稳定期/线圈重连 - 版本 V4.03(顺带修正 cmcng.h 字符串"4.00"与数字 4/2 不一致) 验证: gcc 单测 tests/test_release_slow_filter.c τ fast=30ms/slow=140ms; 释放时机差 260ms ✓ 文档: technical-spec §4.3.3 + devlog V2.12 待板级: 真机金属板测试 + MRS 编译
This commit is contained in:
@@ -30,6 +30,7 @@ uint16_t loop1_CapCnt;
|
||||
uint32_t loop1_CapSum;
|
||||
uint32_t loop1_Value;
|
||||
uint32_t loop1_CAPVD;
|
||||
uint32_t loop1_CAPVD_slow = 0; // 释放判定慢滤波值 (方案A)
|
||||
uint32_t loop1_Origin;
|
||||
uint32_t loop1_ORG_SUM;
|
||||
uint16_t loop1_ORG_CNT;
|
||||
@@ -168,6 +169,25 @@ uint32_t get_flt_value(uint32_t new_value, uint32_t last_Value)
|
||||
return value_Flt;
|
||||
}
|
||||
|
||||
/* 释放慢滤波(方案 A): 独立系数 RELEASE_ALFA, 不复用 Flt_Reg 全局
|
||||
* 复刻 PD132T 滤波路径(Value -> IIR), tau~142ms @10ms */
|
||||
uint32_t get_flt_value_slow(uint32_t new_value, uint32_t last_value)
|
||||
{
|
||||
uint32_t value_Flt;
|
||||
uint32_t delta = (new_value > last_value)
|
||||
? (new_value - last_value)
|
||||
: (last_value - new_value);
|
||||
uint32_t scaled_delta = (delta * (uint32_t)RELEASE_ALFA) >> 8;
|
||||
|
||||
if (new_value > last_value) {
|
||||
value_Flt = last_value + scaled_delta;
|
||||
} else {
|
||||
value_Flt = last_value - scaled_delta;
|
||||
}
|
||||
|
||||
return value_Flt;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
* 滑动平均基线更新
|
||||
* 累加 new_value,当计数达到 window 时计算平均值并重置
|
||||
@@ -351,6 +371,7 @@ void INIT_VD(void)
|
||||
loop1_LOOP_OK0 = 0;
|
||||
loop1_CAP_OK = 0;
|
||||
loop1_CAPVD = 0;
|
||||
loop1_CAPVD_slow = 0; // 方案A: 释放慢滤波复位
|
||||
|
||||
loop1_SensLevel = 2; // 默认中灵敏度
|
||||
Flt_Reg = ALFA_CAP1; // 79
|
||||
@@ -684,9 +705,21 @@ void vd1_task(void)
|
||||
loop1_CAPVD = get_flt_value(clamped_value, loop1_CAPVD);
|
||||
}
|
||||
|
||||
#if USE_SLOW_RELEASE
|
||||
/* 方案A: 释放慢滤波独立跟踪(吃原始 Value, 复刻 PD132T 滤波路径) */
|
||||
if (loop1_CAPVD_slow == 0) {
|
||||
loop1_CAPVD_slow = loop1_Value;
|
||||
} else {
|
||||
loop1_CAPVD_slow = get_flt_value_slow(loop1_Value, loop1_CAPVD_slow);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*--- 2. 稳定期:绕过 IIR 和斜率限幅,小窗口快速收敛 ---*/
|
||||
if (!g_loop_stable) {
|
||||
loop1_CAPVD = loop1_Value;
|
||||
#if USE_SLOW_RELEASE
|
||||
loop1_CAPVD_slow = loop1_Value; // 方案A: 稳定期同步直锁
|
||||
#endif
|
||||
|
||||
update_moving_average(&loop1_ORG_SUM, &loop1_ORG_CNT,
|
||||
&loop1_Origin, loop1_CAPVD, 100);
|
||||
@@ -844,7 +877,11 @@ void vd1_task(void)
|
||||
*================================================================*/
|
||||
loop1_dlt_ORG = ((uint32_t)loop1_Origin * SensTable_1[loop1_SensLevel]) >> 16;
|
||||
|
||||
if ((loop1_Origin - loop1_dlt_ORG) < loop1_CAPVD) {
|
||||
#if USE_SLOW_RELEASE
|
||||
if ((loop1_Origin - loop1_dlt_ORG) < loop1_CAPVD_slow) { // 方案A: 用慢滤波值对齐 PD132T 释放手感
|
||||
#else
|
||||
if ((loop1_Origin - loop1_dlt_ORG) < loop1_CAPVD) { // 原逻辑: 快滤波直接判释放
|
||||
#endif
|
||||
loop1_cnt_release++;
|
||||
if (loop1_cnt_release >= 3) {
|
||||
PRINT("Car_OFF, Value:%d CAPVD:%d Origin:%d dlt:%d\n",
|
||||
@@ -881,6 +918,7 @@ void loop_task_function(void *pvParameters)
|
||||
loop1_LOOP_OK0 = 1;
|
||||
g_disconnect_active = 0; // 重连,清除断开标记
|
||||
loop1_CAPVD = 0; // 强制 IIR 从首个有效值重新收敛
|
||||
loop1_CAPVD_slow = 0; // 方案A: 释放慢滤波同步收敛
|
||||
}
|
||||
|
||||
if (loop1_CAP_OK) {
|
||||
|
||||
Reference in New Issue
Block a user