这个三相电参数采集系统的核心设计目标,是解决工业现场对电力参数的高精度、实时监测需求。主控采用STM32F407VGT6,这颗Cortex-M4内核的MCU运行频率高达168MHz,内置FPU浮点运算单元,特别适合处理三相电参数计算这类需要大量浮点运算的场景。实测在同时处理三路HLW8032数据流时,CPU占用率仍能控制在60%以下。
系统架构上采用模块化设计:
关键设计要点:所有I/O接口均采用TVS二极管阵列(如SMBJ系列)进行浪涌保护,PCB布局时将数字电路与模拟电路分区布置,中间用磁珠隔离。这是通过4000V浪涌测试的关键。
主控电路采用经典的四层板设计:
特别要注意的是,STM32F407的VDDA引脚必须连接1μF+100nF的退耦电容,且这两个电容要尽可能靠近芯片引脚放置。我们在初期样机测试时,就因为这个问题导致ADC采样值波动较大。
每相采集电路包含以下关键元件:
code复制HLW8032接线示意图:
电压采样 -> 分压电阻网络(1MΩ+10kΩ)
电流采样 -> 100A/20mA电流互感器输出端
-> 10Ω采样电阻
-> 100nF滤波电容
三个HLW8032芯片分别连接至:
波特率统一设置为4800bps(HLW8032的固定通信速率),每个芯片的CF引脚都连接到STM32的定时器输入捕获通道,用于脉冲计数测量电能。
通过EMC测试的关键措施:
系统创建了6个任务,优先级从高到低排列:
| 任务名称 | 优先级 | 堆栈大小 | 主要功能 |
|---|---|---|---|
| DataCollection | 5 | 512 | HLW8032数据采集与处理 |
| Display | 6 | 1024 | TFT界面刷新 |
| Communication | 7 | 768 | Modbus协议处理 |
| KeyScan | 8 | 256 | 按键扫描 |
| RelayControl | 9 | 256 | 继电器状态管理 |
| Calibration | 10 | 512 | 红外校准处理 |
任务间通信采用消息队列+信号量的方式。例如DataCollection任务完成一帧数据处理后,会通过消息队列将数据同时发送给Display和Communication任务。
HLW8032的通信协议解析是系统核心,其数据帧格式固定为24字节:
code复制帧头(0x55) | 帧头(0xAA) | 电压(4B) | 电流(4B) | 功率(4B) | ... | 校验(1B)
我们采用DMA+空闲中断的方式接收数据,大幅降低CPU负载:
c复制// USART DMA配置示例
void UART_DMA_Config(USART_TypeDef* USARTx, uint8_t *rxBuf)
{
DMA_InitTypeDef DMA_InitStructure;
if(USARTx == USART1) {
DMA_InitStructure.DMA_Channel = DMA_Channel_4;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)rxBuf;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = HLW8032_BUF_SIZE;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Stream2, &DMA_InitStructure);
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
DMA_Cmd(DMA2_Stream2, ENABLE);
}
// 其他USART配置类似...
}
从HLW8032获取的是原始数据,需要转换为实际物理量:
c复制float GetVoltage(uint32_t regVal)
{
// 电压计算公式:V = (RegVal * Vref) / (Gain * 2^23)
// 其中Vref=2.43V, Gain=1
return (regVal * 2.43f) / 8388608.0f;
}
float GetCurrent(uint32_t regVal, float CT_Ratio)
{
// 电流计算公式:I = (RegVal * Vref) / (Gain * R * 2^23)
// 典型R=10Ω
return (regVal * 2.43f) / (10.0f * 8388608.0f) * CT_Ratio;
}
对于功率计算,还需要考虑相位补偿。我们采用滑动平均滤波算法,设置20个样本的窗口大小,有效抑制了数据波动。
校准模式通过长按面板按键5秒进入,此时TFT屏幕显示校准菜单。使用配套的红外遥控器发送校准指令:
校准参数保存在STM32内部的Flash扇区1(0x08004000-0x08004FFF),采用ECC校验确保数据可靠性。
经过第三方检测机构测试,系统达到以下指标:
| 参数 | 测量范围 | 精度 | 分辨率 |
|---|---|---|---|
| 电压 | 50-500V | ±0.5% | 0.1V |
| 电流 | 0.1-1000A | ±1% | 0.01A |
| 有功功率 | 5W-500kW | ±1% | 0.1W |
| 无功功率 | 5VAR-500kVAR | ±2% | 0.1VAR |
| 功率因数 | 0.2-1.0 | ±1% | 0.001 |
现象:某路HLW8032数据时有时无
典型原因:采样电阻发热导致阻值变化,建议更换为更高功率的2512封装电阻。
优化方案:
c复制// DMA2D配置示例
void DMA2D_Config(void)
{
DMA2D->CR = 0x00000000UL | DMA2D_CR_MODE_M2M;
DMA2D->FGMAR = (uint32_t)pSrc;
DMA2D->OMAR = (uint32_t)pDst;
DMA2D->FGOR = 0;
DMA2D->OOR = 0;
DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_RGB565;
DMA2D->NLR = (uint32_t)(xSize << 16) | (uint16_t)ySize;
DMA2D->CR |= DMA2D_CR_START;
while(DMA2D->CR & DMA2D_CR_START) {}
}
解决方案:
这个三相电参数采集系统在实际工业现场已稳定运行超过2000小时,期间经历了夏季高温(45℃)和冬季低温(-20℃)的考验。对于需要更高精度的场合,建议将HLW8032升级为HLW8112,后者支持0.1%精度的电能计量。