目录

1、硬件设计

2、软件设计


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

1、硬件设计

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

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);    }
}

国产芯片WiFi物联网智能插座—电耗采集功能设计相关推荐

  1. 国产芯片WiFi物联网智能插座—项目简介

    目录 1.项目背景 2.项目功能 3.硬件设计 随着智能电子设备的不断进步和发展,必然会提升智能设备的使用率,诸如智能移动设备.智能家居等设备发展极为迅速.物联网作为一个互联网和通信网络的信息载体,能 ...

  2. HLW8110电耗采集芯片的硬件设计和软件驱动方法

    目录 1.硬件设计 2.软件设计 1.硬件设计 HLW8110是一款高精度的电能计量 IC,它采用 CMOS 制造工艺,主要用于单相计量应用.它能够测量线电压和电流,并能计算有功功率,视在功率和功率因 ...

  3. 物联网信号测试软件,物联网开关量信号采集 NPN转WIFI 检测计数器

    原标题:物联网开关量信号采集 NPN转WIFI 检测计数器 产品概述: WJ160产品是一种物联网和工业以太网采集模块,实现了传感器与网络之间形成透明的数据交互.可以将传感器的开关量数据转发到网络. ...

  4. Kithings如何选择Wi-Fi物联网芯片(第一篇)

    kithings.com 我们做Wi-Fi物联网解决方案已经思考.实践了许久了,在原来的公司里,也早就开始动手做准备了,比如智能工卡就是去年就已经开发原型出来,并已经接洽在一些试用了.       作 ...

  5. 《安富莱嵌入式周报》第278期:基于RUST编程语言RTOS,固态继电器芯片,微软发布物联网组件框架,支持多款蜂窝,LoRa和WiFi芯片工业物联网4.0书籍

    往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...

  6. 乐鑫ESP32完美对标AP6212,国产芯片不缺货,不涨价!牛

    继乐鑫ESP8089对标瑞昱RTL818后,已经有不少做OTT盒子.Ipcamera以及无人机的客户实现完美替换,国产芯片的崛起,终于让他们不用再为MCU缺货.涨价而烦恼! 此次AP6212缺货导至价 ...

  7. 国产芯片、数字人体……今年的服贸会正上演一场“科技大秀”

    科技云报道原创. 戴上VR眼镜,在虚拟世界中逛街购物,商品直接快递到家:换上"超级SIM卡",手机摇身变为数字钱包,关机状态也能实现数字人民币支付:负载能力达到150公斤的磁吸附机 ...

  8. 上海亚商投顾:沪指低开高走 国产芯片板块掀涨停潮

    上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股. 市场情绪 三大指数今日低开高走,深成指尾盘涨近1%,科创50指数大涨超2%.芯片板块掀涨停潮,景嘉 ...

  9. 2023年最新国产芯片生态图谱(附80+类国产名录)

    刚刚过去的2022年,半导体由热遇冷,进入调整期.但展望未来,全球半导体产业将很快走出周期低估,市场规模也将随之扩张,根据WSTS的数据,今年市场有望超过6000亿美元,半导体企业将迎来新一轮的机遇. ...

最新文章

  1. Gartner 2019 年供应链技术八大趋势:AI、高级分析、物联网、RPA、自主设备、数字孪生...
  2. Hibernate使用C3P0配置
  3. 代码之美 - 小函数总结
  4. 谈谈程序链接及分段那些事
  5. IP phone配製學習
  6. 2021.01.30 Visual QA论文阅读
  7. SAP OData 服务在 gateway 层出错,应该如何处理?通过一个错误消息 Query XXX is invalid or contains errors 来举例说明
  8. nodejs从服务器返回静态文件,nodejs静态资源服务器
  9. 阿里小二平时和商家交流的时候,明确告知流量喜欢什么样的产品?
  10. 命令行编译java文件
  11. 云骞开源即时通讯软件 WEBIM
  12. vue-sytle样式抽离
  13. kaggle房价预测代码
  14. 数据结构入门6-2(图 - 图的应用)
  15. 基于Java web的论坛BBS系统设计与实现
  16. android os仿ios,安卓仿ios12桌面全套仿安卓完美版
  17. python安装包下载及安装教程
  18. 多校联考 CSP-J 2019 第三次模拟赛 题解
  19. iPhone14 3D模型免费下载
  20. Invalid array length

热门文章

  1. Ubuntu 系统 在终端中过滤log 特殊的信息
  2. android Style(样式)的解析
  3. linux epoll用法
  4. Python学习笔记3——三大结构:顺序,分支,循环3
  5. Go 学习笔记(34)— Go 方法声明、方法调用、方法值、方法表达式、切片对象方法、指针对象方法
  6. redis 在 php 中的应用(事务 [ Transaction ] 篇)
  7. block_dump观察Linux IO写入的具体文件(mysqld)
  8. JavaScript对象掺杂点原型
  9. css样式之边框和内外边距
  10. 【转】sed 简明教程