From 499aa9a9a931fc673a75b4d8167a9d94e5d72911 Mon Sep 17 00:00:00 2001 From: helei Date: Sat, 15 Aug 2026 00:30:08 +0800 Subject: [PATCH] =?UTF-8?q?V1.5:=20=E4=BF=AE=E5=A4=8D=E7=94=B5=E8=83=BD?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=A0=88=E6=BA=A2=E5=87=BA=E8=87=B4=E7=9C=8B?= =?UTF-8?q?=E9=97=A8=E7=8B=97=E5=A4=8D=E4=BD=8D(sys=5Ftask=E6=A0=881KB->2K?= =?UTF-8?q?B)=EF=BC=9BHLW8032=E5=B8=A7=E5=90=8C=E6=AD=A5=E5=8A=A0=E8=BF=9E?= =?UTF-8?q?=E7=BB=AD3=E5=B8=A7+=E9=97=B4=E9=9A=9420~150ms=E9=98=B2?= =?UTF-8?q?=E5=99=AA=E5=A3=B0=E5=81=87=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../STM32F103_App1/HardWare/HLW8032/hlw8032.c | 24 +++++++++++++++++-- .../HardWare/SYSINIT/app_loop.c | 2 +- V1.5/鐗堟湰璇存槑.md | 2 ++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.c b/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.c index b5c9965..eec74a3 100644 --- a/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.c +++ b/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.c @@ -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; - s_synced = 1; + if (!s_synced) { + s_synced = 1; + log_info("> 电能: HLW8032 在线, 功率参数=%lu", (unsigned long)s_power_par); + } s_last_frame_tick = HAL_GetTick(); } diff --git a/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c b/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c index e84a0bc..56525dc 100644 --- a/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c +++ b/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c @@ -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(); diff --git a/V1.5/鐗堟湰璇存槑.md b/V1.5/鐗堟湰璇存槑.md index 9ac26fd..54945c7 100644 --- a/V1.5/鐗堟湰璇存槑.md +++ b/V1.5/鐗堟湰璇存槑.md @@ -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) - 鑺墖鍦ㄧ嚎鏃舵瘡鍒嗛挓鏃ュ織鎵撳嵃鐢靛帇/鐢垫祦/鍔熺巼/鐢佃兘锛堣皟璇曟牎鍑嗙敤锛 +- 淇锛歅D2 娴┖鍣0/鐪熷疄甯т娇 online 涓虹湡鍚庯紝姣忓垎閽熺數鑳芥棩蹇楀湪 sys_task(1KB 鏍) 閲屾牸寮忓寲 4 涓诞鐐规暟 + 瀵艰嚧鏍堟孩鍑哄崱姝荤湅闂ㄧ嫍澶嶄綅 鈫 sys_task 鏍堝姞鍒 2KB锛涘抚鍚屾鍔"杩炵画 3 甯т笖闂撮殧 20~150ms"闃插櫔澹板亣鍚屾 - 绱鑴夊啿(uint64)鎸佷箙鍖 EEPROM 鍋忕Щ 164锛氭瘡鏀掔害 0.1kWh 鍐欎竴娆 + 鏂數棰勮鏃剁珛鍗冲啓锛堟硶鎷夌數瀹圭画鑸唴锛 - 骞冲彴涓婃姤鏍囪瘑绗 `energy`锛坘Wh 涓や綅灏忔暟锛夛紝MQTT 灏辩华涓旇姱鐗囧湪绾挎椂姣忓垎閽熶竴娆★紝4G/WiFi 鍙岄氶亾 - UART5 甯 ORE 鑷剤锛涚‖浠讹細B0505S 闅旂鐢垫簮 + 鍏夎︼紝鑺墖 TXD 鎺 PD2