本文将讲解如何安全、高效地实现 220V 交流电的电流检测,通过 HLW8032 电能计量芯片将数据传输给 NXP i.MX8MP SoC,最终实现软件层的数据采集与上层处理。
一、为什么不能直接把 220V 接到 SoC?
- i.MX8MP 的 GPIO、电源、通信接口电压为 1.8V / 3.3V
- 220V 属于强电,超过 5V 会直接烧毁芯片
- 强电和弱电必须做 电气隔离(如光耦、变压器)
二、整体架构设计
系统结构图:
┌────────────┐
│ 220V AC │
└─────┬──────┘
│
┌───────▼──────────┐
│ 电流互感器 (CT/SCT) │
└───────┬──────────┘
│
┌───────▼──────────┐
│ HLW8032 芯片 │ ← UART
└───────┬──────────┘
│
┌───────▼──────────┐
│ i.MX8MP SoC │
└───────┬──────────┘
│
┌───────▼────────────┐
│ Linux 驱动 / 应用层 │
└────────────────────┘
三、硬件设计要点
1. 电流/电压采集模块选择
我们选择 HLW8032,它具备以下优势:
特性 | 描述 |
---|---|
可测参数 | 电压、电流、有功功率 |
通信接口 | UART(TTL电平) |
适合嵌入式 | 输出为数字数据,免除 ADC 调理 |
安规设计好 | 外围包含隔离和滤波 |
2. HLW8032 典型连接图
┌────────────┐
220V 火线───┤ 分压电阻 ├────┐
└────────────┘ │
▼
┌────────────┐
│ HLW8032 │
零线──────┬────▶│ 内部电压采样 │
│ └────────────┘
电流互感器─┘ │
UART TX ──────▶ i.MX8MP UART RX
3. 接口要求说明
接口 | 描述 |
---|---|
UART(TTL) | 接 i.MX8MP 的 UART RX(需注意电平兼容) |
VCC | 使用 HLW8032 提供的 5V 电源 |
GND | 接地(注意共地或加隔离) |
⚠️ 注意:UART 信号线不承担高压传输,仅传送采样后的数字数据。必须与 220V 高压部分充分隔离!
4. 电气隔离设计
推荐隔离措施:
- UART 使用 光耦隔离模块(如 PC817 + 三极管)
- 电流互感器选择 封装式非接触型号 SCT-013(输出为 0~1V)
- PCB 上强电与弱电间距 ≥ 5mm
- 电源建议使用 双电源隔离变压器(一边供 HLW8032,一边供 SoC)
四、软件设计方案
1. Linux 下启用串口
确认 i.MX8MP 上对应 UART 口可用,如 UART4
:
设备树配置示例(简化版)
&uart4 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart4>;
status = "okay";
};
确认设备挂载为 /dev/ttymxc3
2. 用户空间数据读取程序
HLW8032 默认串口参数:
- 波特率:4800bps
- 数据位:8
- 停止位:1
- 校验位:无
示例读取程序(C语言)
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
int main() {
int fd = open("/dev/ttymxc3", O_RDONLY | O_NOCTTY);
if (fd < 0) {
perror("open");
return -1;
}
struct termios tty;
tcgetattr(fd, &tty);
cfsetispeed(&tty, B4800);
cfsetospeed(&tty, B4800);
tty.c_cflag |= (CLOCAL | CREAD);
tty.c_cflag &= ~PARENB; // 无奇偶校验
tty.c_cflag &= ~CSTOPB;
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8;
tcsetattr(fd, TCSANOW, &tty);
uint8_t buffer[16];
while (1) {
int len = read(fd, buffer, sizeof(buffer));
if (len > 0) {
printf("recv: ");
for (int i = 0; i < len; i++) {
printf("%02X ", buffer[i]);
}
printf("\n");
}
usleep(500000);
}
close(fd);
return 0;
}
⚠️ HLW8032 的数据格式可查阅其规格书:通常为固定帧头、功能位、电流电压数据、高低字节和校验和。
3. 数据处理建议
-
建议使用
CRC
校验每帧数据完整性 -
将数据解析为物理量单位(如电压单位为 0.01V、电流单位为 0.001A)
-
可选功能:
- 报警输出(如超过额定电流)
- 写入 SQLite 或通过 MQTT 远程上传
- 上层界面显示(如 Qt + 图表)
五、应用场景推荐
场景 | 用途 |
---|---|
工业设备监控 | 实时检测用电情况,判断设备状态 |
智能插座 | 检测当前功率、统计用电量 |
能耗统计系统 | 多通道并发采集各路电流,集中上报 |
六、小结
项目 | 内容说明 |
---|---|
芯片选择 | HLW8032(电压、电流、功率采集) |
接口类型 | TTL UART 接入 i.MX8MP |
安全设计 | 强弱电隔离、光耦、互感器使用 |
软件读取 | 使用 UART 读取数据帧,解析物理量 |
上层扩展 | 告警、图表、云端上传、数据记录 |