STM32F103读取HLW8112程序与电路图

STM32F103读取HLW8112程序与电路图

一、HLW8112芯片简介

HLW8112是一款高精度电能计量芯片,可测量交流电压、电流、有功功率、电能等参数,广泛应用于智能电表、电力监测、节能设备等领域。其核心特点:

二、系统架构与电路图

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. 开发环境

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的原始值需通过比例系数转换为实际物理量,系数由硬件设计决定:

示例:若CT变比为1000:1,电流系数Ki=0.000015625A/LSB(即1/64000)。

2. 校准步骤

  1. 零点校准:断开负载,读取电流原始值,作为零点偏移量。
  2. 满量程校准:接入标准负载(如220V/10A),调整比例系数使测量值与标准值一致。
  3. 温度补偿:HLW8112内置温度传感器,需根据温度修正系数(参考datasheet)。

五、调试与故障排除

1. 常见问题

问题现象 可能原因 解决方案
无数据返回 UART波特率错误 确认HLW8112波特率(默认4800)
数据乱码 校验和错误 检查接线是否松动,增加延时
测量值偏差大 比例系数未校准 按标准负载重新校准系数
通信偶尔中断 电源纹波大 增加100nF去耦电容

2. 调试工具

六、总结

本方案通过STM32F103的UART接口读取HLW8112的电能参数,核心步骤为UART通信配置命令发送与数据解析原始值转实际物理量。系统可扩展为电力监测系统,通过LCD显示或上传至云平台,适用于智能电表、能耗分析等场景。

专注于matlab/simulink,电子电路,编程