feat(V4B): V4.26 — 线圈电感量告警(一长一短) + 故障补偿 60s→10s (4点拍板)
1. 默认低频档频率合理窗 20~120kHz, 出界即告警(不做档位判定/灰带):
TaskLoop.c 新增 coil_monitor() — 稳定+无车空闲由无车主路径调用,
Origin 反推空场 f, f<20kHz→L偏大/f>120kHz→L偏小, 1s 防抖置位/清除
2. 告警形式: 黄灯"一长一短" 200ms亮/100ms灭/100ms亮/800ms灭 循环 (模式5)
3. 黄灯优先级: 断开快闪 > 故障补偿(学习)常亮 > 电感量一长一短 > N短闪 > 灭
4. 故障补偿等待 ENV_RESYNC_WAIT 6000→1000 (60s→10s): 总补偿 ~66s→~21s
验证: tests/test_coil_range.c 5场景(边界19/20/120/121+防抖) ALL PASS;
test_env_resync.c 适配10s(applied_at=1600tick) 5场景 ALL PASS; 语法 0 error
文档: devlog V2.24/spec V2.5/manual V2.9/design doc v0.3(标记已实现)
修复: 源文件行尾多CR污染(\\r\\r\\r\\r\\n)统一规范化回标准CRLF
This commit is contained in:
@@ -139,6 +139,8 @@ uint8_t g_disconnect_count = 0;
|
||||
uint8_t g_disconnect_active = 0;
|
||||
uint8_t g_fault_phase = 0;
|
||||
uint16_t g_fault_tick = 0;
|
||||
uint8_t g_coil_fault = 0; // V4.26: 线圈电感量异常 0=正常 1=L偏大(f<20kHz) 2=L偏小(f>120kHz)
|
||||
uint16_t g_coil_bad_cnt = 0; // V4.26: 电感异常防抖计数 (100tick=1s 置位/清除)
|
||||
|
||||
/*===========================================================================
|
||||
* 调试计数器
|
||||
@@ -300,12 +302,16 @@ void poll_green_led(void)
|
||||
*
|
||||
* 由 TMR15 ISR 每 5ms 驱动一次。
|
||||
*
|
||||
* 模式判定:
|
||||
* 当前线圈断开 或 上电后从未接线圈:
|
||||
* 模式判定 (V4.26 优先级: 1>4>5>3>2):
|
||||
* 1 当前线圈断开 或 上电后从未接线圈:
|
||||
* → 快闪 (200ms 亮 / 200ms 灭)
|
||||
* 线圈已恢复连接, 且上电后有断开记录 (g_disconnect_count >= 1):
|
||||
* 4 环境异常预判/重校准学习 (g_env_warn/g_env_resync):
|
||||
* → 常亮 (V4.24/25, 故障补偿 10s 内完成)
|
||||
* 5 线圈电感量不合理 (g_coil_fault, 频率 20~120kHz 窗之外):
|
||||
* → 一长一短 (长亮200ms/灭100ms/短亮100ms/灭800ms 循环)
|
||||
* 3 线圈已恢复连接, 且上电后有断开记录 (g_disconnect_count >= 1):
|
||||
* → N 短闪 (80ms亮/200ms灭 × N, 1.2s间隔, N=断开次数≤3)
|
||||
* 线圈正常连接, 无断开记录:
|
||||
* 2 线圈正常连接, 无断开记录:
|
||||
* → 灭
|
||||
*===========================================================================*/
|
||||
void poll_yellow_led(void)
|
||||
@@ -338,6 +344,24 @@ void poll_yellow_led(void)
|
||||
return;
|
||||
}
|
||||
|
||||
/*--- V4.26 模式5: 线圈电感量不合理 → 一长一短
|
||||
* 长亮200ms(40tick) → 灭100ms(20) → 短亮100ms(20) → 灭800ms(160), 循环
|
||||
* g_coil_fault: 1=L偏大(f<20kHz) 2=L偏小(f>120kHz)
|
||||
* 优先级: 断开(1) > 环境(4) > 电感量(5) > N短闪(3) > 灭 ---*/
|
||||
if (g_coil_fault) {
|
||||
static const uint16_t dur[4] = { 40, 20, 20, 160 };
|
||||
if (g_fault_phase > 3) g_fault_phase = 0;
|
||||
if (g_fault_phase & 1)
|
||||
LED_YELLOW_OFF;
|
||||
else
|
||||
LED_YELLOW_ON;
|
||||
if (g_fault_tick >= dur[g_fault_phase]) {
|
||||
g_fault_tick = 0;
|
||||
g_fault_phase++;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
uint8_t N = g_disconnect_count;
|
||||
|
||||
if (N == 0) {
|
||||
@@ -776,6 +800,43 @@ static void env_resync_apply(uint32_t new_origin)
|
||||
#endif
|
||||
env_resync_abort();
|
||||
}
|
||||
/*===========================================================================
|
||||
* V4.26: 线圈电感量合理范围监视
|
||||
* 拍板规格: 默认低频档口径, 空场频率合理窗 20~120kHz, 出界即判定电感量不合理
|
||||
* (黄灯"一长一短"告警, 见 poll_yellow_led 模式5)
|
||||
* 调用点保证: 仅稳定 + 无车空闲 + 未断开时执行 (车压/自检/断开不判)
|
||||
* g_coil_fault: 0=正常 1=L偏大(f<20kHz) 2=L偏小(f>120kHz)
|
||||
* 防抖: 越界/恢复均连续 100tick(=1s) 才置位/清除
|
||||
*===========================================================================*/
|
||||
static void coil_monitor(void)
|
||||
{
|
||||
uint32_t f_khz = calc_freq_khz(loop1_Origin, loop1_LPCNT);
|
||||
uint8_t want = 0;
|
||||
|
||||
if (loop1_Origin == 0 || f_khz == 0)
|
||||
return; /* 无有效基准 → 维持原状 */
|
||||
|
||||
if (f_khz < COIL_F_OK_MIN_KHZ)
|
||||
want = 1; /* L 偏大 (>合理上限) */
|
||||
else if (f_khz > COIL_F_OK_MAX_KHZ)
|
||||
want = 2; /* L 偏小 (<合理下限) */
|
||||
|
||||
if (want == g_coil_fault) {
|
||||
g_coil_bad_cnt = 0; /* 状态一致 → 计时复位 */
|
||||
} else {
|
||||
g_coil_bad_cnt++;
|
||||
if (g_coil_bad_cnt >= 100) {
|
||||
if (g_coil_fault == 0)
|
||||
PRINT("EVT|coil_fault f:%d kHz L~%lu uH(C66/×2C33) %s\n",
|
||||
f_khz, 25330000UL / (uint32_t)(f_khz * f_khz * COIL_DEF_C_NF),
|
||||
want == 1 ? "too_large" : "too_small");
|
||||
else
|
||||
PRINT("EVT|coil_ok f:%d kHz\n", f_khz);
|
||||
g_coil_fault = want;
|
||||
g_coil_bad_cnt = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
* vd1_task — 核心检测算法(对齐 M1H VD1_TASK)
|
||||
@@ -792,7 +853,7 @@ void vd1_task(void)
|
||||
#define STABLE_ORIGIN_PPT 1 // 基准稳定判据: 窗口均值漂移 ≤ Origin×1/1000 (0.1%)
|
||||
#define STABLE_SETTLE_WINDOWS 2 // 连续 2 个窗口(每窗100样本≈1s)漂移达标 → 判稳
|
||||
#define STABLE_MAX_SAMPLES 500 // 硬兜底: 5s 未判稳强制结束自检(防绿灯无限闪)
|
||||
#define ENV_RESYNC_WAIT 6000 // V4.24: dev>+4dlt 高位连续 60s → 判定永久环境变化
|
||||
#define ENV_RESYNC_WAIT 1000 // V4.26: dev>+4dlt 高位连续 10s → 判定永久环境变化 (拍板: 故障补偿 60s→10s)
|
||||
#define ENV_LEARN_WINDOW 200 // V4.24: 环境学习窗口 2s (200×10ms)
|
||||
#define ENV_LEARN_MAX_TICKS 3000 // V4.24: 学习预算 30s, 超时放弃 (防黄灯常亮死锁)
|
||||
|
||||
@@ -935,7 +996,7 @@ void vd1_task(void)
|
||||
} else {
|
||||
/* 负variation (CAPVD高于Origin, 特殊铁块磁导率主导/异常高)
|
||||
* V4.24 两段式:
|
||||
* ① 前 60s(ENV_RESYNC_WAIT): 只冻结, 不更新 Origin
|
||||
* ① 前 10s(ENV_RESYNC_WAIT): 只冻结, 不更新 Origin
|
||||
* (36321a1 双向保护原语义: 防铁块污染 Origin → 离开假进入锁死)
|
||||
* ② 高位连续 ≥60s 未回摆 → 判定"永久环境变化"(如金属板A拿走、基准被学低)
|
||||
* → 进入受控重校准: 连续空闲窗口均值 B + settle 判稳 → 空闲原子替换 Origin
|
||||
@@ -1006,6 +1067,9 @@ void vd1_task(void)
|
||||
}
|
||||
}
|
||||
|
||||
/*--- V4.26: 线圈电感量监视 (调用点=稳定无车空闲, 见 coil_monitor) ---*/
|
||||
coil_monitor();
|
||||
|
||||
/*--- 进入确认 — 连续 ENTRY_CONFIRM 次低于阈值才判有车 ---*/
|
||||
if (loop1_CAPVD < (loop1_Origin - loop1_dlt_ORG)) {
|
||||
if (loop1_entry_cnt == 0) {
|
||||
|
||||
Reference in New Issue
Block a user