现场反馈: 等比值偏低档触发过深, 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
101 lines
3.5 KiB
C
101 lines
3.5 KiB
C
/*
|
||
* 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;
|
||
}
|