目录

1、硬件设计

2、软件设计


1、硬件设计

HLW8110是一款高精度的电能计量 IC,它采用 CMOS 制造工艺,主要用于单相计量应用。它能够测量线电压和电流,并能计算有功功率,视在功率和功率因素。该器件内部集成了二个∑-Δ型 ADC 和一个高精度的电能计量内核。输入通道支持灵活的 PGA 设置,因此 HLW8110 适合与不同类型的传感器使用,如电流互感器(CT)和低阻值分流器。

项目资源下载请参见:https://download.csdn.net/download/m0_38106923/87775438

HLW8110 电能计量 IC 采用 3.3V 或 5.0V 电源供电,内置 3.579M 振荡器,可以通过 UART 口进行数据通讯,波特率为 9600bps。

HLW8110的典型电路,外围电路简单,外围器件非常少,单路通道可用于检测负载设备的功率、电压、电流和用电量,通过 UART 或接口传输数据至 MCU,HLW8110 内部可以设置功率过载、电压过载和电流过载阀值,通过内部寄存器可以查询,并可以检测电压过零点。

官方测试,使用采样电阻或者互感器的理论数据误差如下所示:

在使用之前先简单设计一块Demo板进行调测,实物模块如下所示:

原理图、PCB如下所示:

2、软件设计

由于代码量较多,部分配置代码不再赘述,仅仅展示核心算法代码。

读取通道电流,实现代码如下所示:

void Read_HLW8110_IA(void)
{   float a;Uart_Read_HLW8110_Reg(REG_RMSIA_ADDR,3);delay_ms(10);if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) ){U32_RMSIA_RegData = (unsigned long)(u8_RxBuf[0]<<16) + (unsigned long)(u8_RxBuf[1]<<8) + (unsigned long)(u8_RxBuf[2]); printf("A通道电流寄存器:%lx\n " ,U32_RMSIA_RegData);}else{printf("A通道电流寄存器读取出错\r\n");B_Read_Error = 1;}//A通道电流PGA = 16,电压通道PGA = 1;电流采样电阻1mR,电压采样电阻1M//计算公式,U16_AC_I = (U32_RMSIA_RegData * U16_RMSIAC_RegData)/(电流系数* 2^23)if ((U32_RMSIA_RegData & 0x800000) == 0x800000){F_AC_I = 0;}else{a = (float)U32_RMSIA_RegData;a = a * U16_RMSIAC_RegData;a  = a/0x800000;                     //电流计算出来的浮点数单位是mA,比如5003.12 a = a/1;                               // 1 = 电流系数a = a/1000;              //a= 5003ma,a/1000 = 5.003A,单位转换成Aa = a * D_CAL_A_I;               //D_CAL_A_I是校正系数,默认是1F_AC_I = a;}
}

读取通道电压,实现代码如下所示:

void Read_HLW8110_U(void)
{float a;Uart_Read_HLW8110_Reg(REG_RMSU_ADDR,3);delay_ms(10);if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) ){U32_RMSU_RegData = (unsigned long)(u8_RxBuf[0]<<16) + (unsigned long)(u8_RxBuf[1]<<8) + (unsigned long)(u8_RxBuf[2]);printf("电压通道寄存器:%lx\n " ,U32_RMSU_RegData);}else{printf("电压通道寄存器读取出错\r\n");B_Read_Error = 1;}//电压//计算:U16_AC_V = (U32_RMSU_RegData * U16_RMSUC_RegData)/2^23if ((U32_RMSU_RegData &0x800000) == 0x800000){F_AC_V = 0;}else{a =  (float)U32_RMSU_RegData;a = a*U16_RMSUC_RegData;  a = a/0x400000;       a = a/1;                         // 1 = 电压系数a = a/100;                 //计算出a = 22083.12mV,a/100表示220.8312V,电压转换成Va = a*D_CAL_U;              //D_CAL_U是校正系数,默认是1,     F_AC_V = a;}
}

读取通道功率,实现代码如下所示:

void Read_HLW8110_PA(void)
{float a;float b;Uart_Read_HLW8110_Reg(REG_POWER_PA_ADDR,4);delay_ms(10);if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) ){U32_POWERPA_RegData = (unsigned long)(u8_RxBuf[0]<<24) + (unsigned long)(u8_RxBuf[1]<<16) + (unsigned long)(u8_RxBuf[2]<<8) + (unsigned long)(u8_RxBuf[3]);printf("A通道功率寄存器:%lx\n " ,U32_POWERPA_RegData);}else{printf("A通道功率寄存器读取出错\r\n");B_Read_Error = 1;}if (U32_POWERPA_RegData > 0x80000000){b = ~U32_POWERPA_RegData;a = (float)b;}elsea =  (float)U32_POWERPA_RegData;//功率需要分正功和负功//计算,U16_AC_P = (U32_POWERPA_RegData * U16_PowerPAC_RegData)/(2^31*电压系数*电流系数)//单位为W,比如算出来5000.123,表示5000.123Wa = a*U16_PowerPAC_RegData;a = a/0x80000000;             a = a/1;                                          // 1 = 电流系数a = a/1;                                       // 1 = 电压系数a = a * D_CAL_A_P;                     //D_CAL_A_P是校正系数,默认是1F_AC_P = a;                                    //单位为W,比如算出来5000.123,表示5000.123W
}

读取通道有功电量,实现代码如下所示:

void Read_HLW8110_EA(void)
{float a;Uart_Read_HLW8110_Reg(REG_ENERGY_PA_ADDR,3); delay_ms(10);if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) ){U32_ENERGY_PA_RegData = (unsigned long)(u8_RxBuf[0]<<16) + (unsigned long)(u8_RxBuf[1]<<8) + (unsigned long)(u8_RxBuf[2]);printf("A通道有功电量寄存器:%lx\n " ,U32_ENERGY_PA_RegData);}else{printf("A通道有功电量寄存器读取出错\r\n");B_Read_Error = 1;}Uart_Read_HLW8110_Reg(REG_HFCONST_ADDR,2); delay_ms(10);if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) ){U16_HFConst_RegData = (unsigned int)(u8_RxBuf[0]<<8) + (unsigned int)(u8_RxBuf[1]);printf("HFCONST常数 = :%d\n " ,U16_HFConst_RegData);}else{printf("HFCONST常数寄存器读取出错\r\n");B_Read_Error = 1;}//电量计算,电量 = (U32_ENERGY_PA_RegData * U16_EnergyAC_RegData * HFCONST) /(K1*K2 * 2^29 * 4096)//HFCONST:默认值是0x1000, HFCONST/(2^29 * 4096) = 0x20000000a =  (float)U32_ENERGY_PA_RegData;   a = a*U16_EnergyAC_RegData;a = a/0x20000000;             //电量单位是0.001KWH,比如算出来是2.002,表示2.002KWH    a = a/1;                                          // 1 = 电流系数a = a/1;                                       // 1 = 电压系数a = a * D_CAL_A_E;                 //D_CAL_A_E是校正系数,默认是1F_AC_E = a;F_AC_BACKUP_E = F_AC_E;
}

读取通道的线性频率,实现代码如下所示:

void Read_HLW8110_LineFreq(void)
{float a;unsigned long b;Uart_Read_HLW8110_Reg(REG_UFREQ_ADDR,2);delay_ms(10);if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) ){b = (unsigned long)(u8_RxBuf[0]<<8) + (unsigned long)(u8_RxBuf[1]);printf("A通道线性频率寄存器:%ld\n " ,b);}else{printf("A通道线性频率寄存器读取出错\r\n");B_Read_Error = 1;}a = (float)b;a = 3579545/(8*a);    F_AC_LINE_Freq = a;
}

读取通道功率因素,实现代码如下所示:

void Read_HLW8110_PF(void)
{float a;unsigned long b;//测量A通道的功率因素,需要发送EA+5A命令
//测量B通道的功率因素,需要发送EA+A5命令    Uart_Read_HLW8110_Reg(REG_PF_ADDR,3);delay_ms(10);if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) ){b = (unsigned long)(u8_RxBuf[0]<<16) + (unsigned long)(u8_RxBuf[1]<<8) + (unsigned long)(u8_RxBuf[2]);printf("A通道功率因素寄存器:%ld\n " ,b);}else{printf("读取A通道功率因素寄存器出错\r\n");B_Read_Error = 1;}if (b>0x800000)       //为负,容性负载{a = (float)(0xffffff-b + 1)/0x7fffff;}else{a = (float)b/0x7fffff;}if (F_AC_P < 0.3) // 小于0.3W,空载或小功率,PF不准a = 0; //功率因素*100,最大为100,最小负100F_AC_PF = a;
}

读取通道相位角,实现代码如下所示:

void Read_HLW8110_Angle(void)
{float a;   unsigned long b;Uart_Read_HLW8110_Reg(REG_ANGLE_ADDR,2);delay_ms(10);if ( u8_RxBuf[u8_RX_Length-1] == HLW8110_checkSum_Read(u8_RX_Length) ){b =(unsigned long)(u8_RxBuf[0]<<8) + (unsigned long)(u8_RxBuf[1]);printf("A通道线相角寄存器:%ld\n " ,b);}else{printf("A通道线相角寄存器出错\r\n");B_Read_Error = 1;}if ( F_AC_PF < 55)  //线性频率50HZ{a = b;a = a * 0.0805;F_Angle = a;}else{//线性频率60HZa = b;a = a * 0.0965;F_Angle = a;}if (F_AC_P < 0.5)        //功率小于0.5时,说明没有负载,相角为0{F_Angle = 0;}if (F_Angle < 90){a = F_Angle;printf("电流超前电压:%f\n " ,a);}else if (F_Angle < 180){a = 180-F_Angle;printf("电流滞后电压:%f\n " ,a);  }else if (F_Angle < 360){a = 360 - F_Angle;printf("电流滞后电压:%f\n " ,a); }else{a = F_Angle -360;printf("电流超前电压:%f\n " ,a);    }
}

项目资源下载请参见:https://download.csdn.net/download/m0_38106923/87775438

HLW8110电耗采集芯片的硬件设计和软件驱动方法相关推荐

  1. 国产芯片WiFi物联网智能插座—电耗采集功能设计

    目录 1.硬件设计 2.软件设计 WiFi物联网智能插座的电耗采集依托于合力为的HLW8110计量芯片实现,选取它的主要原因是精度不错,价格美丽,并且可以通过串口驱动,使用便捷. 1.硬件设计 HLW ...

  2. 复习单片机:动态数码管(1 数码管介绍+2 74HC245 和 74HC138 芯片介绍+3 硬件设计+4 软件设计+5 实验现象)

    本章所要实现的功能是:控制动态数码管从左至右显示数字 0-7.学习本章可以参考 前面的实验章节内容.本章分为如下几部分内容: 1 数码管介绍 2 74HC245 和 74HC138 芯片介绍 3 硬件 ...

  3. 复习单片机:直流电机(内含1 直流电机介绍+2 ULN2003 芯片介绍+3 硬件设计+4 软件设计+5原始代码+6. 实验现象)

    在 51 单片机应用中,电机控制的应用也非常多.本章所要实现的功能是:直流电机工作约 5S 后停止. 切记:51 单片机主要是用来控制而非驱动,如果直接使用芯片的 GPIO 管脚去驱动大功率器件,要么 ...

  4. 复习单片机:温度检测 DS18B20(内含:1 DS18B20 介绍+2 硬件设计+3 软件设计+4 实验现象)

    本章分为如下几部分内容: 1 DS18B20 介绍 2 硬件设计 3 软件设计 4 实验现象 1 DS18B20 介绍 DS18B20 温度传感器的内部存储器包括一个高速的暂存器 RAM 和一个非易 ...

  5. ESP32系列:三线SPI硬件设计及程序驱动设计(SPI FLASH为例)

    (1)三线SPI硬件设计 首先,ESP32是支持三线制和四线制的,三线制为半双工通信,四线制为全双工通信.如果你们用的芯片不支持三线制,就不要再折腾了,支不支持三线制,看芯片的datasheet.如图 ...

  6. 矩阵键盘硬件设计及软件流程

    很多情况下我们芯片的IO口不够用,但是有需要很多按键的话,矩阵键盘是一个很好的选择,通过矩阵键盘的设计我们可以用很少的IO来实现多个按键的功能.下面我们来介绍一下矩阵键盘的相关设计,不多说直接上图 上 ...

  7. ADSP-21489的开发详解:VDSP+自己编程写代码开发(5-SDRAM 内存的硬件设计和软件例程)(含源代码)

    硬件准备 ADSP-21489EVB:ADI 21489处理器的开发板 AD-HP530ICE:ADI DSP专用仿真器 USBi:ADI SigmaDSP和SHARC DSP的图形化编程调试器 软件 ...

  8. CH343芯片应用—硬件设计指南

    CH343属于沁恒第三代USB转串口芯片系列的单串口型号,基于经典版CH340芯片完成技术革新,实现USB转高速异步串口,支持最高6Mbps串口波特率. 电源设计 CH343芯片有3个电源端分别是VD ...

  9. CH9101芯片应用—硬件设计指南

    CH9101芯片属于沁恒第三代USB转串口芯片系列的单串口型号,基于经典版CH340芯片完成技术革新,实现USB转高速异步串口,支持最高6Mbps串口波特率.CH9101提供了5种封装,CH9101U ...

最新文章

  1. Linux下部署开源版“禅道”项目管理系统
  2. 人工智能时代背景下,NLP方向或将悄悄崛起
  3. 阿里 RocketMQ 如何让双十一峰值之下 0 故障?
  4. Linux虚拟机设备无法连接到它的理想主机控制器
  5. php中的echo单引号_PHP的数据类型
  6. 数据结构关键路径_数据结构与算法之关键路径_一点课堂(多岸学院)
  7. 转:SparkConf 配置的用法
  8. html人物动画效果图,9款用HTML5/CSS3制作的动物、人物动画
  9. 利用c语言建立交易系统,【图】手把手教会你构建自己的交易系统 - 4_股票论坛,炒股公式,股票指标,股票公式,选股公式_数据、教程交流论坛_理想论坛 - 股票论坛...
  10. Gnome Tweak Tool 3.0.5发布
  11. 高温保护_耐高温保护膜可以用在哪一方面?
  12. 哈希表与区块链的简单介绍
  13. 三容水箱液位控制系统_过程控制实验-三容水箱液位控制系统
  14. 面试神仙打架?探秘华为人工智能工程师岗位
  15. Python调用xbox手柄马达震动
  16. IDC(国际数据公司),如何查询免费报告
  17. ROS_Kinetic_29 kamtoa simulation学习与示例分析(一)
  18. 这个商品让我想到了什么……
  19. 兄弟俩畅游Tomcat城市的SpringMVC科技园区
  20. python处理嵌套字典写入Excel

热门文章

  1. Cooperative Perception协同感知学习记录
  2. 推荐一个win7镜像(支持uefi,已升级补丁,带驱动)
  3. Retrofit 一次个请求下载多个图片
  4. 如何开展软件测试工作
  5. java 四则混合运算_Java实现四则混合运算代码示例
  6. js 格式化日期 yyyy-MM-dd等其他多种格式
  7. Gox语言——支持跨平台原生GUI开发的轻量级全功能脚本语言 - GX1
  8. Pix4D mapper如何添加最简单方式添加坐标系
  9. 个人社保缴纳接口 保公积金缴费数据实现
  10. OPPO互联网java后端二面题目