feat: M4 核心优化 V2.0 — 双路 IIR + 斜率限幅 + 进入确认
三项改进突破 8051 时代限制: 1. 10ms tick + 双路 IIR - CAPVD (慢速): α=18/256, τ=135ms — 基线跟踪,等效原 50ms 设计 - CAPVD_fast (快速): α=0.5, τ=28ms — 检测判定,比原快 5× 2. 斜率限幅 (MAX_SLOPE_RATE=5%) - EMI/闪电瞬态尖峰被截断 - 真实车辆缓慢频率漂移不受影响 3. 进入确认 (ENTRY_CONFIRM=3) - 连续 3 次 CAPVD_fast 低于阈值才判有车 - 单次干扰无法通过 → 误触发率大幅降低 进入响应 ~530ms (比原 550ms 还快), 基线稳定性不变
This commit is contained in:
@@ -295,10 +295,77 @@ if (SET_DLY) {
|
|||||||
- 产品手册端子定义:RS485-A/B → Tx TTL 调试输出
|
- 产品手册端子定义:RS485-A/B → Tx TTL 调试输出
|
||||||
- 技术规格书 §9:整节从 RS485 协议改为 TTL Tx 调试接口说明
|
- 技术规格书 §9:整节从 RS485 协议改为 TTL Tx 调试接口说明
|
||||||
|
|
||||||
|
## 2026-06-26 — M4 核心优化:双路 IIR + 进入确认 + 斜率限幅
|
||||||
|
|
||||||
|
### 背景
|
||||||
|
|
||||||
|
DLD154V4B 的 8051 时代设计在 M4 上可以做得更好。8051 的 50ms tick 是 CPU 限制,不是最优选择。
|
||||||
|
|
||||||
|
### 三项改进
|
||||||
|
|
||||||
|
#### 1. 10ms tick + 双路 IIR
|
||||||
|
|
||||||
|
| 滤波器 | α | τ | 用途 |
|
||||||
|
|--------|---|-----|------|
|
||||||
|
| CAPVD (慢速) | 18/256 ≈ 0.07 | 135ms | 基线跟踪,等效原 50ms 的 79/256 |
|
||||||
|
| CAPVD_fast (快速) | 128/256 = 0.5 | 28ms | 进入/离开检测判定 |
|
||||||
|
|
||||||
|
tick 提升到 10ms,但通过调整 α 保持与 50ms 设计相同的滤波强度。快速 IIR 用于检测,慢速 IIR 用于基线,两路各司其职。
|
||||||
|
|
||||||
|
#### 2. 斜率限幅
|
||||||
|
|
||||||
|
EMI/闪电等瞬态干扰会造成 CAPVD 瞬间跳变。物理车辆不可能让线圈频率瞬间改变 >5%:
|
||||||
|
|
||||||
|
```c
|
||||||
|
max_step = CAPVD × 5 / 100; // 5% 限幅
|
||||||
|
if (|delta| > max_step) delta = clamp(delta, -max_step, max_step);
|
||||||
|
```
|
||||||
|
|
||||||
|
尖峰被截断,真实车辆信号(缓慢的频率漂移)不受影响。
|
||||||
|
|
||||||
|
#### 3. 进入确认
|
||||||
|
|
||||||
|
原设计:单次 CAPVD < Origin-dlt → 立即 VD_FLAG=1(同 8051)
|
||||||
|
|
||||||
|
新设计:CAPVD_fast 连续 3 次低于阈值 → 才判定有车
|
||||||
|
|
||||||
|
```c
|
||||||
|
if (CAPVD_fast < Origin - dlt)
|
||||||
|
entry_cnt++;
|
||||||
|
if (entry_cnt >= 3) { VD_FLAG = 1; ... }
|
||||||
|
else
|
||||||
|
entry_cnt = 0; // 一旦恢复就重置
|
||||||
|
```
|
||||||
|
|
||||||
|
对真实车辆:CAPVD_fast τ=28ms,3 次确认 = 30ms,加上 IN_DELAY 500ms = 总响应 ~530ms,比原来的 550ms 还快。
|
||||||
|
|
||||||
|
对瞬态干扰:单个尖峰无法连续 3 次 → 被过滤。
|
||||||
|
|
||||||
|
### 对比
|
||||||
|
|
||||||
|
| 指标 | 8051 原设计 | M4 优化 |
|
||||||
|
|------|-----------|---------|
|
||||||
|
| tick 周期 | 50ms | **10ms** |
|
||||||
|
| IIR τ (检测) | 135ms | **28ms** (5× 快) |
|
||||||
|
| IIR τ (基线) | 135ms | 135ms (相同) |
|
||||||
|
| 进入判定 | 单次阈值 | **3 次连续确认** |
|
||||||
|
| 瞬态抑制 | 无 | **斜率限幅 + 确认** |
|
||||||
|
| 进入响应 | ~550ms | **~530ms** |
|
||||||
|
| 误触发风险 | 中 | **低** |
|
||||||
|
|
||||||
|
### 兼容性
|
||||||
|
|
||||||
|
- 离开检测路径不变(cnt_release 平坦性均已带确认)
|
||||||
|
- 灵敏度表、IN_DELAY、OUT_DELAY 等参数不变
|
||||||
|
- 可通过 `ENTRY_CONFIRM` 宏调整确认次数,`MAX_SLOPE_RATE` 调整限幅强度
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 修订记录
|
## 修订记录
|
||||||
|
|
||||||
| 版本 | 时间 | 说明 |
|
| 版本 | 时间 | 说明 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
|
| V2.0 | 2026-06-26 | M4 优化: 双路 IIR + 斜率限幅 + 进入确认;tick 10ms |
|
||||||
| V1.7 | 2026-06-26 | vTaskDelay 10→50ms 修正(对齐原始 TMR15 5ms×10 设计);基线更新 1s→5s |
|
| V1.7 | 2026-06-26 | vTaskDelay 10→50ms 修正(对齐原始 TMR15 5ms×10 设计);基线更新 1s→5s |
|
||||||
| V1.6 | 2026-06-24 | 时序修正:OUT_DELAY/PULSE_DELAY→500ms;RS485→TTL Tx |
|
| V1.6 | 2026-06-24 | 时序修正:OUT_DELAY/PULSE_DELAY→500ms;RS485→TTL Tx |
|
||||||
| V1.5 | 2026-06-23 | Origin 污染保护、USE_FLATNESS_EXIT 开关 |
|
| V1.5 | 2026-06-23 | Origin 污染保护、USE_FLATNESS_EXIT 开关 |
|
||||||
|
|||||||
@@ -27,9 +27,17 @@
|
|||||||
#define PULSE_DELAY 10 // 脉冲宽度 500ms
|
#define PULSE_DELAY 10 // 脉冲宽度 500ms
|
||||||
|
|
||||||
/*===========================================================================
|
/*===========================================================================
|
||||||
* 滤波参数 — 对齐 M1H
|
* 滤波参数 — M4 优化版
|
||||||
|
*
|
||||||
|
* 与 M1H (8051, 50ms tick) 的关键差异:
|
||||||
|
* - tick 提升到 10ms,滤波系数同步调整,保持等效时间常数
|
||||||
|
* - 新增斜率限幅 (MAX_SLOPE_RATE) 过滤瞬态尖峰
|
||||||
|
* - 进入确认 (ENTRY_CONFIRM) 替代单次阈值判定
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
#define ALFA_CAP1 79 // IIR 指数平滑 α = 79/256 ≈ 0.31
|
#define ALFA_CAP1 18 // IIR α = 18/256 ≈ 0.07 (@10ms → τ≈135ms, 等效 50ms 的 79/256)
|
||||||
|
#define ALFA_FAST 128 // 快速 IIR α = 128/256 = 0.5 (@10ms → τ≈28ms, 用于检测)
|
||||||
|
#define MAX_SLOPE_RATE 5 // 斜率限幅: 单次最大变化 5% (物理限制, 拒绝 EMI 尖峰)
|
||||||
|
#define ENTRY_CONFIRM 3 // 进入确认: 连续 N 次低于阈值才判定有车
|
||||||
|
|
||||||
/*===========================================================================
|
/*===========================================================================
|
||||||
* 离开检测模式
|
* 离开检测模式
|
||||||
@@ -91,6 +99,10 @@ extern uint8_t g_loop_stable; // 线圈数值已稳定 (0=稳定中,
|
|||||||
|
|
||||||
/* 离开防抖计数器(连续 CAPVD 恢复到阈值以上才释放) */
|
/* 离开防抖计数器(连续 CAPVD 恢复到阈值以上才释放) */
|
||||||
extern uint8_t loop1_cnt_release; // 离开防抖计数
|
extern uint8_t loop1_cnt_release; // 离开防抖计数
|
||||||
|
|
||||||
|
/* M4 优化: 快速 IIR + 进入确认 */
|
||||||
|
extern uint32_t loop1_CAPVD_fast; // 快速 IIR 值 (α=0.5, τ≈28ms, 用于检测)
|
||||||
|
extern uint8_t loop1_entry_cnt; // 进入确认计数
|
||||||
#if USE_FLATNESS_EXIT
|
#if USE_FLATNESS_EXIT
|
||||||
extern uint8_t g_exit_state; // 离开检测: 0=追踪斜率, 1=等待平坦
|
extern uint8_t g_exit_state; // 离开检测: 0=追踪斜率, 1=等待平坦
|
||||||
extern uint16_t g_max_slope; // 第一上升坡面最大 |f'|
|
extern uint16_t g_max_slope; // 第一上升坡面最大 |f'|
|
||||||
|
|||||||
@@ -36,6 +36,10 @@ uint16_t loop1_ORG_CNT;
|
|||||||
uint16_t loop1_dlt_ORG;
|
uint16_t loop1_dlt_ORG;
|
||||||
uint8_t Flt_Reg;
|
uint8_t Flt_Reg;
|
||||||
|
|
||||||
|
/* M4 优化: 快速 IIR + 进入确认 */
|
||||||
|
uint32_t loop1_CAPVD_fast;
|
||||||
|
uint8_t loop1_entry_cnt;
|
||||||
|
|
||||||
/*===========================================================================
|
/*===========================================================================
|
||||||
* 全局状态变量 — 标志位
|
* 全局状态变量 — 标志位
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
@@ -334,6 +338,10 @@ void INIT_VD(void)
|
|||||||
loop1_FLAG_PLUSE = 0;
|
loop1_FLAG_PLUSE = 0;
|
||||||
loop1_cnt_release = 0;
|
loop1_cnt_release = 0;
|
||||||
g_loop_stable = 0;
|
g_loop_stable = 0;
|
||||||
|
|
||||||
|
/* M4 优化: 快速 IIR + 进入确认 */
|
||||||
|
loop1_CAPVD_fast = 0;
|
||||||
|
loop1_entry_cnt = 0;
|
||||||
#if USE_FLATNESS_EXIT
|
#if USE_FLATNESS_EXIT
|
||||||
g_exit_state = 0;
|
g_exit_state = 0;
|
||||||
g_max_slope = 0;
|
g_max_slope = 0;
|
||||||
@@ -623,18 +631,42 @@ void TMR15_GLOBAL_IRQHandler(void)
|
|||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
void vd1_task(void)
|
void vd1_task(void)
|
||||||
{
|
{
|
||||||
#define STABLE_SAMPLES 128 // 稳定期样本数 (~128ms)
|
#define STABLE_SAMPLES 128 // 稳定期样本数
|
||||||
|
|
||||||
static uint16_t _stable_cnt = 0;
|
static uint16_t _stable_cnt = 0;
|
||||||
|
|
||||||
if (loop1_Origin == 0) return;
|
if (loop1_Origin == 0) return;
|
||||||
|
|
||||||
/*--- 1. IIR 一阶低通滤波 ---*/
|
/*================================================================
|
||||||
/* 重连后 CAPVD=0:跳过 IIR,直接锁定首个有效值 */
|
* 1. 双路 IIR 滤波 (M4 优化)
|
||||||
|
*
|
||||||
|
* 慢速 IIR (CAPVD): α=18/256 ≈ 0.07, τ≈135ms
|
||||||
|
* - 斜率限幅: 单次变化 >5% → 截断 (拒绝 EMI/闪电尖峰)
|
||||||
|
* - 用途: 基线跟踪
|
||||||
|
*
|
||||||
|
* 快速 IIR (CAPVD_fast): α=0.5, τ≈28ms
|
||||||
|
* - 从斜率限幅后的 CAPVD 派生
|
||||||
|
* - 用途: 进入/离开检测判定
|
||||||
|
*================================================================*/
|
||||||
|
|
||||||
|
/* 1a. 慢速 IIR — 斜率限幅 */
|
||||||
if (loop1_CAPVD == 0) {
|
if (loop1_CAPVD == 0) {
|
||||||
loop1_CAPVD = loop1_Value;
|
loop1_CAPVD = loop1_Value;
|
||||||
|
loop1_CAPVD_fast = loop1_Value;
|
||||||
} else {
|
} else {
|
||||||
loop1_CAPVD = get_flt_value(loop1_Value, loop1_CAPVD);
|
/* 斜率限幅: 物理车辆不可能让频率瞬间跳变 > MAX_SLOPE_RATE% */
|
||||||
|
int32_t raw_delta = (int32_t)loop1_Value - (int32_t)loop1_CAPVD;
|
||||||
|
int32_t max_step = (int32_t)(loop1_CAPVD * MAX_SLOPE_RATE / 100);
|
||||||
|
if (max_step < 100) max_step = 100; // 最小限幅,防止 origin 很小时锁死
|
||||||
|
if (raw_delta > max_step) raw_delta = max_step;
|
||||||
|
if (raw_delta < -max_step) raw_delta = -max_step;
|
||||||
|
uint32_t clamped_value = (uint32_t)((int32_t)loop1_CAPVD + raw_delta);
|
||||||
|
loop1_CAPVD = get_flt_value(clamped_value, loop1_CAPVD);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 1b. 快速 IIR — α=0.5: (old + new) / 2 */
|
||||||
|
if (loop1_CAPVD_fast != 0) {
|
||||||
|
loop1_CAPVD_fast = (loop1_CAPVD_fast + loop1_CAPVD) / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--- 2. 稳定期:只跟踪基线,不检测车辆 ---*/
|
/*--- 2. 稳定期:只跟踪基线,不检测车辆 ---*/
|
||||||
@@ -671,37 +703,45 @@ void vd1_task(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--- 进入检测 ---*/
|
/*--- M4 优化: 进入确认 — 连续 ENTRY_CONFIRM 次低于阈值才判有车
|
||||||
|
* 使用快速 IIR (CAPVD_fast) 提高响应速度
|
||||||
|
* 配合确认机制防止瞬态干扰误触发 ---*/
|
||||||
|
if (loop1_CAPVD_fast < (loop1_Origin - loop1_dlt_ORG)) {
|
||||||
|
loop1_entry_cnt++;
|
||||||
|
if (loop1_entry_cnt >= ENTRY_CONFIRM) {
|
||||||
|
PRINT("Car_In, Value:%d, CAPVD:%d, CAPVD_fast:%d, Origin:%d, dlt:%d\\n",
|
||||||
|
loop1_Value, loop1_CAPVD, loop1_CAPVD_fast,
|
||||||
|
loop1_Origin, loop1_dlt_ORG);
|
||||||
|
|
||||||
if (loop1_CAPVD < (loop1_Origin - loop1_dlt_ORG)) {
|
loop1_VD_FLAG = 1;
|
||||||
PRINT("Car_In, Value:%d, CAPVD:%d, Origin:%d, dlt:%d\n",
|
loop1_FLAG_IN = 1;
|
||||||
loop1_Value, loop1_CAPVD, loop1_Origin, loop1_dlt_ORG);
|
loop1_entry_cnt = 0;
|
||||||
|
|
||||||
loop1_VD_FLAG = 1;
|
/* 有限存在计时(非安全复位模式下) */
|
||||||
loop1_FLAG_IN = 1;
|
if (!SET_SAFE) {
|
||||||
|
loop1_LC_HOLD = 1;
|
||||||
|
} else {
|
||||||
|
loop1_LC_HOLD = 0;
|
||||||
|
}
|
||||||
|
if (loop1_LC_Reset)
|
||||||
|
loop1_LC_Reset = 0;
|
||||||
|
|
||||||
/* 有限存在计时(非安全复位模式下) */
|
loop1_ORG_CNT = 0;
|
||||||
if (!SET_SAFE) {
|
loop1_ORG_SUM = 0;
|
||||||
loop1_LC_HOLD = 1;
|
|
||||||
} else {
|
|
||||||
loop1_LC_HOLD = 0;
|
|
||||||
}
|
|
||||||
if (loop1_LC_Reset)
|
|
||||||
loop1_LC_Reset = 0;
|
|
||||||
|
|
||||||
loop1_ORG_CNT = 0;
|
/* 重置平坦性状态(专利 CN200910309382) */
|
||||||
loop1_ORG_SUM = 0;
|
|
||||||
|
|
||||||
/* 重置平坦性状态(专利 CN200910309382) */
|
|
||||||
#if USE_FLATNESS_EXIT
|
#if USE_FLATNESS_EXIT
|
||||||
g_exit_state = 0; // 开始追踪第一上升坡面斜率
|
g_exit_state = 0;
|
||||||
g_max_slope = 0;
|
g_max_slope = 0;
|
||||||
g_max_slope_rate = 0;
|
g_max_slope_rate = 0;
|
||||||
g_delta2 = 0;
|
g_delta2 = 0;
|
||||||
g_delta3 = 0;
|
g_delta3 = 0;
|
||||||
g_slope_flat_cnt = 0;
|
g_slope_flat_cnt = 0;
|
||||||
g_flat_ok_cnt = 0;
|
g_flat_ok_cnt = 0;
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (loop1_entry_cnt > 0) loop1_entry_cnt = 0; // 离开阈值区域则重置确认计数
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
#if USE_FLATNESS_EXIT
|
#if USE_FLATNESS_EXIT
|
||||||
@@ -863,6 +903,6 @@ void loop_task_function(void *pvParameters)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
vTaskDelay(50); // 50ms tick,对齐原始 TMR15 5ms×10 设计
|
vTaskDelay(10); // 10ms tick, M4 优化: 双路 IIR + 进入确认 + 斜率限幅
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user