实战:用 i.MX8MP 读取 220V 电流信息的完整方案(HLW8032 接入)


本文将讲解如何安全、高效地实现 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 读取数据帧,解析物理量
上层扩展告警、图表、云端上传、数据记录

视频教程请关注 B 站:“嵌入式 Jerry”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值