Files
DLD154V4B/tests/test_planb_release.c
T
wangfq 3d8f412f33 feat(V4B): V4.07 SENS=0 触发回调 357→337 — 最终表 {337,71,38,25}/{51,27,18,12}
现场反馈: 等比值偏低档触发过深, SENS=0 回调至 337(300~357 折中)
- 进入表: {357,71,38,25} → {337,71,38,25}
- 释放表: {51,27,18,12} 不变
单测: test_planb_release.c 断言更新(V4.07), 全部通过
文档: devlog V2.16 + technical-spec §4.3.3
2026-09-01 15:31:05 +08:00

101 lines
3.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 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 <stdio.h>
#include <stdint.h>
#include <assert.h>
#define ALFA_FAST 79 /* 主滤波 @10ms, τ≈22ms */
#define TICK_MS 10
#define ORIGIN 100000UL
/* 方案B V4.07 调校表 (与 TaskLoop.c 一致) */
static const uint16_t SensTable[4] = {337, 71, 38, 25}; /* 进入: 原{300,60,32,21}, V4.07 SENS=0 回调 357→337 */
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_v407_tuned_values(void)
{
/* SENS=3: 进入 25 / 释放 12 (用户现场实测) */
assert(SensTable[3] == 25);
assert(SensTable_1[3] == 12);
/* 其他档: SENS=0 回调 337, 其余等比 ×25/21 与 ×12/14 */
assert(SensTable[2] == 38 && SensTable[1] == 71 && SensTable[0] == 337);
assert(SensTable_1[2] == 18 && SensTable_1[1] == 27 && SensTable_1[0] == 51);
printf("[OK] V4.07 调校表值正确: 进入{337,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_v407_tuned_values();
test_tuned_later_than_old();
test_release_reasonable();
printf("\n全部通过 ✓\n");
return 0;
}