From 0b4724f96a2036f2b483916f52c400726cad9708 Mon Sep 17 00:00:00 2001 From: helei Date: Fri, 14 Aug 2026 23:55:50 +0800 Subject: [PATCH] =?UTF-8?q?V1.5:=20=E7=94=B5=E8=83=BD=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=AF=8F=E5=88=86=E9=92=9F=E9=99=84=E5=B8=A6=E7=94=B5=E5=8E=8B?= =?UTF-8?q?/=E7=94=B5=E6=B5=81/=E5=8A=9F=E7=8E=87=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=EF=BC=9B=E7=94=B5=E5=8E=8B=E7=B3=BB=E6=95=B0=E6=8C=8949.9R?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=B8=BA2.004?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../STM32F103_App1/HardWare/HLW8032/hlw8032.c | 29 +++++++++++++++++++ .../STM32F103_App1/HardWare/HLW8032/hlw8032.h | 3 ++ V1.5/STM32F103_App1/HardWare/LOG/log_cn.c | 2 +- .../HardWare/SYSINIT/app_loop.c | 5 +++- V1.5/STM32F103_App1/Inc/main.h | 6 ++-- V1.5/STM32F103_App1/README.md | 5 ++-- V1.5/版本说明.md | 3 +- 7 files changed, 45 insertions(+), 8 deletions(-) diff --git a/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.c b/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.c index 82c4e95..b5c9965 100644 --- a/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.c +++ b/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.c @@ -39,6 +39,9 @@ static uint8_t s_idx = 0; /* ֡ͬ static uint64_t s_total_pulses = 0; /* ۼ壨 EEPROM ָʷֵ */ static uint64_t s_saved_pulses = 0; /* ϴд EEPROM ֵ */ static uint32_t s_power_par = 0; /* ʲĴоƬյ֡У */ +static uint32_t s_u_par = 0, s_u_reg = 0; /* ѹ/ѹĴʾѹã */ +static uint32_t s_i_par = 0, s_i_reg = 0; /* /Ĵ */ +static uint32_t s_p_reg = 0; /* ʼĴ */ static uint32_t s_k = 0; /* ϵ bit7 תPF */ static uint8_t s_last_bit7 = 0; @@ -57,6 +60,13 @@ static void hlw8032_parse(const uint8_t *f) if (power_par == 0) return; /* Ĵ쳣֡ */ s_power_par = power_par; + /* ѹ//ԭʼĴãÿ־ʾ */ + s_u_par = ((uint32_t)f[2] << 16) | ((uint32_t)f[3] << 8) | f[4]; + s_u_reg = ((uint32_t)f[5] << 16) | ((uint32_t)f[6] << 8) | f[7]; + s_i_par = ((uint32_t)f[8] << 16) | ((uint32_t)f[9] << 8) | f[10]; + s_i_reg = ((uint32_t)f[11] << 16) | ((uint32_t)f[12] << 8) | f[13]; + s_p_reg = ((uint32_t)f[17] << 16) | ((uint32_t)f[18] << 8) | f[19]; + uint8_t bit7 = f[20] & 0x80; uint16_t pf = ((uint16_t)f[21] << 8) | f[22]; @@ -141,6 +151,25 @@ float hlw8032_get_energy_kwh(void) (double)HLW_U_COEF * (double)HLW_I_COEF / 3.6e12); } +/*==== ѹ//ʣֲ᣺Чֵ = Ĵ/Ĵ ϵ====*/ +float hlw8032_get_voltage_v(void) +{ + if (!s_u_reg) return 0.0f; + return (float)((double)s_u_par / (double)s_u_reg * HLW_U_COEF); +} + +float hlw8032_get_current_a(void) +{ + if (!s_i_reg) return 0.0f; + return (float)((double)s_i_par / (double)s_i_reg * HLW_I_COEF); +} + +float hlw8032_get_power_w(void) +{ + if (!s_p_reg) return 0.0f; + return (float)((double)s_power_par / (double)s_p_reg * HLW_U_COEF * HLW_I_COEF); +} + /*==== жϣ1s յЧ֡ ====*/ uint8_t hlw8032_online(void) { diff --git a/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.h b/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.h index ed52dd8..65c504c 100644 --- a/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.h +++ b/V1.5/STM32F103_App1/HardWare/HLW8032/hlw8032.h @@ -14,6 +14,9 @@ void hlw8032_rx_byte(uint8_t b); /* UART5 void hlw8032_tick(void); /* 1s ڣֵͰۼд EEPROM */ void hlw8032_save(void); /* д EEPROMϵԤ/ƻλǰã */ float hlw8032_get_energy_kwh(void); /* ۼƵ kWhδյ֡ǰΪ 0 */ +float hlw8032_get_voltage_v(void); /* ѹЧֵ Vʾã */ +float hlw8032_get_current_a(void); /* Чֵ A */ +float hlw8032_get_power_w(void); /* й W */ uint8_t hlw8032_online(void); /* 1s յЧ֡ */ #endif /* __HLW8032_H */ diff --git a/V1.5/STM32F103_App1/HardWare/LOG/log_cn.c b/V1.5/STM32F103_App1/HardWare/LOG/log_cn.c index 99d8354..4001fac 100644 --- a/V1.5/STM32F103_App1/HardWare/LOG/log_cn.c +++ b/V1.5/STM32F103_App1/HardWare/LOG/log_cn.c @@ -3,4 +3,4 @@ /* ļΪ UTF-8 룺ARMCC ԭַֽڣ * յΪ UTF-8ڹ߱ѡ UTF-8 ȷʾģ */ const char FMT_UPTIME[] = "> ʱ: %u--%02uСʱ--%02u"; -const char FMT_UPTIME_EN[] = "> ʱ: %u--%02uСʱ--%02u : %.2fkWh"; +const char FMT_UPTIME_EN[] = "> ʱ: %u--%02uСʱ--%02u : %.2fkWh ѹ: %.1fV : %.2fA : %.1fW"; diff --git a/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c b/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c index 4417f9d..e84a0bc 100644 --- a/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c +++ b/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c @@ -236,7 +236,10 @@ static void sys_task(void *arg) log_info(FMT_UPTIME_EN, (unsigned)(mins / 1440), (unsigned)((mins % 1440) / 60), - (unsigned)(mins % 60), (double)kwh); + (unsigned)(mins % 60), (double)kwh, + (double)hlw8032_get_voltage_v(), + (double)hlw8032_get_current_a(), + (double)hlw8032_get_power_w()); } else { log_info(FMT_UPTIME, (unsigned)(mins / 1440), diff --git a/V1.5/STM32F103_App1/Inc/main.h b/V1.5/STM32F103_App1/Inc/main.h index ee29904..c2681fa 100644 --- a/V1.5/STM32F103_App1/Inc/main.h +++ b/V1.5/STM32F103_App1/Inc/main.h @@ -62,12 +62,12 @@ extern UART_HandleTypeDef huart3; #define BLE_NAME "Bt1" /*===== HLW8032 ϵUART5 PD2 գֻϱۼƵ ===== - * ѹͨ: ZMPT107-1(2mA:2mA) 220V 100Kμ 50R - * -> ѹϵ = (100K/50)/1000 = 2.0 + * ѹͨ: ZMPT107-1(2mA:2mA) 220V 100Kμ 49.9R + * -> ѹϵ = (100K/49.9)/1000 = 2.004 * ͨ: CT 100A/100mA(1000:1) 2R -> Ч 0.002R * -> ϵ = 1/(0.002*1000) = 0.5 * ĵ/ֻ꣨ʽ HLW8032 ֲһڣ */ -#define HLW_U_COEF 2.0f +#define HLW_U_COEF 2.004f #define HLW_I_COEF 0.5f /*===== GATT UUID ã͸===== diff --git a/V1.5/STM32F103_App1/README.md b/V1.5/STM32F103_App1/README.md index d7ecf9f..813af89 100644 --- a/V1.5/STM32F103_App1/README.md +++ b/V1.5/STM32F103_App1/README.md @@ -109,12 +109,13 @@ 只计量**累计消耗电量**,上报平台标识符 `energy`(单位 kWh,两位小数)。 -- **硬件**:HLW8032(5V 供电)经 B0505S 隔离电源 + 光耦隔离,芯片 TXD 接 PD2(UART5_RX);电压采样 ZMPT107-1(2mA:2mA,初级 220V 串 100K,次级并 50Ω),电流采样 CT 100A/100mA(1000:1,输出并 2Ω),三个模拟脚各对地 33nF +- **硬件**:HLW8032(5V 供电)经 B0505S 隔离电源 + 光耦隔离,芯片 TXD 接 PD2(UART5_RX);电压采样 ZMPT107-1(2mA:2mA,初级 220V 串 100K,次级并 49.9Ω),电流采样 CT 100A/100mA(1000:1,输出并 2Ω),三个模拟脚各对地 33nF - **通信**:4800bps 8E1(F1 上按 9 位帧长 + 偶校验配置),芯片每 50ms 主动上报 24 字节帧,只收不发;帧同步 = 首字节 0x55/0xAA/0xFx + 第二字节 0x5A + 校验和([2]~[22] 相加低 8 位) - **电量算法**(手册公式):`kWh = 总脉冲 × 功率参数寄存器 × 电压系数 × 电流系数 / (10^9×3600)`;PF 寄存器 16 位溢出由数据更新寄存器 bit7 翻转计数(`总脉冲 = k×65536 + PF`),50ms 一帧不可能漏翻转;芯片断电重启(计数值倒退)自动重新基准 -- **系数宏**:`main.h` 的 `HLW_U_COEF`(=100K/50/1000=2.0)、`HLW_I_COEF`(=1/(0.002×1000)=0.5)——改电阻/互感器只动这两个宏 +- **系数宏**:`main.h` 的 `HLW_U_COEF`(=100K/49.9/1000=2.004)、`HLW_I_COEF`(=1/(0.002×1000)=0.5)——改电阻/互感器只动这两个宏 - **持久化**:累计脉冲数(uint64)存 EEPROM 偏移 164~171;每攒约 0.1kWh 写一次(限制擦写),断电预警(法拉电容续航内)立即写一次,掉电损失 <0.1kWh - **上报**:MQTT 就绪且芯片在线(1s 内有有效帧)时,每分钟随运行心跳上报一次 `{"energy":%.2f}`;未联网/芯片不在线不上报 +- **调试日志**:芯片在线时每分钟日志同时打印电压/电流/功率(`运行时间: ... 电能: x.xxkWh 电压: xxx.xV 电流: x.xxA 功率: xxxx.xW`) ## 双通道网络(4G 优先,WiFi 兜底) diff --git a/V1.5/版本说明.md b/V1.5/版本说明.md index c49edbd..9ac26fd 100644 --- a/V1.5/版本说明.md +++ b/V1.5/版本说明.md @@ -100,7 +100,8 @@ 帧同步(0x55/0xAA/0xFx + 0x5A)+校验和验证;只取 PF 脉冲累计换算累计电量 - 电量按手册公式换算:kWh = 总脉冲×功率参数×电压系数×电流系数/(10^9×3600); PF 16 位溢出靠数据更新寄存器 bit7 翻转计数(50ms 一帧不会漏);芯片断电重启自动重新基准 -- 系数宏 `HLW_U_COEF`(2.0)/`HLW_I_COEF`(0.5) 在 main.h,对应 ZMPT107-1(100K/50R)+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) +- 芯片在线时每分钟日志打印电压/电流/功率/电能(调试校准用) - 累计脉冲(uint64)持久化 EEPROM 偏移 164:每攒约 0.1kWh 写一次 + 断电预警时立即写(法拉电容续航内) - 平台上报标识符 `energy`(kWh 两位小数),MQTT 就绪且芯片在线时每分钟一次,4G/WiFi 双通道 - UART5 带 ORE 自愈;硬件:B0505S 隔离电源 + 光耦,芯片 TXD 接 PD2