5fd58e035a3d7fe35cb1fd3934c7bd0c717afd81
用户反馈: 黄灯常亮故障补偿后, 金属板进入触发的高度比断电上电后低很多, 补偿结束也恢复不了正常灵敏度。
根因(两处, 均可复核): V4B 进入判定用 vac_ref()=min(Origin, 真空EMA) 而非 Origin (TaskLoop.c:1432)
① env_resync_apply() 只原子换 loop1_Origin, 没同步 g_vacuum_ema。补偿前提是 dev>+4×dlt 连续 7s,
学到的 B≈当前 CAPVD ⇒ Δ≥4×dlt 必然 ⇒ Origin−EMA=Δ>1×dlt ⇒ vac_ref 必然切旧 EMA ⇒ 进入线整整低 Δ
② g_vacuum_ema += _ema_d/128 为整数除法, |d|<128 时步进恒 0 ⇒ EMA 粘在真空下方 ≤127 counts
(2.59×dlt > 1×dlt 门槛) ⇒ 进入线常驻偏低 ≈0.100% Δf/f 且不自愈; 断电上电 EMA=Origin(偏差 0) 故持久正常
修复:
- 新增 origin_set_atomic() (TaskLoop.c:308): "一步换 Origin"时 |ΔOrigin| > ORIGIN_JUMP_REANCH_DLT(=1)×dlt
则同步重锚 g_vacuum_ema; 与 VAC_REF_DELTA_DLT 同口径 ⇒ 维持 |Origin−EMA| ≤ 1×dlt 不变式; 小步不动 EMA
- 3 处 Origin 写入点改经它: env_resync_apply(:968) / 重连判稳完成(:1207) / 冻结超时更新(:1372)
- EMA 更新改余数累加器 g_vac_frac(:1344) 消 ±127 counts 死区; g_vac_frac 在 INIT(:583)/判稳(:1266) 清零
单测(新增 tests/test_vac_ref_reanchor.c, 5 场景; gcc -O0 -Wall -Wextra 0 warning; 全套 8/8 全绿):
补偿后进入线 130457(低 130 counts = 2.65×dlt = 0.100% Δf/f) → 130587(低 0); EMA 追赶偏差 127→0 counts
文档: devlog V2.78(+条目) / spec 文档头 V2.60 / manual 版本表 V2.17 / cmcng.h 4.36.40→4.36.41 (REV 41)
归档: docs/env-resync-trigger-line-analysis.md + docs/patches/v4.36.41-{A-B,D}*.diff
待现场(编译烧录后回填 devlog 条目): 4 项 [ ] + 2 处日志待填 (EVT|env_resync / DBG Origin·VEM·RLN)
DLD154V4B — 单路车检器
硬件规格
| 项目 | 说明 |
|---|---|
| 产品型号 | DLD154V4B |
| 主控 MCU | AT32F421F8P7 |
| 内核 | ARM Cortex-M4 |
| 主频 | 120 MHz |
| Flash | 64 KB |
| SRAM | 16 KB |
| 线圈通道 | 1 路 |
| 调试接口 | TTL 电平 Tx |
IO 资源分配
拨码开关
| 引脚 | 标识 | 功能 | 说明 |
|---|---|---|---|
| PA0 | SA_1 | 灵敏度 bit0 | 与 SA_2 组合,4 级灵敏度 |
| PA1 | SA_2 | 灵敏度 bit1 | |
| PA2 | SW_3 | 存在/脉冲 | 0=存在输出,1=脉冲输出 |
| PA3 | SW_4 | 离开延时 | 0=无, 1=500ms |
| PA4 | SW_5 | 安全复位 | 0=正常,1=安全复位 |
继电器输出
| 引脚 | 标识 | 功能 | 说明 |
|---|---|---|---|
| PA5 | RLY2 | 继电器 2 | 方向/第二路输出 |
| PA6 | RLY1 | 继电器 1 | 存在/脉冲/主输出 |
线圈输入捕获
| 引脚 | 标识 | 外设 | 功能 |
|---|---|---|---|
| PA7 | LP | TIM3_CH2 | 线圈频率输入捕获 |
指示灯
| 引脚 | 标识 | 颜色 | 功能 |
|---|---|---|---|
| PB1 | LEDA | 红色 | 呼吸灯(系统运行指示) |
| PA9 | LEDB | 绿色 | 有车亮 / 无车灭 |
| PA10 | LEDC | 黄色 | 故障指示 |
IO 汇总表
| 引脚 | 功能 | 方向 | 外设 |
|---|---|---|---|
| PA0 | SA_1 (灵敏度) | IN | GPIO |
| PA1 | SA_2 (灵敏度) | IN | GPIO |
| PA2 | SW_3 (存在/脉冲) | IN | GPIO |
| PA3 | SW_4 (离开延时) | IN | GPIO |
| PA4 | SW_5 (安全复位) | IN | GPIO |
| PA5 | RLY2 (继电器2) | OUT | GPIO |
| PA6 | RLY1 (继电器1) | OUT | GPIO |
| PA7 | LP (线圈捕获) | IN | TIM3_CH2 |
| PA9 | LEDB (绿灯) | OUT | GPIO |
| PA10 | LEDC (黄灯) | OUT | GPIO |
| PB1 | LEDA (红灯) | OUT | TIM / GPIO |
功能逻辑
拨码开关
| SA_2 | SA_1 | 灵敏度 |
|---|---|---|
| 0 | 0 | 低 |
| 0 | 1 | 中 |
| 1 | 0 | 高 |
| 1 | 1 | 最高 |
- SW_3:0 = 存在输出(继电器保持),1 = 脉冲输出(继电器吸合后释放)
- SW_4:0 = 无离开延时(直接输出脉冲),1 = 离开延时 500ms
- SW_5:拨到 ON 触发安全复位(所有输出关闭,频率重新学习)
指示灯
| 状态 | LEDA (红) | LEDB (绿) | LEDC (黄) |
|---|---|---|---|
| 正常运行、无车 | 呼吸 | 灭 | 灭 |
| 有车 | 呼吸 | 亮 | 灭 |
| 线圈故障(断开/短路) | 呼吸 | 灭 | 亮 |
| 安全复位中 | 快闪 | 灭 | 灭 |
继电器输出模式
存在输出(SW_3=0): 有车时 RLY1 吸合,无车释放。 脉冲输出(SW_3=1): 车辆进入时 RLY1 吸合 500ms 后释放。
目录结构
DLD154V4B/
├── src/ # 源代码
├── inc/ # 头文件
│ └── bsp_pins.h # 引脚定义
├── lib/ # 库文件
│ ├── HAL/ # AT32F421 标准外设库
│ └── CMSIS/ # ARM CMSIS-Core
├── docs/ # 文档
└── tools/ # 辅助工具
开发环境
- IDE: Keil MDK / AT32 IDE
- 调试器: SWD (PA13/PA14)
文档
| 文档 | 说明 |
|---|---|
| 产品发布说明 | V1.6 发布:特性、技术规格、版本历程 |
| 产品手册 | 面向用户:功能说明、安装指南、故障排查 |
| 技术规格书 | 面向工程:算法详解、IO 分配、电气参数、通信协议 |
| 开发日志 | 版本历史和设计决策记录 |
| 参考分析 | M1H (STC12C5202) + TLD-110 (P87LPC762) 算法分析 |
Languages
C
99.6%
Assembly
0.4%