/* * test_planb_release.c — 方案B (快滤波 + 灵敏度表现场调校) 单测 * * 验证 (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 */ #include #include #include #define ALFA_FAST 79 /* 主滤波 @10ms, τ≈22ms */ #define TICK_MS 10 #define ORIGIN 100000UL /* 方案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) { return flt + (uint32_t)(((int32_t)v - (int32_t)flt) * alfa >> 8); } /* 快滤波释放仿真: 板信号 dev0 匀速恢复, 返回释放时刻 ms (0=未释放) */ static int sim_release_ms(uint32_t dev0, uint32_t leave_l, int T_ms) { uint32_t flt = ORIGIN - dev0; int cnt = 0, n = T_ms / TICK_MS, i; for (i = 1; i <= n; i++) { uint32_t true_v = ORIGIN - dev0 * (n - i) / n; flt = iir(true_v, flt, ALFA_FAST); if (flt > ORIGIN - leave_l) { if (++cnt >= 3) return i * TICK_MS; } else { cnt = 0; } } return 0; } static void test_hysteresis_positive(void) { int s; for (s = 0; s < 4; s++) { assert(SensTable_1[s] < SensTable[s]); } printf("[OK] 滞回为正: 四档释放表均 < 进入表\n"); } 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_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) { /* 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); } int main(void) { printf("=== 方案B (快滤波+灵敏度表现场调校 V4.06) 单测 ===\n"); test_hysteresis_positive(); test_v406_tuned_values(); test_tuned_later_than_old(); test_release_reasonable(); printf("\n全部通过 ✓\n"); return 0; }