feat(opt): 光耦输出模式完整实现 — 6种融合逻辑 + 人车混行/ETC 状态机
- 新增 g_opt_trigger 全局变量:opt_input_poll() 产出, TMR1 ISR 消费 - MODE 1/2/3/4: 纯地感/纯雷达/或/与 — g_opt_trigger 直出光耦信号 - MODE 5 (HUMAN_VD_MIX): 3态机 IDLE→ARMED→WINDOW, 3s防砸窗口 - MODE 6 (ETC): 3态机 IDLE→ARMED→DEBOUNCE, 500ms防抖释放 - TMR1 ISR case 0: 6模式融合判决 (coil || opt_trigger / coil && opt_trigger等) - 光耦防抖: 3样本多数表决, ~30ms消抖 - MODE 0 复位逻辑不变 - docs: 更新开发日志 (状态机图 + 各模式对照表)
This commit is contained in:
@@ -4,6 +4,80 @@
|
||||
|
||||
---
|
||||
|
||||
## 2026-07-28 (午后) — 光耦输出模式完整实现:6 种融合逻辑 + 状态机
|
||||
|
||||
### 架构
|
||||
|
||||
`opt_input_poll()` 处理光耦输入 → 产出 `g_opt_trigger` (1=有效) → TMR1 ISR 继电器输出段 `case 0` 根据 `g_output_radar_mode` 做融合判决。
|
||||
|
||||
```
|
||||
光耦 PB10 → 3样本多数表决防抖 → opt_input_poll() → g_opt_trigger
|
||||
↓
|
||||
线圈 VD_FLAG/FLAG_OUT → coil_sig ──────────→ 融合判决 → RLY1
|
||||
↑
|
||||
g_output_radar_mode
|
||||
```
|
||||
|
||||
### 各模式实现
|
||||
|
||||
| 模式 | 值 | `opt_input_poll()` | 继电器 `case 0` 融合公式 |
|
||||
|------|-----|-------------------|--------------------------|
|
||||
| LOOP_X_RESET | 0 | 光耦复位 (400ms低→上升沿→SYS_ResetExecute) | `coil_sig` |
|
||||
| LOOP_ONLY | 1 | return, g_opt_trigger=0 | `coil_sig` |
|
||||
| RADAR_ONLY | 2 | g_opt_trigger = 光耦信号 | `g_opt_trigger` |
|
||||
| LOOP_OR_RADAR | 3 | g_opt_trigger = 光耦信号 | `coil_sig \|\| g_opt_trigger` |
|
||||
| LOOP_AND_RADAR | 4 | g_opt_trigger = 光耦信号 | `coil_sig && g_opt_trigger` |
|
||||
| HUMAN_VD_MIX | 5 | 状态机 (见下) | `coil_sig \|\| g_opt_trigger` |
|
||||
| ETC | 6 | 状态机 (见下) | `coil_sig \|\| g_opt_trigger` |
|
||||
|
||||
> 注: `coil_sig = (loop1_VD_FLAG | loop1_FLAG_OUT)` — 含离开脉冲保持
|
||||
|
||||
### HUMAN_VD_MIX 状态机 (人车混行防砸)
|
||||
|
||||
```
|
||||
IDLE (雷达屏蔽, 仅线圈)
|
||||
│ 线圈检测到车
|
||||
▼
|
||||
ARMED (雷达解禁, 线圈||雷达)
|
||||
│ 两者均释放
|
||||
▼
|
||||
WINDOW (3s 防砸窗口)
|
||||
│ 雷达触发 → g_opt_trigger=1 → 继电器吸合, 窗口复位
|
||||
│ 线圈上线 → 回到 ARMED
|
||||
│ 3s 超时无触发 → 回到 IDLE, 落杆
|
||||
```
|
||||
|
||||
定时参数: `OPT_VM_WINDOW_TICK = 600` (600×5ms = 3s)
|
||||
|
||||
### ETC 状态机
|
||||
|
||||
```
|
||||
IDLE (雷达屏蔽, 仅线圈)
|
||||
│ 线圈检测到车
|
||||
▼
|
||||
ARMED (雷达解禁, 线圈||雷达)
|
||||
│ 两者均释放
|
||||
▼
|
||||
DEBOUNCE (500ms 防抖)
|
||||
│ 线圈/雷达重新触发 → 回到 ARMED
|
||||
│ 500ms 超时 → 回到 IDLE, 落杆
|
||||
```
|
||||
|
||||
定时参数: `OPT_ETC_DEBOUNCE_TICK = 100` (100×5ms = 500ms)
|
||||
|
||||
### 光耦防抖
|
||||
|
||||
所有非复位模式共用 3 样本多数表决 (`OPT_DEBOUNCE_CNT=6`): 最近 3 次采样中 ≥2 票即判定有效,等效 ~30ms 消抖。
|
||||
|
||||
### 文件变更
|
||||
|
||||
| 文件 | 变更 |
|
||||
|------|------|
|
||||
| `peripheral_main.c` | +`g_opt_trigger` 全局变量, `opt_input_poll()` 重写 (120→180行), TMR1 ISR `case 0` 融合判决 |
|
||||
| `cmcng.h` | +`extern uint8_t g_opt_trigger` |
|
||||
|
||||
---
|
||||
|
||||
## 2026-07-28 — 光耦输出模式升级:`DLD_OUTPUT_MODE` 枚举 + `direction_mode` 低四位取值
|
||||
|
||||
### 背景
|
||||
|
||||
Reference in New Issue
Block a user