feat(V4B): V4.36.5 — 重连起振抑制按 Q 分档

现象: 30/46/47/50µH 无车拔插重连继电器跳一下 (136/210µH 无)
根因: 低L→高f→低Q→起振慢幅度弱→前几窗 Xn 偏差→假有车
(100ms 确认窗只保载波存在, 不保幅度稳定)
改动: 首样本直锁时按空场频率 f 分档设抑制窗
  f>100k 低Q 400ms / 80~100k 中Q 200ms / ≤80k 高Q 0ms
  抑制期仅挂起进入确认累计(entry_cnt), 真车不丢, 其余逻辑照常
语法0 error, 4测试全绿; spec V2.21 / devlog V2.39
This commit is contained in:
wangfq
2026-09-04 10:06:51 +08:00
parent 55ac432c69
commit ca6b40cd2d
4 changed files with 89 additions and 4 deletions
+2 -2
View File
@@ -14,11 +14,11 @@
#define __CMCNG_H__
#define PRODUCT_MODEL "DLD154"
#define FIRMWARE_VER "4.36.4" // 主.子.修订 (2026-09-03 起: 小改动只增 REV; MAIN/SUB 由产品定)
#define FIRMWARE_VER "4.36.5" // 主.子.修订 (2026-09-03 起: 小改动只增 REV; MAIN/SUB 由产品定)
#define HARDWARE_VER "3.00"
#define FIRMWARE_VER_MAIN 4
#define FIRMWARE_VER_SUB 36
#define FIRMWARE_VER_REV 4
#define FIRMWARE_VER_REV 5
#define HARDWARE_VER_MAIN 3
#define HARDWARE_VER_SUB 0
@@ -62,6 +62,16 @@ uint32_t loop1_freeze_ref;
* 超时仍断开才释放(防瞬时断开误释放/防砸);
* 保持期内重连且有车 → 输出无缝续持 */
/* V4.36.5: 重连起振抑制窗 — 按线圈 Q 分档 (Q∝1/f, 用空场频率代理)
* 低Q(高频小L): 起振慢/幅度弱 → 前几窗测量偏差大 → 假"有车"跳输出
* 高Q(低频大L): 起振快样本干净 → 无需抑制 (136/210µH 实测无问题)
* 分界(实测): 46~50µH→109~113k 必跳 → >100k 归低Q; 80~100k 中Q; <=80k 高Q */
#define RECONNECT_Q_HI_F_KHZ 80 /* f <= 80kHz (L≳92µH@43nF) → 高Q */
#define RECONNECT_Q_MID_F_KHZ 100 /* 80< f <=100kHz → 中Q */
#define RECONNECT_BLANK_Q_HI_MS 0 /* 高Q: 起振快, 不抑制 */
#define RECONNECT_BLANK_Q_MID_MS 200 /* 中Q: 短抑制 */
#define RECONNECT_BLANK_Q_LO_MS 400 /* 低Q(f>100k, L<~59µH): 长抑制 */
/*===========================================================================
* 全局状态变量 — 标志位
*===========================================================================*/
@@ -149,6 +159,7 @@ uint8_t g_reconn_candidate = 0; // V4.36.2: 重连确认窗候选(载波
uint16_t g_reconn_cnt = 0; // V4.36.2: 载波连续恢复计数 (确认窗 ~100ms)
uint16_t g_relay_hold_cnt = 0; // V4.36.3: 有车断开继电器保持计时(ms, ISR 5ms 累加)
uint8_t g_relay_hold_done = 0; // V4.36.3: 本次有车断开已兜底释放(防重复OFF)
uint16_t g_reconn_blank_ms = 0; // V4.36.5: 重连起振抑制倒计时(ms, 按Q分档, vd1_task 每样本-10)
uint8_t g_fault_phase = 0;
uint16_t g_fault_tick = 0;
uint8_t g_coil_fault = 0; // V4.26: 线圈电感量异常 0=正常 1=L偏大(f<20kHz) 2=L偏小(f>120kHz)
@@ -922,6 +933,22 @@ void vd1_task(void)
*================================================================*/
if (loop1_CAPVD == 0) {
loop1_CAPVD = loop1_Value;
/* V4.36.5: 首样本直锁(重连重置后) → 按线圈 Q(空场频率)分档设定抑制窗
* Origin 为断开前空场基线(同线圈同环境) → f 即 Q 档;
* 上电(Origin=0)时 f=0 → 归高Q档 0ms, 不影响正常判稳流程 */
g_reconn_blank_ms = 0;
{
uint32_t _f = calc_freq_khz(loop1_Origin, loop1_LPCNT);
if (_f > RECONNECT_Q_MID_F_KHZ)
g_reconn_blank_ms = RECONNECT_BLANK_Q_LO_MS; /* 低Q(高频) 长抑制 */
else if (_f > RECONNECT_Q_HI_F_KHZ)
g_reconn_blank_ms = RECONNECT_BLANK_Q_MID_MS; /* 中Q 短抑制 */
/* 高Q(低频) → 0ms 不抑制 */
if (g_reconn_blank_ms)
PRINT("EVT|reconn_blank %dms f:%d kHz\n",
g_reconn_blank_ms, _f);
}
} else {
int32_t raw_delta = (int32_t)loop1_Value - (int32_t)loop1_CAPVD;
int32_t max_step = (int32_t)(loop1_CAPVD * MAX_SLOPE_RATE / 100);
@@ -941,6 +968,12 @@ void vd1_task(void)
}
#endif
/* V4.36.5: 重连起振抑制倒计时 (每样本 ~10ms) */
if (g_reconn_blank_ms) {
if (g_reconn_blank_ms > 10) g_reconn_blank_ms -= 10;
else g_reconn_blank_ms = 0;
}
/*--- 2. 稳定期:绕过 IIR 和斜率限幅,小窗口快速收敛;
* 基准值稳定(连续窗口 Origin 漂移达标)后才结束自检 ---*/
if (!g_loop_stable) {
@@ -1125,7 +1158,7 @@ void vd1_task(void)
coil_monitor();
/*--- 进入确认 — 连续 ENTRY_CONFIRM 次低于阈值才判有车 ---*/
if (loop1_CAPVD < (loop1_Origin - loop1_dlt_ORG)) {
if (loop1_CAPVD < (loop1_Origin - loop1_dlt_ORG) && g_reconn_blank_ms == 0) {
if (loop1_entry_cnt == 0) {
/* 过渡事件: 第一次命中进入线 (定位"为什么开始进入") */
PRINT("EVT|enter_try Value:%d CAPVD:%d Origin:%d dlt:%d f:%dkHz LPCNT:%d Xn:%d\n",
@@ -1313,6 +1346,7 @@ void loop_task_function(void *pvParameters)
g_env_wait_cnt = 0; // V4.24: 断开重连后环境学习状态复位
g_relay_hold_cnt = 0; // V4.36.3: 保持计时复位
g_relay_hold_done = 0;
g_reconn_blank_ms = 0; // V4.36.5: 抑制倒计时(首样本直锁时按 Q 定档)
env_resync_abort();
PRINT("EVT|loop_reconnect confirmed %dms\n",
RECONNECT_CONFIRM_TICKS * 10);