feat(V4B): Debug串口打印重组 — 频率/采样/基准全量输出 (V4.20)
现场有影响算法的异常待分析, 扩充调试输出: 1. 周期状态行(2s, DBG|前缀): f频率kHz/Xn/LPCNT/Value/CAPVD/slow/Origin/dlt/SENS/VD/FRZ/LIM/LOOP/STBL - calc_freq_khz(): f=60000×LPCNT/CAPVD (60MHz捕获时钟, 无车≈99kHz/深车124kHz验证✓) - g_slope_limit_cnt: 斜率限幅截断计数(EMI线索, 周期清零) 2. 事件行(EVT|前缀): enter_try(进入线首中)/leave_try(离开线首中)/loop_disconnect/loop_reconnect - 原有 Car_In/Car_OFF/Loop stable/Baseline timeout 保留 3. cmcng.h 新增 DEBUG_ENABLE 开关(1=开现场分析 0=关发布) 文档: devlog V2.18
This commit is contained in:
@@ -681,6 +681,22 @@ void TMR15_GLOBAL_IRQHandler(void)
|
||||
}
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
* 调试打印辅助 — V4.20 debug 打印重组 (2026-09-01)
|
||||
*
|
||||
* calc_freq_khz: 由窗口量反算线圈振荡频率
|
||||
* f = 捕获时钟(60MHz) / Xn_avg, Xn_avg = CAPVD / LPCNT
|
||||
* → f_kHz = 60000 × LPCNT / CAPVD
|
||||
* 无车: CAPVD≈131072, LPCNT≈218 → ≈99.8kHz; 有车: Xn↓ → f↑
|
||||
*===========================================================================*/
|
||||
uint32_t g_slope_limit_cnt = 0; // 斜率限幅截断计数 (EMI/干扰线索, 周期打印带出)
|
||||
|
||||
static uint32_t calc_freq_khz(uint32_t capvd, uint16_t lp_cnt)
|
||||
{
|
||||
if (capvd == 0) return 0;
|
||||
return (60000UL * lp_cnt) / capvd;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
* vd1_task — 核心检测算法(对齐 M1H VD1_TASK)
|
||||
*
|
||||
@@ -710,8 +726,8 @@ void vd1_task(void)
|
||||
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;
|
||||
if (raw_delta > max_step) raw_delta = max_step;
|
||||
if (raw_delta < -max_step) raw_delta = -max_step;
|
||||
if (raw_delta > max_step) { raw_delta = max_step; g_slope_limit_cnt++; }
|
||||
if (raw_delta < -max_step) { raw_delta = -max_step; g_slope_limit_cnt++; }
|
||||
uint32_t clamped_value = (uint32_t)((int32_t)loop1_CAPVD + raw_delta);
|
||||
loop1_CAPVD = get_flt_value(clamped_value, loop1_CAPVD);
|
||||
}
|
||||
@@ -784,6 +800,12 @@ void vd1_task(void)
|
||||
|
||||
/*--- 进入确认 — 连续 ENTRY_CONFIRM 次低于阈值才判有车 ---*/
|
||||
if (loop1_CAPVD < (loop1_Origin - loop1_dlt_ORG)) {
|
||||
if (loop1_entry_cnt == 0) {
|
||||
/* 过渡事件: 第一次命中进入线 (定位"为什么开始进入") */
|
||||
PRINT("EVT|enter_try Value:%d CAPVD:%d Origin:%d dlt:%d f:%dkHz LPCNT:%d Xn:%d\n",
|
||||
loop1_Value, loop1_CAPVD, loop1_Origin, loop1_dlt_ORG,
|
||||
calc_freq_khz(loop1_CAPVD, loop1_LPCNT), loop1_LPCNT, loop1_Xn);
|
||||
}
|
||||
loop1_entry_cnt++;
|
||||
if (loop1_entry_cnt >= ENTRY_CONFIRM) {
|
||||
PRINT("Car_In, Value:%d, CAPVD:%d, Origin:%d, dlt:%d\\n",
|
||||
@@ -899,6 +921,18 @@ void vd1_task(void)
|
||||
#else
|
||||
if ((loop1_Origin - loop1_dlt_ORG) < loop1_CAPVD) { // 方案B/原逻辑: 快滤波直接判释放
|
||||
#endif
|
||||
if (loop1_cnt_release == 0) {
|
||||
/* 过渡事件: 第一次命中离开线 (定位"为什么开始释放") */
|
||||
PRINT("EVT|leave_try Value:%d CAPVD:%d slow:%d Origin:%d dlt:%d f:%dkHz LPCNT:%d Xn:%d\n",
|
||||
loop1_Value, loop1_CAPVD,
|
||||
#if USE_SLOW_RELEASE
|
||||
loop1_CAPVD_slow,
|
||||
#else
|
||||
loop1_CAPVD,
|
||||
#endif
|
||||
loop1_Origin, loop1_dlt_ORG,
|
||||
calc_freq_khz(loop1_CAPVD, loop1_LPCNT), loop1_LPCNT, loop1_Xn);
|
||||
}
|
||||
loop1_cnt_release++;
|
||||
if (loop1_cnt_release >= 3) {
|
||||
PRINT("Car_OFF, Value:%d CAPVD:%d Origin:%d dlt:%d\n",
|
||||
@@ -936,6 +970,7 @@ void loop_task_function(void *pvParameters)
|
||||
g_disconnect_active = 0; // 重连,清除断开标记
|
||||
loop1_CAPVD = 0; // 强制 IIR 从首个有效值重新收敛
|
||||
loop1_CAPVD_slow = 0; // 方案A: 释放慢滤波同步收敛
|
||||
PRINT("EVT|loop_reconnect\n");
|
||||
}
|
||||
|
||||
if (loop1_CAP_OK) {
|
||||
@@ -971,22 +1006,30 @@ void loop_task_function(void *pvParameters)
|
||||
}
|
||||
g_fault_phase = 0;
|
||||
g_fault_tick = 0;
|
||||
PRINT("EVT|loop_disconnect cnt=%d Xn:%d CAPVD:%d Origin:%d f:%dkHz\n",
|
||||
g_disconnect_count, loop1_Xn, loop1_CAPVD, loop1_Origin,
|
||||
calc_freq_khz(loop1_CAPVD, loop1_LPCNT));
|
||||
}
|
||||
|
||||
vTaskDelay(150);
|
||||
}
|
||||
|
||||
/*--- 调试输出(每 2 秒) ---*/
|
||||
/*--- 调试输出(每 2 秒): V4.20 重组 — 频率/采样/基准全量状态 ---*/
|
||||
#ifdef DEBUG
|
||||
{
|
||||
static uint32_t _dbg_cnt = 0;
|
||||
_dbg_cnt++;
|
||||
if (_dbg_cnt >= 200) { // 200 × 10ms = 2s
|
||||
_dbg_cnt = 0;
|
||||
PRINT("SET_DLY:%d, SAFE:%d, Xn:%d, LPCNT:%d, "
|
||||
"CAPVD:%d, Origin:%d, VD:%d\n",
|
||||
SET_DLY, SET_SAFE, loop1_Xn, loop1_LPCNT,
|
||||
loop1_CAPVD, loop1_Origin, loop1_VD_FLAG);
|
||||
PRINT("DBG|t=%ums f=%dkHz Xn=%d LPCNT=%d Value=%d CAPVD=%d slow=%d "
|
||||
"Origin=%d dlt=%d SENS=%d VD=%d FRZ=%d/%d LIM=%d LOOP=%d STBL=%d\n",
|
||||
_dbg_cnt * 10,
|
||||
calc_freq_khz(loop1_CAPVD, loop1_LPCNT),
|
||||
loop1_Xn, loop1_LPCNT, loop1_Value, loop1_CAPVD, loop1_CAPVD_slow,
|
||||
loop1_Origin, loop1_dlt_ORG, loop1_SensLevel, loop1_VD_FLAG,
|
||||
loop1_freeze_cnt, loop1_freeze_ref, g_slope_limit_cnt,
|
||||
loop1_LOOP_OK, g_loop_stable);
|
||||
g_slope_limit_cnt = 0; // 限幅计数按周期清 (统计最近 2s)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user