STM32F103读取HLW8112程序与电路图
一、HLW8112芯片简介
HLW8112是一款高精度电能计量芯片,可测量交流电压、电流、有功功率、电能等参数,广泛应用于智能电表、电力监测、节能设备等领域。其核心特点:
- 支持UART/SPI通信(常用UART接口,波特率4800/9600);
- 测量范围:电压0-300V,电流0-30A,功率0-4.5kW;
- 精度:电压±0.5%,电流±0.5%,功率±1%;
- 内置24位ADC,支持过压/过流保护。
二、系统架构与电路图
1. 完整电路图(简化版)
+3.3V ──┬───────────────────────┬───────────────────────┬── VCC(HLW8112)
│ │ │
┌┴┐ ┌┴┐ ┌┴┐
│ │ 10kΩ(上拉) │ │ 10kΩ(上拉) │ │ 0.1μF(去耦)
└┬┘ └┬┘ └┬┘
│ │ │
STM32F103: HLW8112:
PA9(TX) ────┬─────────────────────┤ RX
PA10(RX) ───┬─────────────────────┤ TX
GND ────────┴─────────────────────┴ GND
互感器连接:
AC 220V ── PT(100:1) ── VIN(HLW8112) // 电压采样
AC 220V ── CT(1000:1) ── IIN(HLW8112) // 电流采样
三、STM32F103读取程序(HAL库实现)
1. 开发环境
- IDE:STM32CubeIDE 1.13.0
- 库:STM32CubeF1 HAL库
- 通信协议:UART,波特率4800,8N1(8位数据位,1位停止位,无校验)
2. 核心代码实现
(1)UART初始化(usart.c)
#include "usart.h"
UART_HandleTypeDef huart1;
void MX_USART1_UART_Init(void) {
huart1.Instance = USART1;
huart1.Init.BaudRate = 4800; // HLW8112默认波特率
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK) {
Error_Handler();
}
}
// UART发送函数
void UART_SendByte(uint8_t data) {
HAL_UART_Transmit(&huart1, &data, 1, 100);
}
// UART接收函数(阻塞式)
uint8_t UART_ReceiveByte(uint32_t timeout) {
uint8_t data;
HAL_UART_Receive(&huart1, &data, 1, timeout);
return data;
}
(2)HLW8112通信协议与命令
HLW8112通过寄存器地址读取数据,常用命令如下:
| 功能 | 命令码(十六进制) | 数据长度(字节) | 说明 |
|---|---|---|---|
| 读取电压 | 0x01 | 3(含校验和) | 返回电压原始值(24位) |
| 读取电流 | 0x02 | 3 | 返回电流原始值(24位) |
| 读取功率 | 0x03 | 3 | 返回功率原始值(24位) |
| 读取电能 | 0x04 | 3 | 返回电能累计值(24位) |
| 软复位 | 0x55 | 1 | 芯片复位 |
数据格式:命令码(1字节)+ 数据(2字节,高位在前)+ 校验和(1字节,前3字节异或)。
(3)HLW8112驱动(hlw8112.c)
#include "hlw8112.h"
#include "usart.h"
#include "string.h"
// 读取HLW8112寄存器数据
uint32_t HLW8112_ReadReg(uint8_t cmd) {
uint8_t tx_buf[1] = {cmd};
uint8_t rx_buf[3] = {0}; // 数据+校验和(共3字节:2字节数据+1字节校验和)
// 发送命令
HAL_UART_Transmit(&huart1, tx_buf, 1, 100);
// 接收数据(3字节:数据高8位+低8位+校验和)
HAL_UART_Receive(&huart1, rx_buf, 3, 100);
// 校验和验证(前2字节异或)
uint8_t checksum = rx_buf[0] ^ rx_buf[1];
if (checksum != rx_buf[2]) {
return 0; // 校验失败
}
// 组合24位数据(实际为16位有效数据,高8位为符号位)
return (rx_buf[0] << 8) | rx_buf[1];
}
// 原始值转电压(V)
float HLW8112_RawToVoltage(uint32_t raw) {
// 比例系数:HLW8112电压系数 = 0.0003125V/LSB(根据datasheet)
return raw * 0.0003125f;
}
// 原始值转电流(A)
float HLW8112_RawToCurrent(uint32_t raw) {
// 比例系数:HLW8112电流系数 = 0.000015625A/LSB(根据CT变比调整)
return raw * 0.000015625f;
}
// 原始值转功率(W)
float HLW8112_RawToPower(uint32_t raw) {
// 比例系数:HLW8112功率系数 = 0.0003125W/LSB
return raw * 0.0003125f;
}
(4)主程序(main.c)
#include "main.h"
#include "usart.h"
#include "hlw8112.h"
#include "stdio.h"
int main(void) {
HAL_Init();
SystemClock_Config();
MX_USART1_UART_Init();
while (1) {
// 读取电压、电流、功率
uint32_t raw_voltage = HLW8112_ReadReg(0x01); // 电压命令0x01
uint32_t raw_current = HLW8112_ReadReg(0x02); // 电流命令0x02
uint32_t raw_power = HLW8112_ReadReg(0x03); // 功率命令0x03
// 转换为实际值
float voltage = HLW8112_RawToVoltage(raw_voltage);
float current = HLW8112_RawToCurrent(raw_current);
float power = HLW8112_RawToPower(raw_power);
// 串口打印(通过USART1输出)
char msg[100];
sprintf(msg, "V: %.2fV, I: %.3fA, P: %.2fW\r\n", voltage, current, power);
HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 100);
HAL_Delay(1000); // 1秒更新一次
}
}
参考代码 STM32F103读取HLW8112程序 www.youwenfan.com/contentcss/182460.html
四、关键参数与校准
1. 比例系数计算
HLW8112的原始值需通过比例系数转换为实际物理量,系数由硬件设计决定:
- 电压系数:Kv=223Vref×Rdiv1(Rdiv为电压采样电阻分压比)
- 电流系数:Ki=223Iref×NCT1(NCT为CT变比,如1000:1)
- 功率系数:Kp=Kv×Ki
示例:若CT变比为1000:1,电流系数Ki=0.000015625A/LSB(即1/64000)。
2. 校准步骤
- 零点校准:断开负载,读取电流原始值,作为零点偏移量。
- 满量程校准:接入标准负载(如220V/10A),调整比例系数使测量值与标准值一致。
- 温度补偿:HLW8112内置温度传感器,需根据温度修正系数(参考datasheet)。
五、调试与故障排除
1. 常见问题
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无数据返回 | UART波特率错误 | 确认HLW8112波特率(默认4800) |
| 数据乱码 | 校验和错误 | 检查接线是否松动,增加延时 |
| 测量值偏差大 | 比例系数未校准 | 按标准负载重新校准系数 |
| 通信偶尔中断 | 电源纹波大 | 增加100nF去耦电容 |
2. 调试工具
- 串口助手:通过USB-TTL模块连接HLW8112的UART,直接发送命令(如0x01)查看返回数据。
- 示波器:测量UART_TX/RX信号,确认波形正常(无畸变、无干扰)。
六、总结
本方案通过STM32F103的UART接口读取HLW8112的电能参数,核心步骤为UART通信配置、命令发送与数据解析、原始值转实际物理量。系统可扩展为电力监测系统,通过LCD显示或上传至云平台,适用于智能电表、能耗分析等场景。