feat(V4B): 方案B现场调校定稿 V4.06 — 进入加深+释放调浅双表, 全档等比

现场实测: SENS=3 进入21→25 + 释放14→12 接近PD132T最高灵敏手感(用户调校)
- 关键认知: 释放方向是CAPVD向Origin恢复, 释放线调浅(dlt小)→更晚释放
  (V4.05加深方向失败已记录, 现场实测确认调小有效)
- 全档等比: 进入×25/21 {300,60,32,21}→{357,71,38,25}
          释放×12/14 {60,32,21,14}→{51,27,18,12}
- 滞回 66%→47%, 触发更严+释放更晚, 行为等效PD132T(表值不再一致)
- 废弃 ReleaseTable_B 独立表(方向错误, 并入 SensTable_1 调校)

单测: test_planb_release.c 更新(滞回正/表值/调浅释放≥原始4档×4速/释放时刻) ✓
      test_release_slow_filter.c(方案A)仍通过
文档: devlog V2.15 + technical-spec §4.3.3 V4.06段
⚠ SENS=0 进入300→357变化大, 现场低档漏检可单独回调
This commit is contained in:
wangfq
2026-09-01 14:38:52 +08:00
parent 9f132c1e16
commit 778664067e
6 changed files with 95 additions and 44 deletions
+36 -25
View File
@@ -1,11 +1,11 @@
/*
* test_planb_release.c — 方案B (快滤波 + 调深释放阈值表) 单测
* test_planb_release.c — 方案B (快滤波 + 灵敏度表现场调校) 单测
*
* 验证 (V4.05, USE_SLOW_RELEASE=0, USE_PLANB_TABLE=1):
* 1. ReleaseTable_B 各档 < SensTable(进入表) → 滞回为正, 无结构假释放
* 2. 同快滤波下, 加深表(ReleaseTable_B)释放早于原始表(SensTable_1)
* (物理方向: 释放线低 → CAPVD 恢复更早碰到 → 释放更早)
* 3. 慢速抬板场景: 方案B 释放时刻合理, 无 NaN
* 验证 (V4.06, USE_SLOW_RELEASE=0, USE_PLANB_TABLE=1):
* 1. 调校表各档滞回为正: SensTable_1(释放) < SensTable(进入)
* 2. SENS=3 调校值: 进入 25 / 释放 12 (现场实测接近 PD132T 最高灵敏手感)
* 3. 调浅释放(12) 比原始(14) 释放更
* 4. 全档释放时刻合理
*
* 编译: gcc -o /tmp/test_planb test_planb_release.c && /tmp/test_planb
*/
@@ -17,10 +17,10 @@
#define TICK_MS 10
#define ORIGIN 100000UL
/* 与 TaskLoop.h 方案B 配置保持一致 */
static const uint16_t SensTable[4] = {300, 60, 32, 21}; /* 进入 */
static const uint16_t SensTable_1[4] = { 60, 32, 21, 14}; /* 原始离开表 */
static const uint16_t ReleaseTable_B[4] = { 80, 42, 27, 18}; /* 方案B 加深表 */
/* 方案B V4.06 调校表 (与 TaskLoop.c 一致) */
static const uint16_t SensTable[4] = {357, 71, 38, 25}; /* 进入: 原{300,60,32,21} ×1.190 */
static const uint16_t SensTable_1[4] = { 51, 27, 18, 12}; /* 释放: 原{60,32,21,14} ×0.857 */
static const uint16_t SensTable_1_old[4] = { 60, 32, 21, 14}; /* 原始表(对比用) */
static uint32_t iir(uint32_t v, uint32_t flt, int alfa)
{
@@ -48,41 +48,52 @@ static void test_hysteresis_positive(void)
{
int s;
for (s = 0; s < 4; s++) {
assert(ReleaseTable_B[s] < SensTable[s]);
assert(SensTable_1[s] < SensTable[s]);
}
printf("[OK] 滞回为正: ReleaseTable_B/SensTable_1 各档均 < 进入表\n");
printf("[OK] 滞回为正: 四档释放表均 < 进入表\n");
}
static void test_deep_table_earlier(void)
static void test_v406_tuned_values(void)
{
/* SENS=3: 进入 25 / 释放 12 (用户现场实测) */
assert(SensTable[3] == 25);
assert(SensTable_1[3] == 12);
/* 其他档等比: ×25/21 与 ×12/14 */
assert(SensTable[2] == 38 && SensTable[1] == 71 && SensTable[0] == 357);
assert(SensTable_1[2] == 18 && SensTable_1[1] == 27 && SensTable_1[0] == 51);
printf("[OK] V4.06 调校表值正确: 进入{357,71,38,25} 释放{51,27,18,12}\n");
}
static void test_tuned_later_than_old(void)
{
int s, T_ms;
for (s = 0; s < 4; s++) {
for (T_ms = 2000; T_ms <= 5000; T_ms += 1000) {
int t_orig = sim_release_ms(400, SensTable_1[s], T_ms);
int t_deep = sim_release_ms(400, ReleaseTable_B[s], T_ms);
assert(t_orig > 0 && t_deep > 0);
/* 加深表释放不晚于原始表 (同快滤波, 线低 → 早碰) */
assert(t_deep <= t_orig);
printf("[OK] SENS=%d T=%dms: 原始@%dms, 加深表@%dms (加深≤原始 ✓)\n",
s, T_ms, t_orig, t_deep);
int t_old = sim_release_ms(400, SensTable_1_old[s], T_ms);
int t_new = sim_release_ms(400, SensTable_1[s], T_ms);
assert(t_old > 0 && t_new > 0);
/* 调浅释放表 → 释放线更高 → 更晚释放 */
assert(t_new >= t_old);
printf("[OK] SENS=%d T=%dms: 原始@%dms, 调校@%dms (调校≥原始 ✓)\n",
s, T_ms, t_old, t_new);
}
}
}
static void test_release_reasonable(void)
{
/* 慢速抬板 3s: 各档都必须能释放, 且加深表 SENS=3 释放时刻在 2~3s 内 */
int t = sim_release_ms(200, ReleaseTable_B[3], 3000);
/* SENS=3 调校表 3s 抬板(400cnt): 必须能释放 */
int t = sim_release_ms(400, SensTable_1[3], 3000);
assert(t > 0 && t <= 3000);
printf("[OK] SENS=3 加深表 3s 抬板释放@%dms (合理范围)\n", t);
printf("[OK] SENS=3 调校表 3s 抬板释放@%dms (合理范围)\n", t);
}
int main(void)
{
printf("=== 方案B (快滤波+调深释放表) 单测 ===\n");
printf("=== 方案B (快滤波+灵敏度表现场调校 V4.06) 单测 ===\n");
test_hysteresis_positive();
test_deep_table_earlier();
test_v406_tuned_values();
test_tuned_later_than_old();
test_release_reasonable();
printf("\n全部通过 ✓\n");
return 0;