现场实测: 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变化大, 现场低档漏检可单独回调
101 lines
3.4 KiB
C
101 lines
3.4 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.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;
|
||
}
|