Files
vd_960/vd960Loop/docs/devlog.md
wangfq 5a12044c1a fix: vTaskDelay 10→50ms 对齐 DLD154V4B 原始设计, 创建 docs/devlog.md
loop_task_function 主循环周期修正:
- 原值 10ms 是 FreeRTOS 移植时的疏忽
- 改为 50ms 对齐原始 TMR15 5ms×10 设计
- 基线更新: 100×10ms=1s → 100×50ms=5s (Origin 更稳定)
- CPU 占用降低 5×

创建 docs/devlog.md 记录 V2.0~V2.2 全部改动。
2026-06-26 14:30:51 +08:00

2.3 KiB
Raw Blame History

vd960Loop 开发日志

MCU: AT32F421 (Cortex-M4, 120MHz) | 线圈通道: 4路 | 调试口: TTL Tx (3.3V 9600 8N1)


2026-06-26 — 多项可配置化改造

1. 上报频率从 raw CAPVD 改为实际线圈频率

uart_report_packet_loop_acsCMD_DBN_GET_MCJQ_PARAM 中,频率字段原来直接上报 loop_CAPVDIIR 累加值),现改为经过公式转换的实际频率:

freq = (sclk_freq × input_div × LPCNT) / CAPVD

使用 uint64_t 先乘后除避免整数截断,LPCNT>0 && CAPVD>0 防除零。

2. 有限存在时长可配置 (hold_time)

  • Loop154_Unit 新增 uint16_t hold_time 字段
  • storage.cexist_mode 计算: hold_time = exist_mode × 20 × 5tick 数,每 tick 50ms
  • vd1_task_per_channel 判定有车时: 若 hold_time > 0loop_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.cdelay_time 计算: relay_delay = delay_time × 2tick 数)
  • TMR15_GLOBAL_IRQHandler: OUTCNT > unit->relay_delay 替代固定 OUT_DELAY

4. vTaskDelay 修正: 10ms → 50ms

loop_task_function 的主循环 vTaskDelay10ms 改为 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 只取最新一个做 IIR10ms 轮询时 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→实际频率转换