feat(V4B): V4.36.37 — 电感分级降级 (方案A 用户拍板)

低于下限拆两级, COIL_UNDER_MIN_AS_OPEN 作用域 156k→171k:
- fault=2: 156~171k (L 20~24µH) 可用级 → 黄灯疾闪 100ms(与断开200ms区分), 判定恒照常
- fault=3: f>171k (L<20µH) 短路级 → 断开级快闪 200ms; 宏=1 等同断开(判车停+RLY释放+绿灯灭)
- coil_monitor_recover: 回窗≤171k(非156k) + 恢复实时置档(原清0有5s黄灯空档)
- tests 镜像四分: 157/171→2, 172→3; 文案同步
- spec V2.55 / manual V2.14 / devlog V2.73
语法0 error, 4测试全绿
This commit is contained in:
wangfq
2026-09-09 09:30:12 +08:00
parent 7ab0010055
commit 2be9e3c208
7 changed files with 80 additions and 42 deletions
+1
View File
@@ -2151,6 +2151,7 @@ if (dev >= dlt_ORG × 4) {
| 版本 | 时间 | 说明 |
|------|------|------|
| V2.73 | 2026-09-08 | V4.36.37 电感分级降级(方案A): fault2=156~171k疾闪100ms恒判车 / fault3=f>171k短路级断开快闪(宏作用域移171k), recover 实时置档 |
| V2.72 | 2026-09-08 | spec 6.3/10.1 黄灯行为表补 V4.36.25 三分+低于下限宏解耦说明 (文档) |
| V2.71 | 2026-09-08 | V4.36.36 就绪巩固期 Q 分级(高5s/中7s/低10s): 低Q 上电首压防卡 |
| V2.70 | 2026-09-08 | V4.36.35 EMA cast 根治(有符号先除): (uint32)负差/128=+3355万爆炸源; ADR 条件修复 |
+7 -3
View File
@@ -186,8 +186,10 @@ SW_5 = ON 时:车辆(金属)持续压线超过 **4 分钟**LC_HOLD_TIME
| 故障类型 | 红灯 | 绿灯 | 黄灯 | 说明 |
|---------|------|------|------|------|
| 线圈断开(当前)**L<24µH**V4.36.25f>156kHz 低于最低工作电感 24µH) | 呼吸 | 灭 | **快闪** (200ms) | 宏 COIL_UNDER_MIN_AS_OPEN0=仅黄灯快闪(判定/继电器/绿灯照常);1=视为断开完全态(继电器保持释放+绿灯不亮+判定停)。检查线圈连接。**断开前有车:继电器保持 RELAY_HOLD_MS=1000ms 后仍断才释放**(防瞬时断开误释放,宏可调)。**重连后无车判稳门控**:值稳定(600ms 无漂移)且回带内才放行检测,判稳期黄灯保持快闪,Origin 自动对齐新空场 |
| 线圈电感量不合理(V4.26/V4.36.25 | 呼吸 | 灭(无车 | **一长一短** (900ms亮/300ms灭/100ms亮/700ms灭 循环) | 空场频率出合理窗 18~125kHz43nF):f<18k → L 偏大(>1.15mH)125k<f≤156k → L 偏小(24~38µH,出窗但高于下限);检查线圈匝数/尺寸。**L<24µH(f>156k) 为下限以下→快闪,见上行** |
| 线圈断开(当前) | 呼吸 | 灭 | **快闪** (200ms) | 检查线圈连接。**断开前有车:继电器保持 RELAY_HOLD_MS=1000ms 后仍断才释放**(防瞬时断开误释放,宏可调)。**重连后无车判稳门控**:值稳定(600ms 无漂移)且回带内才放行检测,判稳期黄灯保持快闪,Origin 自动对齐新空场 |
| 电感量短路级(**L<20µHf>171kHz**V4.36.37 | 呼吸 | 灭(宏=1 时 | **快闪** (200ms,与断开同款) | 匝间短路/线圈损坏级。宏 COIL_UNDER_MIN_AS_OPEN0=仅快闪(判定/继电器/绿灯照常);1=视为断开完全态(继电器保持释放+绿灯不亮+判定停,恢复=f 回窗≤171k 连续 5s)。检查线圈是否短路、核对匝数(43nF 档真短路阈 20µH) |
| 电感量可用级(**L 20~24µH156<f≤171k**V4.36.37 | 呼吸 | 灭(无车) | **疾闪 100ms**(与断开 200ms 区分) | 低于下限但可用:判定/继电器照常,仅提示电感偏低。现场可见"电感偏低但可用"与真断开/短路区分 |
| 线圈电感量出合理窗(V4.26/V4.36.25 | 呼吸 | 灭(无车) | **一长一短** (900ms亮/300ms灭/100ms亮/700ms灭 循环) | 空场频率出合理窗 18~125kHz43nF):f<18k → L 偏大(>1.15mH)125k<f≤156k → L 偏小(24~38µH,出窗但高于下限);检查线圈匝数/尺寸。**f>156k 为下限以下(分级),见上行两行** |
| 线圈重连,断开 1 次 | 呼吸 | 正常 | **1 短闪** + 1.2s 灭 | 发生过 1 次断开,已恢复 |
| 线圈重连,断开 2 次 | 呼吸 | 正常 | **2 短闪** + 1.2s 灭 | 发生过 2 次断开,已恢复 |
| 线圈重连,断开 3+ 次 | 呼吸 | 正常 | **3 短闪** + 1.2s 灭 | 多次断开,建议检查接头 |
@@ -243,7 +245,8 @@ SW_5 = ON 时:车辆(金属)持续压线超过 **4 分钟**LC_HOLD_TIME
| 现象 | 可能原因 | 处理方法 |
|------|---------|----------|
| 黄灯快闪,绿灯灭 | 线圈断开/未连接,或电感量 <24µHf>156kHz) | 检查线圈接头、引线通断;小线圈核对匝数(43nF 档最低 24µH |
| 黄灯快闪200ms,绿灯灭 | 线圈断开/未连接,或电感量 <20µHf>171kHz 短路级,宏=1 时绿灯灭) | 检查线圈接头、引线通断;小线圈核对匝数(43nF 档真短路阈 20µH |
| 黄灯疾闪(100ms | 电感量 20~24µH156~171kHz 可用级)——线圈偏低但可用 | 可继续使用;如需消除提示核对匝数(43nF 档可用下限 20µH) |
| 绿灯常亮不灭 | 灵敏度太高 / 线圈频率漂移 | 降低灵敏度 / 检查线圈 |
| 绿灯从不亮 | 灵敏度太低 / 线圈 Q 值过低 | 提高灵敏度 / 更换线圈 |
| 红灯不亮 | 电源故障 | 检查供电电压 |
@@ -275,6 +278,7 @@ SW_5 = ON 时:车辆(金属)持续压线超过 **4 分钟**LC_HOLD_TIME
| V2.11 | 2026-08-28 | 灵敏度 0/1 档对齐 PD132T216/108→300/60),客户现场替换平滑交付 |
| V2.12 | 2026-09-02 | 指示灯/自检描述更新(固件 V4.23:红灯呼吸≈2.6s、绿灯自检闪烁至基准稳定) |
| V2.13 | 2026-09-04 | 黄灯行为全面同步 V4.30~36:一长一短 300/100/100/700ms、频率窗 20~115kHz(f>115k 告警)、环境校准 2s/7s/2s(总~15s)、铁块 7s+ 学入 |
| V2.14 | 2026-09-08 | 电感分级降级(固件 V4.36.37 方案A):f>156k 拆分——156~171k 可用级疾闪100ms(恒判车)、f>171k 短路级快闪200ms(宏=1 等同断开);真短路阈 20µH |
---
+11 -8
View File
@@ -1,6 +1,6 @@
# DLD154V4B 技术规格书
> 单路线圈车辆检测器 | 固件版本: V4.36.36 | 文档版本: V2.54
> 单路线圈车辆检测器 | 固件版本: V4.36.37 | 文档版本: V2.55
> 本文档面向工程开发、系统集成及故障深度分析
---
@@ -527,19 +527,20 @@ void poll_green_led(void) {
| 优先级 | 条件 | 行为 | 参数 | 诊断含义 |
|--------|------|------|------|---------|
| 1 | `g_disconnect_active == 1``!g_loop_power_up_state` | **快闪** | 200ms 亮 / 200ms 灭 | 线圈当前断开中 / 从无线圈上电 |
| 1 | **`g_coil_fault == 2`V4.36.20/25** | **快闪**(同断开级) | 200ms 亮 / 200ms 灭 | **电感量低于下限 L<24µH43nFf>156kHz**——断开级指示(匝间短路/线圈损坏级) |
| 1 | **`g_coil_fault == 3`V4.36.37 短路级** | **快闪**(同断开级) | 200ms 亮 / 200ms 灭 | **电感量 <20µHf>171kHz,真短路级**——断开级指示;功能随 `COIL_UNDER_MIN_AS_OPEN` |
| 4 | `g_env_warn``g_env_resync` | **常亮** | — | 环境异常预判/重校准学习(V4.24/25/31;预判 2s 锁存、累计 7s 触发学习、替换后空闲 2s 灭) |
| 6 | **`g_coil_fault == 2`V4.36.37 可用级)** | **疾闪**(独立节奏) | 100ms 亮 / 100ms 灭 | **电感量 20~24µH156<f≤171k,低于下限但可用)**——判定恒照常,与真断开可区分 |
| 5 | `g_coil_fault == 1`V4.36.25 三分) | **一长一短** | 长亮 900ms / 灭 300ms / 短亮 100ms / 灭 700ms 循环 | 电感量出合理窗(仍继续判车):f<18kHz=L偏大(>1.15mH) **或** 125k<f≤156k=L偏小(24~38µH) |
| 3 | `g_disconnect_count == 1` | **1 短闪** | 80ms 亮 / 200ms 灭 → 1.2s 灭(循环) | 断开 1 次,已恢复 |
| 3 | `g_disconnect_count == 2` | **2 短闪** | 同上 | 断开 2 次 |
| 3 | `g_disconnect_count >= 3` | **3 短闪** | 同上 | 断开 3+ 次 |
| 2 | 正常 | **灭** | — | 一切正常 |
> **V2.54 注:L<24µHf>156kHz`g_coil_fault==2`)的指示与功能解耦(宏 `COIL_UNDER_MIN_AS_OPEN`V4.36.24**
> - 指示:无论宏值,黄灯一律**快闪**(与断开同显示,见上表第 2 行)
> - 功能(判定/继电器/绿灯):
> - `COIL_UNDER_MIN_AS_OPEN=0`(默认):**仍正常判车**(车来触发继电器+绿灯亮、车走释放)——快闪仅作"电感异常"提示,防误杀可用线圈
> - `COIL_UNDER_MIN_AS_OPEN=1`**等同线圈断开完全态**——判车暂停(vd1_task 挂起)+ 继电器保持释放 + 绿灯不亮;恢复=coil_monitor_recover 无条件监测,f 回窗 18~156k 连续 5s → 重连确认+判稳
> **V2.55 注:电感低于下限的分级(V4.36.37 方案A,用户拍板)——指示与功能解耦**
> - **可用级 fault==2156~171kL 20~24µH**:黄灯**疾闪 100ms**(独立节奏,与真断开可区分);判定/继电器/绿灯**恒照常**(不随宏)——23µH 类"低但可用"线圈不误杀
> - **短路级 fault==3f>171kL<20µH**:黄灯**快闪 200ms**(与断开同款)——功能随 `COIL_UNDER_MIN_AS_OPEN`(宏作用域 V4.36.37 从 156k 移到 171k):
> - =0(默认):仍正常判车,快闪仅作"真短路/损坏"提示
> - =1等同线圈断开完全态——判车暂停(vd1_task 挂起)+ 继电器保持释放 + 绿灯不亮;恢复=coil_monitor_recover 无条件监测,f 回窗 ≤171k 连续 5s → 按当前 f 实时置档+重连确认+判稳
> - 防抖:越界/恢复均 COIL_FAULT_HOLD_TICKS=5005sV4.36.21
```c
@@ -663,7 +664,8 @@ LC_Reset 在下次 Car_In 清除;V4.36.4 绿灯=RLY2 镜像 → 复位期间
| 线圈短路 | Xn 持续为 0 或极小 | 黄灯快闪 / 继电器释放 |
| 电感量出窗(偏大) | 空场 f 持续 < 18 kHzL>1.15mHV4.36.25 | 黄灯**一长一短**g_coil_fault=1/ 防抖 5s |
| 电感量出窗(偏小) | 空场 125k < f ≤ 156kL 24~38µHV4.36.25 | 黄灯**一长一短**g_coil_fault=1/ 防抖 5s,仍判车 |
| **电感量低于下限** | 空场 f > 156 kHzL<24µHV4.36.20~25 | 黄灯**快闪(断开级)**g_coil_fault=2);功能随 `COIL_UNDER_MIN_AS_OPEN`:0=仍判车 / 1=等同断开(判车停+继电器释放+绿灯灭);防抖 5s |
| **电感量低于下限·可用级** | 空场 156 < f 171 kHzL 20~24µHV4.36.37 | 黄灯**疾闪 100ms**g_coil_fault=2,独立节奏与断开区分);判定/继电器恒照常(不随宏);防抖 5s |
| **电感量短路级** | 空场 f > 171 kHzL<20µHV4.36.37 | 黄灯**快闪 200ms(断开同款)**g_coil_fault=3);功能随 `COIL_UNDER_MIN_AS_OPEN`:0=仍判车 / 1=等同断开(判车停+继电器释放+绿灯灭);恢复回窗≤171k 连续 5s 实时置档;防抖 5s |
### 10.2 黄灯编码设计
@@ -856,3 +858,4 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的
| V2.52 | 2026-09-08 | **V4.36.35 EMA cast 顺序根治**(uint32_t)负差/128 = +3355万/样本(C 语义: 负 cast uint32 后无符号除法)——V4.36.31 引入的 EMA 爆炸源, V4.36.34 自愈每样本兜住(炸+重置净零)掩盖; 修: 有符号先除 (uint32_t)(_ema_d/128)。35µH V4.36.34 全绿: 13+ cycle 正常+band_timeout 兜底 2 次实战; ADR 条件修复(_t_ms 恒 2000 原永不触发) |
| V2.53 | 2026-09-08 | **V4.36.36 就绪巩固期 Q 分级**:低Q 上电判稳完(绿灯灭)即压板 → 绿灯常亮(系统未收敛完)。判稳完成后再按 Q 档绿灯继续慢闪: 高Q 5s(READY_HOLD_HI=1000)/中Q 7s(MID=1400)/低Q 10s(LO=2000, 5ms tick)——期间 Origin/EMA/滤波继续收敛, 绿灯灭才允许操作。Loop stable 打印带 ready:Ns |
| V2.54 | 2026-09-08 | 文档补全:6.3 黄灯行为表更新 V4.36.25 三分语义——fault==2(L<24µH f>156k) 与断开同快闪(行 2)fault==1 一长一短含 125~156k;新增 COIL_UNDER_MIN_AS_OPEN 宏指示/功能解耦说明;10.1 故障表同步 18k/156k 三分 + 宏 + 防抖 5s |
| V2.55 | 2026-09-08 | **V4.36.37 电感分级降级(方案A, 用户拍板)**:低于下限拆两级——156~171k(L20~24µH)=fault2 疾闪100ms(恒判车, 与断开区分)f>171k(L<20µH)=fault3 短路级断开快闪(COIL_UNDER_MIN_AS_OPEN 作用域 156k→171k)recover 回窗≤171k 且恢复实时置档(原清0有5s黄灯空档) |
+13 -7
View File
@@ -2,8 +2,9 @@
* 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)
* (43nF , V4.36.37 A ):
* g_coil_fault: 0= 1=(f<18k 125<f156k) 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 , )
*
@@ -17,6 +18,7 @@
#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
@@ -30,6 +32,8 @@ static void coil_step(uint32_t f_khz)
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)
@@ -73,8 +77,8 @@ 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");
assert(g_coil_fault == 3);
printf("2. 短路级 (f=200kHz, 5s 防抖置位 fault=3) OK\n");
}
static void test_recover(void)
@@ -96,8 +100,10 @@ static void test_boundaries(void)
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 → L<24µH 下限, 快闪(断开级) */
printf("4. 边界 17/18/125/126/156/157 OK\n");
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)
@@ -118,6 +124,6 @@ int main(void)
test_recover();
test_boundaries();
test_jitter_no_alarm();
printf("\nALL PASS (合理窗18~125kHz=L≥38µH; 126~156=一长一短; >156k=L<24µH快闪; 防抖 5s)\n");
printf("\nALL PASS (合理窗18~125kHz; 126~156=一长一短; 157~171=疾闪L20~24µH恒判车; >171=L<20µH短路级快闪; 防抖 5s)\n");
return 0;
}
@@ -81,9 +81,13 @@
#define ENV_WARN_WAIT 200 // 环境预判 (V4.31): dev>+4dlt 高位连续 ~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_L_MIN_UH 24 // V4.36.23/25: 最低工作电感量 µH (43nF 口径, 对应 COIL_L_MIN_F_KHZ=156): L<此值 → 黄灯快闪(断开级), 可 COIL_UNDER_MIN_AS_OPEN 切完全断开
#define COIL_UNDER_MIN_AS_OPEN 0 // V4.36.24: L<下限 是否视为线圈断开完全状态: 1=黄灯快闪+继电器保持释放+绿灯不亮(同真正断开, 判定停);
// 0=仅黄灯快闪(断开级指示), 绿灯/继电器/判定照常工作
#define COIL_L_MIN_UH 24 // V4.36.23/25: 出窗偏小指示阈值 µH (对应 COIL_L_MIN_F_KHZ=156): L<此值 → 黄灯疾闪 100ms(独立节奏), 判定恒照常
#define COIL_L_SHORT_UH 20 // V4.36.37: 真短路级阈值 µH (方案A 分级): L<20µH(f>171k) → 断开级快闪(200ms, 与真断开同款), COIL_UNDER_MIN_AS_OPEN 作用于此级
#define COIL_L_SHORT_F_KHZ 171 // V4.36.37: f@20µH=171.6k 取 171: f>此值 → L<20µH 短路级
#define COIL_UNDER_MIN_AS_OPEN 0 // V4.36.24/37: L<20µH(f>171k, 短路级) 是否视为线圈断开完全状态(方案A 作用域从 156k 移到 171k):
// 1=黄灯快闪+继电器保持释放+绿灯不亮(同真正断开, 判定停)+专职恢复监测;
// 0=仅黄灯快闪(断开级指示), 绿灯/继电器/判定照常
// 156~171k(L 20~24µH) 恒判车照常+疾闪, 不随此宏
#define COIL_FAULT_HOLD_TICKS 500 // V4.36.21: 电感量越界/恢复防抖 500tick=5s (原100=1s; 下限判定重要, 加长防误检瞬态冲高)
#define COIL_F_OK_MAX_KHZ 125 // 线圈频率合理窗上限 (V4.36.25 恢复): >125kHz(43nF≈38µH) → L偏小不合理 → 黄灯一长一短 (V4.36.9 口径不变)
#define COIL_L_MIN_F_KHZ 156 // V4.36.25: 低于下限频率 (43nF: L=2.533e7/(f²×43), f@24µH=156.7k): f>此值 → L<COIL_L_MIN_UH → 黄灯快闪(断开级)
+2 -2
View File
@@ -14,11 +14,11 @@
#define __CMCNG_H__
#define PRODUCT_MODEL "DLD154"
#define FIRMWARE_VER "4.36.36" // 主.子.修订 (2026-09-03 起: 小改动只增 REV; MAIN/SUB 由产品定)
#define FIRMWARE_VER "4.36.37" // 主.子.修订 (2026-09-03 起: 小改动只增 REV; MAIN/SUB 由产品定)
#define HARDWARE_VER "3.00"
#define FIRMWARE_VER_MAIN 4
#define FIRMWARE_VER_SUB 36
#define FIRMWARE_VER_REV 36
#define FIRMWARE_VER_REV 37
#define HARDWARE_VER_MAIN 3
#define HARDWARE_VER_SUB 0
+39 -19
View File
@@ -177,7 +177,7 @@ uint32_t g_stab_base = 0; // V4.36.15: 步进比较基准 CAPVD
uint8_t g_release_need = 3; // V4.36.8: 释放确认样本数 (按Q档, 高3/中4/低5)
uint8_t g_fault_phase = 0;
uint16_t g_fault_tick = 0;
uint8_t g_coil_fault = 0; // V4.26/25: 电感量异常 0=正常 1=出合理窗18~125kHz→一长一短(f<18k L偏大 / 125k<f≤156k L偏小) 2=L<24µH(f>156kHz, COIL_L_MIN_F_KHZ)→断开级快闪
uint8_t g_coil_fault = 0; // V4.26/25/37: 电感量异常 0=正常 1=出合理窗→一长一短(f<18k L偏大 / 125k<f≤156k L偏小) 2=156<f≤171k L20~24µH→疾闪100ms(恒判车) 3=f>171k L<20µH短路级→断开级快闪(宏=1 等同断开)
uint16_t g_coil_bad_cnt = 0; // V4.26: 电感异常防抖计数 (V4.36.21: 500tick=5s 置位/清除, 宏 COIL_FAULT_HOLD_TICKS)
/*===========================================================================
@@ -419,9 +419,9 @@ void poll_yellow_led(void)
* !loop1_LOOP_OK: 线 + (5ms , loop_task 150ms
* disconnect_active; phase power_up=0 , )
* g_reconn_stab:
* g_coil_fault==2: < COIL_L_MIN_UH(24µH, f>156kHz) 线
* g_coil_fault==3: < COIL_L_SHORT_UH(20µH, f>171kHz, V4.36.37 ) 线
* 线/: LOOP_OK=1 , 绿 ---*/
if (!loop1_LOOP_OK || g_reconn_stab || g_coil_fault == 2) {
if (!loop1_LOOP_OK || g_reconn_stab || g_coil_fault == 3) {
if (g_fault_tick >= FLT_FAST_HALF) {
g_fault_tick = 0;
LED_YELLOW_GPIO->odt ^= LED_YELLOW_PIN; // toggle
@@ -441,11 +441,22 @@ void poll_yellow_led(void)
return;
}
/*--- V4.36.37 模式6: 电感量低于下限可用级(156~171k, L 20~24µH) → 疾闪 100ms
* /(200ms) "电感偏低但可用", ---*/
if (g_coil_fault == 2) {
if (g_fault_tick >= 20) { // 100ms (20 × 5ms)
g_fault_tick = 0;
LED_YELLOW_GPIO->odt ^= LED_YELLOW_PIN; // toggle
}
g_fault_phase = 0;
return;
}
/*--- V4.26/25 模式5: 线圈电感量出合理窗(18~125kHz) → 一长一短
* 900ms(180tick) 300ms(60) 100ms(20) 700ms(140),
* g_coil_fault: 1=f<18k L偏大 125k<f156k L偏小();
* 2=L<24µH(f>156k) 1 (V4.36.20/25)
* : (1) > (4) > (5) > N短闪(3) > ---*/
* 2=156~171k (V4.36.37); 3=L<20µH 1
* : (1) > (4) > (6) > (5) > N短闪(3) > ---*/
if (g_coil_fault == 1) {
static const uint16_t dur[4] = { 180, 60, 20, 140 }; // 900/300/100/700ms (V4.36.13: 灭 100→300ms)
if (g_fault_phase > 3) g_fault_phase = 0;
@@ -827,10 +838,10 @@ void TMR15_GLOBAL_IRQHandler(void)
/* V4.36.24: L<下限视为断开完全态(宏=1) — 载波强制为断:
* (vd1_task /), RLY , 绿 */
if (COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 2)
if (COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 3)
loop1_LOOP_OK = 0;
if (loop1_LC_Reset == 0 && !(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 2)) {
if (loop1_LC_Reset == 0 && !(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 3)) {
/* 继电器 2(辅助/方向) */
if (loop1_VD_FLAG)
RLY2_ON;
@@ -864,7 +875,7 @@ void TMR15_GLOBAL_IRQHandler(void)
* - ()
* (VD_FLAG=0), */
if (!loop1_LOOP_OK && loop1_VD_FLAG && g_loop_power_up_state && !g_relay_hold_done
&& !(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 2)) { /* V4.36.24: 强制期不保持(保持释放) */
&& !(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 3)) { /* V4.36.24: 强制期不保持(保持释放) */
RLY1_ON; /* 保持: 防止瞬时断开继电器抖落 */
RLY2_ON;
g_relay_hold_cnt += 5;
@@ -963,7 +974,7 @@ static uint32_t coil_l_uH(uint32_t f_khz)
* : , 20~120kHz,
* ("一长一短", poll_yellow_led 5)
* : + + (//)
* g_coil_fault: 0= 1=L偏大(f<20kHz) 2=L偏小(f>120kHz)
* g_coil_fault: 0= 1= 2=156~171k疾闪() 3=f>171k短路级()
* : / COIL_FAULT_HOLD_TICKS(500tick=5s, V4.36.21) / ,
*===========================================================================*/
static void coil_monitor(void)
@@ -974,14 +985,17 @@ static void coil_monitor(void)
if (loop1_Origin == 0 || f_khz == 0)
return; /* 无有效基准 → 维持原状 */
/* V4.36.25分语义 (43nF):
* f<18k want=1 L偏大(>)
* f>156k want=2 L<24µH ()
* 125k<f156k want=1 L偏小() */
/* V4.36.25/37 四分语义 (43nF, 方案A 分级):
* f<18k want=1 L偏大
* 125k<f156k want=1 L偏小()
* 156k<f171k want=2 L 20~24µH 100ms(),
* f>171k want=3 L<20µH (200ms), COIL_UNDER_MIN_AS_OPEN */
if (f_khz < COIL_F_OK_MIN_KHZ)
want = 1; /* L 偏大 */
else if (f_khz > COIL_L_SHORT_F_KHZ)
want = 3; /* L<20µH 短路级 → 断开级快闪 */
else if (f_khz > COIL_L_MIN_F_KHZ)
want = 2; /* L<下限 → 断开级快闪 */
want = 2; /* 156~171k L20~24µH → 疾闪(可用级) */
else if (f_khz > COIL_F_OK_MAX_KHZ)
want = 1; /* L 偏小(出合理窗, 不低于下限) → 一长一短 */
@@ -993,7 +1007,8 @@ static void coil_monitor(void)
if (g_coil_fault == 0)
PRINT("EVT|coil_fault f:%d kHz L~%lu uH Xn:%d %s\n",
f_khz, coil_l_uH(f_khz), loop1_Xn,
(want == 2) ? "below_l_min" :
(want == 3) ? "below_l_short" :
(want == 2) ? "below_l_min_20_24u" :
(f_khz < COIL_F_OK_MIN_KHZ) ? "too_large" : "too_small");
else
PRINT("EVT|coil_ok f:%d kHz\n", f_khz);
@@ -1011,18 +1026,23 @@ static void coil_monitor_recover(void)
{
uint32_t f_khz;
if (!(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 2))
if (!(COIL_UNDER_MIN_AS_OPEN && g_coil_fault == 3))
return; /* 非强制断开期 → 原 coil_monitor 负责 */
f_khz = calc_freq_khz(loop1_Origin, loop1_LPCNT);
if (f_khz == 0 || f_khz < COIL_F_OK_MIN_KHZ || f_khz > COIL_L_MIN_F_KHZ) {
g_coil_bad_cnt = 0; /* 仍低于下限/载波无效 → 继续等 */
if (f_khz == 0 || f_khz < COIL_F_OK_MIN_KHZ || f_khz > COIL_L_SHORT_F_KHZ) {
g_coil_bad_cnt = 0; /* 仍短路级/载波无效 → 继续等 (V4.36.37: 回窗改为 ≤171k) */
return;
}
g_coil_bad_cnt++;
if (g_coil_bad_cnt >= COIL_FAULT_HOLD_TICKS) {
PRINT("EVT|coil_ok f:%d kHz (recover from L<min as-open)\n", f_khz);
g_coil_fault = 0;
/* V4.36.37: 按当前 f 实时置档(非清 0) — 避免回 156~171k 可用级/125~156k 出窗区
* 5s ( 0 coil_monitor ) */
g_coil_fault = (f_khz < COIL_F_OK_MIN_KHZ) ? 1 :
(f_khz > COIL_L_SHORT_F_KHZ) ? 3 :
(f_khz > COIL_L_MIN_F_KHZ) ? 2 :
(f_khz > COIL_F_OK_MAX_KHZ) ? 1 : 0;
g_coil_bad_cnt = 0;
}
}