feat(V4B): V4.36.21 — 电感量下限判定防抖 1s→5s
用户: 电感量下限判定重要, 确保不误检, 判定时间可加长 - COIL_FAULT_HOLD_TICKS 100→500 (1s→5s, TaskLoop.h 宏) - 越界置位/恢复清除均 5s 连续确认 (防起振/瞬态 f 冲高 171k 误报断开级快闪) - 判定线不变 (18~171kHz / L≥20µH); coil_monitor 防抖宏化 - test 全用例同步 5s 语义 (499 不置位/500 置位); 全绿 语法0 error; spec V2.38 / devlog V2.57
This commit is contained in:
@@ -4,6 +4,15 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 2026-09-04 — 电感量下限判定防抖加长 1s→5s(固件 V4.36.21)
|
||||||
|
|
||||||
|
用户需求:电感量下限(L<20µH → 断开级快闪)重要,但要确保不误检,判定时间可以加长。
|
||||||
|
防抖 COIL_FAULT_HOLD_TICKS 100→500 tick(1s→5s,TaskLoop.h 宏):
|
||||||
|
- 越界置位与恢复清除都走 5s 连续确认(防起振/瞬态 f 冲高 171k 误报断开级快闪)
|
||||||
|
- 判定线不变(18~171kHz / L≥20µH)
|
||||||
|
- test 全用例同步 5s 语义(499 不置位/500 置位)
|
||||||
|
语法 0 error、4 测试全绿;REV 4.36.21;spec V2.38 / devlog V2.57。
|
||||||
|
|
||||||
## 2026-09-04 — 最低工作电感量 COIL_L_MIN_UH=20µH,低于则按线圈断开指示(固件 V4.36.20)
|
## 2026-09-04 — 最低工作电感量 COIL_L_MIN_UH=20µH,低于则按线圈断开指示(固件 V4.36.20)
|
||||||
|
|
||||||
用户需求:设定最低电感量工作值(默认 20µH,43nF 低频档口径,宏定义),
|
用户需求:设定最低电感量工作值(默认 20µH,43nF 低频档口径,宏定义),
|
||||||
@@ -1944,6 +1953,7 @@ if (dev >= dlt_ORG × 4) {
|
|||||||
|
|
||||||
| 版本 | 时间 | 说明 |
|
| 版本 | 时间 | 说明 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
|
| V2.57 | 2026-09-04 | V4.36.21 电感量判定防抖 1s→5s (COIL_FAULT_HOLD_TICKS=500): 越界/恢复均 5s, 防瞬态误检 |
|
||||||
| V2.56 | 2026-09-04 | V4.36.20 最低工作电感量 COIL_L_MIN_UH=20µH (43nF): L<20µH(f>171k)→断开级快闪; 一长一短仅 L 偏大; test 171/172 |
|
| V2.56 | 2026-09-04 | V4.36.20 最低工作电感量 COIL_L_MIN_UH=20µH (43nF): L<20µH(f>171k)→断开级快闪; 一长一短仅 L 偏大; test 171/172 |
|
||||||
| V2.55 | 2026-09-04 | 故障补偿触发幅度量化说明 (dev>+4×dlt; SENS=3≈电感+0.31%) |
|
| V2.55 | 2026-09-04 | 故障补偿触发幅度量化说明 (dev>+4×dlt; SENS=3≈电感+0.31%) |
|
||||||
| V2.54 | 2026-09-04 | V4.36.19 低Q 释放抗抖: τ50ms 平滑判释放+带回×1.5 (REL_ALFA/REL_BAND_LO_MULT), 高/中Q 零影响 |
|
| V2.54 | 2026-09-04 | V4.36.19 低Q 释放抗抖: τ50ms 平滑判释放+带回×1.5 (REL_ALFA/REL_BAND_LO_MULT), 高/中Q 零影响 |
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# DLD154V4B 技术规格书
|
# DLD154V4B 技术规格书
|
||||||
|
|
||||||
> 单路线圈车辆检测器 | 固件版本: V4.36.20 | 文档版本: V2.37
|
> 单路线圈车辆检测器 | 固件版本: V4.36.21 | 文档版本: V2.38
|
||||||
> 本文档面向工程开发、系统集成及故障深度分析
|
> 本文档面向工程开发、系统集成及故障深度分析
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -826,3 +826,4 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的
|
|||||||
| V2.35 | 2026-09-04 | **V4.36.19 低Q 释放抗抖**:低Q(21~50µH)高灵敏边界试探释放点外移/锁死(释放带回 23≈σ,快值判释放被抖断);τ50ms 平滑(REL_ALFA=46, 打印降采样平均效应工程版)+带回×1.5(REL_BAND_LO_MULT) 仅低Q 生效,高/中Q 零影响 |
|
| V2.35 | 2026-09-04 | **V4.36.19 低Q 释放抗抖**:低Q(21~50µH)高灵敏边界试探释放点外移/锁死(释放带回 23≈σ,快值判释放被抖断);τ50ms 平滑(REL_ALFA=46, 打印降采样平均效应工程版)+带回×1.5(REL_BAND_LO_MULT) 仅低Q 生效,高/中Q 零影响 |
|
||||||
| V2.36 | 2026-09-04 | 故障补偿触发幅度量化说明(4.4.2 补分档表):触发 dev>+4×dlt 连续 2s 黄灯常亮 / 7s 学习替换;SENS=3 ≈ Xn+0.15% ≈ 电感+0.31%(L∝Xn²,dL/L≈2×dXn/Xn) |
|
| V2.36 | 2026-09-04 | 故障补偿触发幅度量化说明(4.4.2 补分档表):触发 dev>+4×dlt 连续 2s 黄灯常亮 / 7s 学习替换;SENS=3 ≈ Xn+0.15% ≈ 电感+0.31%(L∝Xn²,dL/L≈2×dXn/Xn) |
|
||||||
| V2.37 | 2026-09-04 | **V4.36.20 最低工作电感量 COIL_L_MIN_UH=20µH**(43nF 口径):L<20µH(f>171kHz)→ 按线圈断开快闪指示(模式1,coil_fault==2 归入断开级);原上限 125kHz(38µH) 放宽至 20µH 可工作;L 偏大(f<18kHz)一长一短保留(coil_fault==1);test 边界 171 正常/172 偏小 |
|
| V2.37 | 2026-09-04 | **V4.36.20 最低工作电感量 COIL_L_MIN_UH=20µH**(43nF 口径):L<20µH(f>171kHz)→ 按线圈断开快闪指示(模式1,coil_fault==2 归入断开级);原上限 125kHz(38µH) 放宽至 20µH 可工作;L 偏大(f<18kHz)一长一短保留(coil_fault==1);test 边界 171 正常/172 偏小 |
|
||||||
|
| V2.38 | 2026-09-04 | **V4.36.21 电感量判定防抖 1s→5s**(COIL_FAULT_HOLD_TICKS=500):下限判定重要防误检——起振/瞬态频率冲高越界需持续 5s 才置位断开级快闪,恢复同样 5s 清除 |
|
||||||
|
|||||||
+26
-24
@@ -2,9 +2,10 @@
|
|||||||
* test_coil_range.c — 线圈电感量合理范围监视 gcc 隔离单测 (DLD154V4B V4.26)
|
* test_coil_range.c — 线圈电感量合理范围监视 gcc 隔离单测 (DLD154V4B V4.26)
|
||||||
*
|
*
|
||||||
* 验证对象: TaskLoop.c coil_monitor() (V4.26 拍板规格)
|
* 验证对象: TaskLoop.c coil_monitor() (V4.26 拍板规格)
|
||||||
* 默认低频档口径(43nF 三极管板): 空场频率合理窗 20~125kHz, 出界即判定电感量不合理
|
* 默认低频档口径(43nF 三极管板): 空场频率合理窗 18~171kHz(=L 20µH 下限),
|
||||||
* g_coil_fault: 0=正常 1=L偏大(f<18kHz) 2=L偏小(f>125kHz)
|
* 出界即判定电感量不合理; g_coil_fault: 0=正常 1=L偏大(f<18kHz) 2=L<20µH(f>171kHz)
|
||||||
* 防抖: 越界/恢复均连续 100tick(=1s) 才置位/清除 (调用点=稳定无车空闲)
|
* 防抖: 越界/恢复均连续 COIL_FAULT_HOLD_TICKS(500tick=5s) 才置位/清除
|
||||||
|
* (V4.36.21 加长, 下限判定重要防误检瞬态冲高)
|
||||||
*
|
*
|
||||||
* 镜像宏与固件一致 (改 COIL_* 时同步此处!)
|
* 镜像宏与固件一致 (改 COIL_* 时同步此处!)
|
||||||
*/
|
*/
|
||||||
@@ -15,6 +16,7 @@
|
|||||||
|
|
||||||
#define COIL_F_OK_MIN_KHZ 18
|
#define COIL_F_OK_MIN_KHZ 18
|
||||||
#define COIL_F_OK_MAX_KHZ 171
|
#define COIL_F_OK_MAX_KHZ 171
|
||||||
|
#define COIL_FAULT_HOLD_TICKS 500
|
||||||
#define COIL_DEF_C_NF 66
|
#define COIL_DEF_C_NF 66
|
||||||
|
|
||||||
static uint8_t g_coil_fault = 0;
|
static uint8_t g_coil_fault = 0;
|
||||||
@@ -34,7 +36,7 @@ static void coil_step(uint32_t f_khz)
|
|||||||
g_coil_bad_cnt = 0;
|
g_coil_bad_cnt = 0;
|
||||||
} else {
|
} else {
|
||||||
g_coil_bad_cnt++;
|
g_coil_bad_cnt++;
|
||||||
if (g_coil_bad_cnt >= 100) {
|
if (g_coil_bad_cnt >= COIL_FAULT_HOLD_TICKS) {
|
||||||
g_coil_fault = want;
|
g_coil_fault = want;
|
||||||
g_coil_bad_cnt = 0;
|
g_coil_bad_cnt = 0;
|
||||||
}
|
}
|
||||||
@@ -52,46 +54,46 @@ static void test_too_large(void)
|
|||||||
{
|
{
|
||||||
g_coil_fault = 0; g_coil_bad_cnt = 0;
|
g_coil_fault = 0; g_coil_bad_cnt = 0;
|
||||||
|
|
||||||
/* f=16.3kHz(实测超限线圈) 持续 <1s 不置位 */
|
/* f=16.3kHz(实测超限线圈) 持续 <5s 不置位 (V4.36.21 防抖加长防误检) */
|
||||||
run_ticks(16, 99);
|
run_ticks(16, 499);
|
||||||
assert(g_coil_fault == 0);
|
assert(g_coil_fault == 0);
|
||||||
/* 满 1s → L 偏大 */
|
/* 满 5s → L 偏大 */
|
||||||
coil_step(16);
|
run_ticks(16, 1);
|
||||||
assert(g_coil_fault == 1);
|
assert(g_coil_fault == 1);
|
||||||
/* 保持 → 状态稳定不抖 */
|
/* 保持 → 状态稳定不抖 */
|
||||||
run_ticks(16, 1000);
|
run_ticks(16, 1000);
|
||||||
assert(g_coil_fault == 1);
|
assert(g_coil_fault == 1);
|
||||||
printf("1. L偏大 (f=16kHz, 1s 防抖置位, 保持稳定) OK\n");
|
printf("1. L偏大 (f=16kHz, 5s 防抖置位, 保持稳定) OK\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_too_small(void)
|
static void test_too_small(void)
|
||||||
{
|
{
|
||||||
g_coil_fault = 0; g_coil_bad_cnt = 0;
|
g_coil_fault = 0; g_coil_bad_cnt = 0;
|
||||||
run_ticks(200, 100);
|
run_ticks(200, 500);
|
||||||
assert(g_coil_fault == 2);
|
assert(g_coil_fault == 2);
|
||||||
printf("2. L偏小 (f=200kHz, 1s 防抖置位) OK\n");
|
printf("2. L偏小 (f=200kHz, 5s 防抖置位) OK\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_recover(void)
|
static void test_recover(void)
|
||||||
{
|
{
|
||||||
g_coil_fault = 1; g_coil_bad_cnt = 0;
|
g_coil_fault = 1; g_coil_bad_cnt = 0;
|
||||||
run_ticks(62, 99);
|
run_ticks(62, 499);
|
||||||
assert(g_coil_fault == 1); /* 恢复防抖 <1s 不清除 */
|
assert(g_coil_fault == 1); /* 恢复防抖 <5s 不清除 */
|
||||||
coil_step(62);
|
run_ticks(62, 1);
|
||||||
assert(g_coil_fault == 0); /* 满 1s 恢复正常 */
|
assert(g_coil_fault == 0); /* 满 5s 恢复正常 */
|
||||||
printf("3. 恢复正常 (1s 防抖清除) OK\n");
|
printf("3. 恢复正常 (5s 防抖清除) OK\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_boundaries(void)
|
static void test_boundaries(void)
|
||||||
{
|
{
|
||||||
g_coil_fault = 0; g_coil_bad_cnt = 0;
|
g_coil_fault = 0; g_coil_bad_cnt = 0;
|
||||||
run_ticks(17, 100); assert(g_coil_fault == 1); /* 19 → 偏大 */
|
run_ticks(17, 500); assert(g_coil_fault == 1); /* 17 → 偏大 */
|
||||||
run_ticks(62, 100); assert(g_coil_fault == 0); /* 20~125 正常 */
|
run_ticks(62, 500); assert(g_coil_fault == 0); /* 62 正常(恢复) */
|
||||||
run_ticks(18, 100); assert(g_coil_fault == 0); /* 边界 20 正常 */
|
run_ticks(18, 500); assert(g_coil_fault == 0); /* 边界 18 正常 */
|
||||||
run_ticks(125, 100); assert(g_coil_fault == 0); /* 中间 125 正常 (V4.36.20 窗内) */
|
run_ticks(125, 500); assert(g_coil_fault == 0); /* 中间 125 正常 (V4.36.20 窗内) */
|
||||||
run_ticks(171, 100); assert(g_coil_fault == 0); /* 边界 171 (=L 20.15µH) 正常 */
|
run_ticks(171, 500); assert(g_coil_fault == 0); /* 边界 171 (=L 20.15µH) 正常 */
|
||||||
run_ticks(172, 100); assert(g_coil_fault == 2); /* 172 → L<20µH 偏小(断开级) */
|
run_ticks(172, 500); assert(g_coil_fault == 2); /* 172 → L<20µH 偏小(断开级) */
|
||||||
printf("4. 边界 19/20/171/172 OK\n");
|
printf("4. 边界 17/18/171/172 OK\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_jitter_no_alarm(void)
|
static void test_jitter_no_alarm(void)
|
||||||
@@ -112,6 +114,6 @@ int main(void)
|
|||||||
test_recover();
|
test_recover();
|
||||||
test_boundaries();
|
test_boundaries();
|
||||||
test_jitter_no_alarm();
|
test_jitter_no_alarm();
|
||||||
printf("\nALL PASS (窗口 18~171kHz=L 20µH, 防抖 1s)\n");
|
printf("\nALL PASS (窗口 18~171kHz=L 20µH, 防抖 5s)\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,6 +64,7 @@
|
|||||||
#define ENV_RECOVER_WAIT 200 // 恢复确认 (V4.31): 新基线替换后 环境空闲连续 ~2s 才解除预判, 黄灯灭
|
#define ENV_RECOVER_WAIT 200 // 恢复确认 (V4.31): 新基线替换后 环境空闲连续 ~2s 才解除预判, 黄灯灭
|
||||||
#define COIL_F_OK_MIN_KHZ 18 // 线圈频率合理窗 (V4.36.18): 默认低频档口径, <18kHz → L偏大 (≈双 250µH+ 大线圈放行)
|
#define COIL_F_OK_MIN_KHZ 18 // 线圈频率合理窗 (V4.36.18): 默认低频档口径, <18kHz → L偏大 (≈双 250µH+ 大线圈放行)
|
||||||
#define COIL_L_MIN_UH 20 // V4.36.20: 最低工作电感量 µH (43nF 低频档口径): L<此值 → 按线圈断开快闪指示
|
#define COIL_L_MIN_UH 20 // V4.36.20: 最低工作电感量 µH (43nF 低频档口径): L<此值 → 按线圈断开快闪指示
|
||||||
|
#define COIL_FAULT_HOLD_TICKS 500 // V4.36.21: 电感量越界/恢复防抖 500tick=5s (原100=1s; 下限判定重要, 加长防误检瞬态冲高)
|
||||||
#define COIL_F_OK_MAX_KHZ 171 // 线圈频率合理窗 (V4.36.20): >171kHz → L<20µH(COIL_L_MIN_UH) 断开级偏小 (43nF: L=2.533e7/(f²×43); 原125=38µH 放宽至 20µH)
|
#define COIL_F_OK_MAX_KHZ 171 // 线圈频率合理窗 (V4.36.20): >171kHz → L<20µH(COIL_L_MIN_UH) 断开级偏小 (43nF: L=2.533e7/(f²×43); 原125=38µH 放宽至 20µH)
|
||||||
#define COIL_CAL_C_NF 43 // 标定等效谐振电容 nF (V4.34): 三极管库存板 低频档(66nF名义, R19在/R27空)实测 C_eff≈43 (41.3~45.5; 0Ω板68仅实验口径, 产品不用)
|
#define COIL_CAL_C_NF 43 // 标定等效谐振电容 nF (V4.34): 三极管库存板 低频档(66nF名义, R19在/R27空)实测 C_eff≈43 (41.3~45.5; 0Ω板68仅实验口径, 产品不用)
|
||||||
// 旧43 = 5.1K电阻旧板带病特性(三极管开关未饱和导通, 第二颗33nF未全量并入), 作废
|
// 旧43 = 5.1K电阻旧板带病特性(三极管开关未饱和导通, 第二颗33nF未全量并入), 作废
|
||||||
|
|||||||
@@ -14,11 +14,11 @@
|
|||||||
#define __CMCNG_H__
|
#define __CMCNG_H__
|
||||||
|
|
||||||
#define PRODUCT_MODEL "DLD154"
|
#define PRODUCT_MODEL "DLD154"
|
||||||
#define FIRMWARE_VER "4.36.20" // 主.子.修订 (2026-09-03 起: 小改动只增 REV; MAIN/SUB 由产品定)
|
#define FIRMWARE_VER "4.36.21" // 主.子.修订 (2026-09-03 起: 小改动只增 REV; MAIN/SUB 由产品定)
|
||||||
#define HARDWARE_VER "3.00"
|
#define HARDWARE_VER "3.00"
|
||||||
#define FIRMWARE_VER_MAIN 4
|
#define FIRMWARE_VER_MAIN 4
|
||||||
#define FIRMWARE_VER_SUB 36
|
#define FIRMWARE_VER_SUB 36
|
||||||
#define FIRMWARE_VER_REV 20
|
#define FIRMWARE_VER_REV 21
|
||||||
#define HARDWARE_VER_MAIN 3
|
#define HARDWARE_VER_MAIN 3
|
||||||
#define HARDWARE_VER_SUB 0
|
#define HARDWARE_VER_SUB 0
|
||||||
|
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ uint8_t g_release_need = 3; // V4.36.8: 释放确认样本数 (按Q
|
|||||||
uint8_t g_fault_phase = 0;
|
uint8_t g_fault_phase = 0;
|
||||||
uint16_t g_fault_tick = 0;
|
uint16_t g_fault_tick = 0;
|
||||||
uint8_t g_coil_fault = 0; // V4.26: 线圈电感量异常 0=正常 1=L偏大(f<18kHz→一长一短) 2=L<COIL_L_MIN_UH(f>171kHz→断开级快闪, V4.36.20)
|
uint8_t g_coil_fault = 0; // V4.26: 线圈电感量异常 0=正常 1=L偏大(f<18kHz→一长一短) 2=L<COIL_L_MIN_UH(f>171kHz→断开级快闪, V4.36.20)
|
||||||
uint16_t g_coil_bad_cnt = 0; // V4.26: 电感异常防抖计数 (100tick=1s 置位/清除)
|
uint16_t g_coil_bad_cnt = 0; // V4.26: 电感异常防抖计数 (V4.36.21: 500tick=5s 置位/清除, 宏 COIL_FAULT_HOLD_TICKS)
|
||||||
|
|
||||||
/*===========================================================================
|
/*===========================================================================
|
||||||
* 调试计数器
|
* 调试计数器
|
||||||
@@ -932,7 +932,7 @@ static uint32_t coil_l_uH(uint32_t f_khz)
|
|||||||
* (黄灯"一长一短"告警, 见 poll_yellow_led 模式5)
|
* (黄灯"一长一短"告警, 见 poll_yellow_led 模式5)
|
||||||
* 调用点保证: 仅稳定 + 无车空闲 + 未断开时执行 (车压/自检/断开不判)
|
* 调用点保证: 仅稳定 + 无车空闲 + 未断开时执行 (车压/自检/断开不判)
|
||||||
* g_coil_fault: 0=正常 1=L偏大(f<20kHz) 2=L偏小(f>120kHz)
|
* g_coil_fault: 0=正常 1=L偏大(f<20kHz) 2=L偏小(f>120kHz)
|
||||||
* 防抖: 越界/恢复均连续 100tick(=1s) 才置位/清除
|
* 防抖: 越界/恢复均连续 COIL_FAULT_HOLD_TICKS(500tick=5s, V4.36.21) 才置位/清除 — 下限判定重要, 加长防误检
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
static void coil_monitor(void)
|
static void coil_monitor(void)
|
||||||
{
|
{
|
||||||
@@ -951,7 +951,7 @@ static void coil_monitor(void)
|
|||||||
g_coil_bad_cnt = 0; /* 状态一致 → 计时复位 */
|
g_coil_bad_cnt = 0; /* 状态一致 → 计时复位 */
|
||||||
} else {
|
} else {
|
||||||
g_coil_bad_cnt++;
|
g_coil_bad_cnt++;
|
||||||
if (g_coil_bad_cnt >= 100) {
|
if (g_coil_bad_cnt >= COIL_FAULT_HOLD_TICKS) {
|
||||||
if (g_coil_fault == 0)
|
if (g_coil_fault == 0)
|
||||||
PRINT("EVT|coil_fault f:%d kHz L~%lu uH Xn:%d %s\n",
|
PRINT("EVT|coil_fault f:%d kHz L~%lu uH Xn:%d %s\n",
|
||||||
f_khz, coil_l_uH(f_khz), loop1_Xn,
|
f_khz, coil_l_uH(f_khz), loop1_Xn,
|
||||||
|
|||||||
Reference in New Issue
Block a user