/* * test_coil_range.c — 线圈电感量合理范围监视 gcc 隔离单测 (DLD154V4B V4.26) * * 验证对象: TaskLoop.c coil_monitor() (V4.26 拍板规格) * 默认低频档口径(43nF 三极管板): 空场频率合理窗 18~171kHz(=L 20µH 下限), * 出界即判定电感量不合理; g_coil_fault: 0=正常 1=L偏大(f<18kHz) 2=L<20µH(f>171kHz) * 防抖: 越界/恢复均连续 COIL_FAULT_HOLD_TICKS(500tick=5s) 才置位/清除 * (V4.36.21 加长, 下限判定重要防误检瞬态冲高) * * 镜像宏与固件一致 (改 COIL_* 时同步此处!) */ #include #include #include #define COIL_F_OK_MIN_KHZ 18 #define COIL_F_OK_MAX_KHZ 171 #define COIL_FAULT_HOLD_TICKS 500 #define COIL_DEF_C_NF 66 static uint8_t g_coil_fault = 0; static uint16_t g_coil_bad_cnt = 0; /* coil_monitor() 纯逻辑镜像 (不含 Origin==0 守卫, 由调用点保证) */ static void coil_step(uint32_t f_khz) { uint8_t want = 0; if (f_khz < COIL_F_OK_MIN_KHZ) want = 1; else if (f_khz > COIL_F_OK_MAX_KHZ) want = 2; if (want == g_coil_fault) { g_coil_bad_cnt = 0; } else { g_coil_bad_cnt++; if (g_coil_bad_cnt >= COIL_FAULT_HOLD_TICKS) { g_coil_fault = want; g_coil_bad_cnt = 0; } } } static void run_ticks(uint32_t f_khz, int n) { int i; for (i = 0; i < n; i++) coil_step(f_khz); } static void test_too_large(void) { g_coil_fault = 0; g_coil_bad_cnt = 0; /* f=16.3kHz(实测超限线圈) 持续 <5s 不置位 (V4.36.21 防抖加长防误检) */ run_ticks(16, 499); assert(g_coil_fault == 0); /* 满 5s → L 偏大 */ run_ticks(16, 1); assert(g_coil_fault == 1); /* 保持 → 状态稳定不抖 */ run_ticks(16, 1000); assert(g_coil_fault == 1); printf("1. L偏大 (f=16kHz, 5s 防抖置位, 保持稳定) OK\n"); } static void test_too_small(void) { g_coil_fault = 0; g_coil_bad_cnt = 0; run_ticks(200, 500); assert(g_coil_fault == 2); printf("2. L偏小 (f=200kHz, 5s 防抖置位) OK\n"); } static void test_recover(void) { g_coil_fault = 1; g_coil_bad_cnt = 0; run_ticks(62, 499); assert(g_coil_fault == 1); /* 恢复防抖 <5s 不清除 */ run_ticks(62, 1); assert(g_coil_fault == 0); /* 满 5s 恢复正常 */ printf("3. 恢复正常 (5s 防抖清除) OK\n"); } static void test_boundaries(void) { g_coil_fault = 0; g_coil_bad_cnt = 0; run_ticks(17, 500); assert(g_coil_fault == 1); /* 17 → 偏大 */ run_ticks(62, 500); assert(g_coil_fault == 0); /* 62 正常(恢复) */ run_ticks(18, 500); assert(g_coil_fault == 0); /* 边界 18 正常 */ run_ticks(125, 500); assert(g_coil_fault == 0); /* 中间 125 正常 (V4.36.20 窗内) */ run_ticks(171, 500); assert(g_coil_fault == 0); /* 边界 171 (=L 20.15µH) 正常 */ run_ticks(172, 500); assert(g_coil_fault == 2); /* 172 → L<20µH 偏小(断开级) */ printf("4. 边界 17/18/171/172 OK\n"); } static void test_jitter_no_alarm(void) { /* 抖动: 16 与 62 交替 (每 50tick) → 计数永远到不了 100 → 不误报 */ int i; g_coil_fault = 0; g_coil_bad_cnt = 0; for (i = 0; i < 2000; i++) coil_step((i & 1) ? 62 : 16); assert(g_coil_fault == 0); printf("5. 频率抖动不误报 OK\n"); } int main(void) { test_too_large(); test_too_small(); test_recover(); test_boundaries(); test_jitter_no_alarm(); printf("\nALL PASS (窗口 18~171kHz=L 20µH, 防抖 5s)\n"); return 0; }