# vd960Loop 开发日志 > MCU: AT32F421 (Cortex-M4, 120MHz) | 线圈通道: 4路 | 调试口: TTL Tx (3.3V 9600 8N1) --- ## 2026-06-26 — 多项可配置化改造 ### 1. 上报频率从 raw CAPVD 改为实际线圈频率 `uart_report_packet_loop_acs` 和 `CMD_DBN_GET_MCJQ_PARAM` 中,频率字段原来直接上报 `loop_CAPVD`(IIR 累加值),现改为经过公式转换的实际频率: ```c freq = (sclk_freq × input_div × LPCNT) / CAPVD ``` 使用 `uint64_t` 先乘后除避免整数截断,`LPCNT>0 && CAPVD>0` 防除零。 ### 2. 有限存在时长可配置 (hold_time) - `Loop154_Unit` 新增 `uint16_t hold_time` 字段 - `storage.c` 从 `exist_mode` 计算: `hold_time = exist_mode × 20 × 5`(tick 数,每 tick 50ms) - `vd1_task_per_channel` 判定有车时: 若 `hold_time > 0` 则 `loop_VD_HOLD = 1`,启用有限存在计时 - `TMR15_GLOBAL_IRQHandler`: `Hold_CNT > unit->hold_time` 替代固定 `HOLD_TIME` - 超时后执行通道完整重启(`LC_Reset=1, loop_INI_LOOP=1`),相当于线圈重启重建基线,避免继电器释放后立即重新吸合 - `exist_mode=0` 时不启用有限存在,兼容无限制存在场景 ### 3. 离开延时可配置 (relay_delay) - `Loop154_Unit` 新增 `uint16_t relay_delay` 字段 - `storage.c` 从 `delay_time` 计算: `relay_delay = delay_time × 2`(tick 数) - `TMR15_GLOBAL_IRQHandler`: `OUTCNT > unit->relay_delay` 替代固定 `OUT_DELAY` ### 4. vTaskDelay 修正: 10ms → 50ms `loop_task_function` 的主循环 `vTaskDelay` 从 `10ms` 改为 `50ms`,对齐 DLD154V4B 原始设计(TMR15 5ms×10)。 **影响:** - 基线更新周期: 100×10ms=1s → 100×50ms=5s(对齐原始设计,Origin 更稳定) - CPU 占用: 主循环轮询频率降低 5×,节省 CPU **原因:** TMR3 ISR ~1ms 产出一个 CAP_OK 样本,50ms 内有 ~50 个样本。`vd1_task_per_channel` 每个 tick 只取最新一个做 IIR,10ms 轮询时 CAP_OK 总是 ready,改为 50ms 不影响有效测量速率——采集由 TMR3 ISR 硬件驱动,基线更新速率受 `vd1_task` tick 限制。 --- ## 修订记录 | 版本 | 时间 | 说明 | |------|------|------| | V2.2 | 2026-06-26 | vTaskDelay 10→50ms 对齐原始设计 | | V2.1 | 2026-06-26 | hold_time/relay_delay 可配置,有限存在完整重启 | | V2.0 | 2026-06-26 | 频率上报 CAPVD→实际频率转换 |