V1.5: 修复电能日志栈溢出致看门狗复位(sys_task栈1KB->2KB);HLW8032帧同步加连续3帧+间隔20~150ms防噪声假同步
This commit is contained in:
parent
0b4724f96a
commit
499aa9a9a9
|
|
@ -46,7 +46,9 @@ static uint32_t s_p_reg = 0; /*
|
|||
static uint32_t s_k = 0; /* 本次上电以来 bit7 翻转(PF 溢出)次数 */
|
||||
static uint8_t s_last_bit7 = 0;
|
||||
static uint32_t s_last_chip = 0; /* 上一帧芯片侧总脉冲 k*65536+n */
|
||||
static uint8_t s_synced = 0; /* 收到过有效帧 */
|
||||
static uint8_t s_synced = 0; /* 已确认同步(连续有效帧) */
|
||||
static uint8_t s_streak = 0; /* 连续有效帧计数(防噪声假同步) */
|
||||
static uint32_t s_last_valid_tick = 0; /* 上一有效帧时刻(帧间隔校验用) */
|
||||
static uint32_t s_last_frame_tick = 0;
|
||||
|
||||
/*==== 帧校验与电量累计(中断上下文执行,保持轻量)====*/
|
||||
|
|
@ -80,6 +82,21 @@ static void hlw8032_parse(const uint8_t *f)
|
|||
s_last_bit7 = bit7;
|
||||
}
|
||||
|
||||
/* 防噪声:真芯片 50ms 一帧稳定到达,要求连续 3 帧且间隔 20~150ms 才算同步。
|
||||
* PD2 悬空时的电磁干扰偶发也能凑出校验和正确的假帧(约 1/256),
|
||||
* 但不可能连续 3 帧都卡在 50ms 节奏上 */
|
||||
{
|
||||
uint32_t now = HAL_GetTick();
|
||||
uint32_t gap = now - s_last_valid_tick;
|
||||
s_last_valid_tick = now;
|
||||
if (gap >= 20 && gap <= 150) {
|
||||
if (s_streak < 3) s_streak++;
|
||||
} else {
|
||||
s_streak = 1;
|
||||
}
|
||||
if (s_streak < 3) return; /* 未确认同步:帧内容一律不采用 */
|
||||
}
|
||||
|
||||
uint32_t chip_total = s_k * HLW_OVERFLOW_PULSES + pf;
|
||||
if (s_synced) {
|
||||
/* 正常单调递增;变小说明芯片断电重启过(寄存器清零),从当前值重新累计 */
|
||||
|
|
@ -87,7 +104,10 @@ static void hlw8032_parse(const uint8_t *f)
|
|||
s_total_pulses += delta;
|
||||
}
|
||||
s_last_chip = chip_total;
|
||||
if (!s_synced) {
|
||||
s_synced = 1;
|
||||
log_info("> 电能: HLW8032 在线, 功率参数=%lu", (unsigned long)s_power_par);
|
||||
}
|
||||
s_last_frame_tick = HAL_GetTick();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -287,7 +287,7 @@ void app_rtos_start(void)
|
|||
|
||||
xTaskCreate(net_task, "net", 768, NULL, 3, NULL); /* 栈 3KB:AT/OTA 有大的 sprintf 缓冲 */
|
||||
xTaskCreate(app_task, "app", 512, NULL, 2, NULL); /* 栈 2KB */
|
||||
xTaskCreate(sys_task, "sys", 256, NULL, 1, NULL); /* ջ 1KB */
|
||||
xTaskCreate(sys_task, "sys", 512, NULL, 1, NULL); /* 栈 2KB:电能日志一行 4 个浮点格式化很吃栈 */
|
||||
|
||||
vTaskStartScheduler();
|
||||
|
||||
|
|
|
|||
|
|
@ -102,6 +102,8 @@
|
|||
PF 16 位溢出靠数据更新寄存器 bit7 翻转计数(50ms 一帧不会漏);芯片断电重启自动重新基准
|
||||
- 系数宏 `HLW_U_COEF`(2.004)/`HLW_I_COEF`(0.5) 在 main.h,对应 ZMPT107-1(100K/49.9R)+CT 1000:1(2R)
|
||||
- 芯片在线时每分钟日志打印电压/电流/功率/电能(调试校准用)
|
||||
- 修复:PD2 浮空噪声/真实帧使 online 为真后,每分钟电能日志在 sys_task(1KB 栈) 里格式化 4 个浮点数
|
||||
导致栈溢出卡死看门狗复位 → sys_task 栈加到 2KB;帧同步加"连续 3 帧且间隔 20~150ms"防噪声假同步
|
||||
- 累计脉冲(uint64)持久化 EEPROM 偏移 164:每攒约 0.1kWh 写一次 + 断电预警时立即写(法拉电容续航内)
|
||||
- 平台上报标识符 `energy`(kWh 两位小数),MQTT 就绪且芯片在线时每分钟一次,4G/WiFi 双通道
|
||||
- UART5 带 ORE 自愈;硬件:B0505S 隔离电源 + 光耦,芯片 TXD 接 PD2
|
||||
|
|
|
|||
Loading…
Reference in New Issue