V1.5: 修复电能日志栈溢出致看门狗复位(sys_task栈1KB->2KB);HLW8032帧同步加连续3帧+间隔20~150ms防噪声假同步

This commit is contained in:
helei 2026-08-15 00:30:08 +08:00
parent 0b4724f96a
commit 499aa9a9a9
3 changed files with 25 additions and 3 deletions

View File

@ -46,7 +46,9 @@ static uint32_t s_p_reg = 0; /*
static uint32_t s_k = 0; /* 本次上电以来 bit7 翻转PF 溢出)次数 */ static uint32_t s_k = 0; /* 本次上电以来 bit7 翻转PF 溢出)次数 */
static uint8_t s_last_bit7 = 0; static uint8_t s_last_bit7 = 0;
static uint32_t s_last_chip = 0; /* 上一帧芯片侧总脉冲 k*65536+n */ 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; static uint32_t s_last_frame_tick = 0;
/*==== 帧校验与电量累计(中断上下文执行,保持轻量)====*/ /*==== 帧校验与电量累计(中断上下文执行,保持轻量)====*/
@ -80,6 +82,21 @@ static void hlw8032_parse(const uint8_t *f)
s_last_bit7 = bit7; 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; uint32_t chip_total = s_k * HLW_OVERFLOW_PULSES + pf;
if (s_synced) { if (s_synced) {
/* 正常单调递增;变小说明芯片断电重启过(寄存器清零),从当前值重新累计 */ /* 正常单调递增;变小说明芯片断电重启过(寄存器清零),从当前值重新累计 */
@ -87,7 +104,10 @@ static void hlw8032_parse(const uint8_t *f)
s_total_pulses += delta; s_total_pulses += delta;
} }
s_last_chip = chip_total; s_last_chip = chip_total;
s_synced = 1; if (!s_synced) {
s_synced = 1;
log_info("> 电能: HLW8032 在线, 功率参数=%lu", (unsigned long)s_power_par);
}
s_last_frame_tick = HAL_GetTick(); s_last_frame_tick = HAL_GetTick();
} }

View File

@ -287,7 +287,7 @@ void app_rtos_start(void)
xTaskCreate(net_task, "net", 768, NULL, 3, NULL); /* 栈 3KBAT/OTA 有大的 sprintf 缓冲 */ xTaskCreate(net_task, "net", 768, NULL, 3, NULL); /* 栈 3KBAT/OTA 有大的 sprintf 缓冲 */
xTaskCreate(app_task, "app", 512, NULL, 2, NULL); /* 栈 2KB */ 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(); vTaskStartScheduler();

View File

@ -102,6 +102,8 @@
PF 16 位溢出靠数据更新寄存器 bit7 翻转计数50ms 一帧不会漏);芯片断电重启自动重新基准 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) - 系数宏 `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 写一次 + 断电预警时立即写(法拉电容续航内) - 累计脉冲(uint64)持久化 EEPROM 偏移 164每攒约 0.1kWh 写一次 + 断电预警时立即写(法拉电容续航内)
- 平台上报标识符 `energy`kWh 两位小数MQTT 就绪且芯片在线时每分钟一次4G/WiFi 双通道 - 平台上报标识符 `energy`kWh 两位小数MQTT 就绪且芯片在线时每分钟一次4G/WiFi 双通道
- UART5 带 ORE 自愈硬件B0505S 隔离电源 + 光耦,芯片 TXD 接 PD2 - UART5 带 ORE 自愈硬件B0505S 隔离电源 + 光耦,芯片 TXD 接 PD2