TaskLoop.c/h 现役注释 5 处 + tests 4 处 (180/983/997/1004/84 + 6/103/104/127) 代码本体 V4.36.38 已是一长两短 6 相, 注释滞后同步 devlog V2.77 / spec V2.59 (历史版本行保留当时变更记录) 语法0 error, 4测试全绿
130 lines
4.2 KiB
C
130 lines
4.2 KiB
C
/*
|
|
* test_coil_range.c — 线圈电感量合理范围监视 gcc 隔离单测 (DLD154V4B V4.26)
|
|
*
|
|
* 验证对象: TaskLoop.c coil_monitor() (V4.26 拍板规格)
|
|
* 默认低频档口径(43nF 三极管板, V4.36.37 方案A 分级):
|
|
* g_coil_fault: 0=正常 1=出窗一长一短(f<18k 或 125<f≤156k) 2=156~171k 一长两短(L20~24µH, 恒判车)
|
|
* 3=f>171k 短路级 L<20µH → 断开级快闪(宏 COIL_UNDER_MIN_AS_OPEN 功能随动)
|
|
* 防抖: 越界/恢复均连续 COIL_FAULT_HOLD_TICKS(500tick=5s) 才置位/清除
|
|
* (V4.36.21 加长, 下限判定重要防误检瞬态冲高)
|
|
*
|
|
* 镜像宏与固件一致 (改 COIL_* 时同步此处!)
|
|
*/
|
|
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
#include <stdint.h>
|
|
|
|
#define COIL_F_OK_MIN_KHZ 18
|
|
#define COIL_F_OK_MAX_KHZ 125
|
|
#define COIL_L_MIN_F_KHZ 156
|
|
#define COIL_L_SHORT_F_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_L_SHORT_F_KHZ)
|
|
want = 3;
|
|
else if (f_khz > COIL_L_MIN_F_KHZ)
|
|
want = 2;
|
|
else if (f_khz > COIL_F_OK_MAX_KHZ)
|
|
want = 1;
|
|
|
|
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 == 3);
|
|
printf("2. 短路级 (f=200kHz, 5s 防抖置位 fault=3) 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 正常(窗内) */
|
|
run_ticks(126, 500); assert(g_coil_fault == 1); /* 126 → L偏小出窗, 一长一短级 */
|
|
run_ticks(156, 500); assert(g_coil_fault == 1); /* 156 → 出窗但仍≥24µH, 一长一短级 */
|
|
run_ticks(157, 500); assert(g_coil_fault == 2); /* 157 → 156~171k 可用级, 一长两短 */
|
|
run_ticks(171, 500); assert(g_coil_fault == 2); /* 171 → 边界仍可用级一长两短 (f@20µH=171.6k) */
|
|
run_ticks(172, 500); assert(g_coil_fault == 3); /* 172 → L<20µH 短路级, 断开级快闪 */
|
|
printf("4. 边界 17/18/125/126/156/157/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~125kHz; 126~156=一长一短; 157~171=一长两短L20~24µH恒判车; >171=L<20µH短路级快闪; 防抖 5s)\n");
|
|
return 0;
|
|
}
|