软件设计、硬件设计
简介
合力为官网,hlw8012规格书中资料:
HLW8012 为单相多功能计量芯片,其提供高频脉冲 CF 用于电能计量和高频 CF1 用于指示电流有效值或者电压有效值。
高频脉冲 CF,指示有功功率,满足 50/60Hz IEC 687/1036 标准的准确度要求,在 1000:1 范围内达到±0.2%的精度。
[说明]在满幅输入是 1000W 的条件,在 1W 到 1000W 的量程范围内,有功功率的测量精度(线性度)是 0.2%。 高频脉冲 CF1,可配置成为输出电流有效值或者电压有效值,在 500:1 范围内达到±0.5%的精度。
硬件设计
厂家推荐电路
参考合力为推荐的方案
互感器采样方案
220v情况下,将采样电阻换成1Ω,并且与电流互感器相连
关注获取方案
软件设计
使用GPIO中断测量的方案网上有很多,所以不做介绍
此处介绍的是需要测量很多组电能时,需要使用mcu上20,30甚至更多gpio的情况,每个hlw8012芯片测量时需要至少2个gpio,所以其他带uart、spi的芯片也不适合使用。
使用单片机测量频率或周期,通常是利用单片机的定时计数器来完成的,测量的基本方法和原理有两种:
测频法:在限定的时间内(如1秒钟)检测脉冲的个数。(采用此法)
测周法:测试限定的脉冲个数之间的时间。
- 采样频率根据实际测量频率决定,设置为100us测量一次引脚电平状态-----采样函数在100us的定时器中断函数中。
- 假设总共测量时间为200ms,启动测量时,先记录一次电平状态begin,之后每100us判断一次,当两次电平状态不一致时,count++,到200ms后停止测量。
- 此时 count/2 = 脉冲个数 , 脉冲个数/200ms = 频率。
代码讲解
第一部分限定时间控制与逻辑控制,在1ms软件定时器中执行(可先看第二部分),可参考我的其他文章参考单片机框架。
static float PulseTemp = 0; //脉冲个数
static float TimeTemp = 0; //总时间
if(GbHlw200MsTimerEnable) //需要启动测量时,此标志位置1
{
GbHlw100UsScanEnable = 1; //启动采样
if(Gu16HlwTimeCnt++ == 200) //200ms的总时间
{
GbHlw100UsScanEnable = 0; //到时间先关
Gu16HlwTimeCnt = 0;
GbHlw200MsTimerEnable = 0;
PulseTemp = 0;
TimeTemp = 0;
PulseTemp = ((Gu16PulseJumpCount*1.0 + 1.0) / 2.0); //脉冲个数 +1为补偿
TimeTemp = 200 * 0.001; //总时间 //换算成 S
Gu16HlwTempFrequency = PulseTemp / TimeTemp; //最终的频率
Gu16PulseJumpCount = 0; //翻转次数清零
}
}
第二部分为采样函数,每100us访问一次
void HlwPinScan(void) //在100us定时器中扫描
{
static bit SbTempPin; //临时
static bit SbBeginFlag; //记录刚进来时电平状态
bit TempStatus;
if(GbHlw100UsScanEnable) //在1ms定时器中开启扫描后
{
if(SbBeginFlag == 0) //记录第一次判断时的电平状态
{
SbBeginFlag = 1; //开始采样
Gu16PulseJumpCount = 0;
SbTempPin = Pin5; //读取电平状态
}
else
{
if(Pin5 != SbTempPin)
{
SbTempPin = Pin5; //记录当前状态
Gu16PulseJumpCount++; //记录翻转次数,全局变量,配合使用
}
}
}
else
SbBeginFlag = 0;
}
计算部分
高精度:
最好分段校正,分段计算斜率
用固定交流负载,例如100w,频率实际测得f1,110w时,频率测得f2,计算小区段的斜率,通过多次测量校正,最后得到的结果会很准确。
低精度:
按照计算格式来即可:
使用8012测量10组以上的功率、电流,可评论获取代码