1. 项目概述
这个智能插座项目是我去年为一个智能家居客户开发的定制方案,核心功能是在传统插座基础上增加电量计量和远程控制能力。选择STM32F103作为主控是因为其性价比优势明显——72MHz主频的Cortex-M3内核配合丰富的外设接口,完全能够满足实时计量和通信需求。
实际开发中发现,要实现商业级精度的电量计量,需要同时采集电压和电流信号进行相位补偿。我们最终采用HLW8032计量芯片+STM32内置ADC的方案,在1%的误差范围内实现了有功功率、视在功率、功率因数等参数的实时计算。远程控制部分则通过ESP8266模块实现Wi-Fi连接,采用MQTT协议与云端通信。
2. 硬件设计解析
2.1 主控选型与电路设计
STM32F103C8T6是这个项目的最佳选择:
- 内置12位ADC(实际有效位ENOB约10.5位)
- 3个USART接口(分别连接计量芯片、Wi-Fi模块和调试终端)
- 64KB Flash/20KB RAM足够存储计量算法和通信协议栈
关键电路设计要点:
- 计量电路与主控采用光耦隔离,防止交流侧干扰影响数字电路
- 为HLW8032设计独立的电流采样回路(5mΩ锰铜分流器)
- 添加TVS二极管防护浪涌电压(特别重要!我们第一批样品就因雷击损坏过)
2.3 电源方案设计
采用两级电源架构:
- 前级:220V转5V的AC-DC模块(选用金升阳的LS05-10B05)
- 后级:5V转3.3V的LDO(AMS1117-3.3)
重要经验:AC-DC模块一定要留足余量!我们最初选用3W模块,在长时间满负载(16A)运行时会出现过热保护,后来更换为5W模块才解决问题。
3. 软件实现细节
3.1 电量计量算法实现
HLW8032输出的是脉冲信号(3200imp/kWh),需要通过STM32定时器捕获脉冲间隔来计算瞬时功率。关键代码片段:
c复制// 定时器2捕获中断处理
void TIM2_IRQHandler(void) {
if(TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) {
uint32_t capture = TIM_GetCapture1(TIM2);
float power = 3600000.0f / (capture * 3.2f); // 计算瞬时功率(W)
energy_wh += power * (capture / 72000000.0f); // 累加电量(Wh)
TIM_SetCounter(TIM2, 0);
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
}
}
校准步骤:
- 接入已知负载(如100W白炽灯)
- 记录脉冲间隔理论值(11250μs)
- 计算校准系数:实际测量值/理论值
3.2 远程控制实现
Wi-Fi通信协议栈架构:
code复制应用层: MQTT协议(发布/订阅模式)
传输层: ESP8266 AT指令(透传模式)
物理层: USART3(115200bps)
典型控制流程:
- 手机APP发送MQTT消息(topic: device/1234/power)
- 云端转发到ESP8266
- STM32解析JSON格式指令:
- 控制继电器动作(GPIO_Pin_12)
4. 生产测试方案
4.1 自动化测试系统
开发了基于Python的测试工装:
- 程控电源模拟220V输入
- 电子负载提供5A/10A/16A测试电流
- 通过USB转串口读取设备数据
测试项目包括:
- 计量精度测试(1%、5%、10%负载点)
- 继电器寿命测试(5万次通断)
- 温升测试(红外热成像仪监测)
4.2 常见问题排查
问题现象:电量计量值偏大20%
可能原因:
- 电流采样电阻值偏差(实测应为5mΩ)
- HLW8032的CF引脚负载电阻不匹配(标准配置为1kΩ)
- 软件校准系数错误(检查EEPROM存储值)
问题现象:Wi-Fi频繁掉线
解决方案:
- 检查天线阻抗匹配(应50Ω)
- 添加电源去耦电容(ESP8266旁边加100μF钽电容)
- 修改AT指令发送间隔(从100ms改为500ms)
5. 进阶优化方向
5.1 电能质量分析
在现有基础上增加:
- 谐波分析(FFT算法)
- 电压暂降/骤升检测
- 负载类型识别(阻性/容性/感性)
需要升级硬件:
- ADC采样率提升到1MHz以上
- 增加电压互感器隔离采样
5.2 本地智能策略
实现脱离云端的本地控制:
- 定时开关(RTC控制)
- 功率阈值保护(超过2000W自动断电)
- 用电习惯学习(LSTM神经网络)
代码内存占用估算:
- 基础功能:约45KB Flash
- 增加本地智能:需要额外20-30KB
这个项目最让我意外的是计量精度问题——即使使用专业计量芯片,在低功率因数(<0.5)负载下仍然会出现明显误差。后来通过软件补偿算法(建立误差查找表)才将误差控制在2%以内。建议大家在类似项目中预留足够的校准时间,最好能收集不同类型负载的测试数据。
