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

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

目录

1、硬件设计


2、软件设计


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

image.png



1、硬件设计

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


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


image.png


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


image.png


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


image.png


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


image.png


原理图、PCB如下所示:


image.png




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,单位转换成A
  a = a * D_CAL_A_I;    //D_CAL_A_I是校正系数,默认是1
  F_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^23
  if ((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,电压转换成V
  a = 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;
   }
   else
     a =  (float)U32_POWERPA_RegData;
  //功率需要分正功和负功
  //计算,U16_AC_P = (U32_POWERPA_RegData * U16_PowerPAC_RegData)/(2^31*电压系数*电流系数)
  //单位为W,比如算出来5000.123,表示5000.123W
    a = 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是校正系数,默认是1
    F_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) = 0x20000000
  a =  (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是校正系数,默认是1
  F_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,最小负100
  F_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
  {
  //线性频率60HZ
  a = 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);  
  }
}

 


相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
5天前
|
物联网 测试技术 Android开发
构建未来:基于Android的智能物联网家居控制系统
【5月更文挑战第28天】 随着物联网(IoT)技术的不断演进,智能家居系统正变得越来越普遍。本文深入探讨了利用Android平台构建一个高效、可扩展的智能物联网家居控制系统。我们将分析系统架构、关键技术组件以及开发中的最佳实践,旨在为开发者提供一个清晰的指南,以实现设备之间的无缝通信和自动化控制。
|
6天前
|
存储 安全 物联网
Web3的时代-科技变革助力物联网智能化
Web3的时代正在到来,科技变革将助力物联网的智能化发展。随着Web3技术的不断创新和应用,我们有理由相信,物联网将迎来新的发展机遇和挑战,为构建智慧化的数字未来贡献更多可能性。
11 0
|
18天前
|
安全 搜索推荐 物联网
构建未来:基于Android的智能物联网家居系统
【5月更文挑战第15天】 在快速发展的数字化时代,智能物联网(IoT)技术与移动操作系统的结合正在塑造未来家居的生活方式。特别是Android平台,以其开放性、灵活性和广泛的用户基础,成为智能家居创新的理想选择。本文将探讨如何利用Android系统构建一个高效、安全且易于扩展的智能家居控制系统,涵盖系统设计、关键技术实现以及可能面临的挑战。通过分析具体案例,我们旨在为开发者和企业提供一套可行的解决方案蓝图,以促进智能家居领域的进一步发展。
|
18天前
|
传感器 物联网 大数据
物联网(IoT)技术与应用:塑造未来的智能化生活
【5月更文挑战第1天】物联网(IoT)技术整合传感器、嵌入式系统、云计算与大数据,连接智能设备,重塑生活与工作方式。应用涵盖智能家居、工业自动化、农业、智能城市及医疗健康,提升效率与便利性。然而,数据安全、设备兼容性及网络基础设施仍是挑战。随着5G和AI进步,IoT将在更多领域发挥潜力,驱动社会智能化转型,需关注技术挑战并加强创新。
|
18天前
|
监控 物联网 数据处理
构建未来:基于Android的智能物联网家居系统
【4月更文挑战第24天】 随着物联网技术的飞速发展,智能家居系统作为其重要分支之一,正逐渐渗透到千家万户。本文将详细探讨如何利用Android平台的灵活性和开放性,设计并实现一个高效、可靠的智能物联网家居系统。我们将从系统的架构设计出发,深入分析关键技术点,包括设备通信协议、用户界面设计以及后台数据处理等方面,并展示通过Android设备进行实时控制和监控的实用性。文章不仅聚焦于技术细节,还将对未来发展趋势及潜在挑战进行前瞻性讨论。
18 0
|
3天前
|
传感器 存储 机器学习/深度学习
物联网(IoT)简介:定义、技术与应用
【5月更文挑战第30天】物联网(IoT)是将物品通过嵌入式系统、传感器及通信技术连接至互联网,实现物物、物人交互和数据共享的技术。其关键包括传感器、通信、嵌入式系统、云计算和人工智能技术。物联网应用于智能家居、智慧城市、工业自动化、农业和健康医疗等领域,通过Arduino等平台可实现简单数据传输。随着技术发展,物联网将深远影响人们生活和工作方式。
15 3
|
2天前
|
Cloud Native 物联网 持续交付
未来科技浪潮:区块链、物联网与虚拟现实的融合创新云原生技术:重塑IT架构的未来
【5月更文挑战第31天】在信息技术飞速发展的今天,新兴技术如区块链、物联网和虚拟现实等正成为推动社会进步的重要力量。本文将探讨这些技术的发展趋势及其在各领域的应用前景,揭示它们如何相互融合,共同塑造一个智能化、互联的未来世界。 【5月更文挑战第31天】本文深入探讨了云原生技术的兴起及其对传统IT架构的颠覆性影响。通过分析云原生的核心概念,如微服务、容器化、以及持续集成/持续部署(CI/CD),文章揭示了这些技术如何促进更高效、灵活和可扩展的软件开发实践。同时,本文还讨论了企业在采用云原生技术时面临的挑战与机遇,并展望了云原生技术在未来IT领域的发展趋势。
|
2天前
|
存储 边缘计算 物联网
未来技术的融合潮流:区块链、物联网与虚拟现实的革新之路
【5月更文挑战第31天】随着科技的不断进步,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正在逐渐改变我们的生活和工作方式。本文将探讨这些技术的发展动态,并分析它们在各个应用场景中的结合点,揭示如何利用这些技术推动创新和效率的提升。
|
2天前
|
传感器 供应链 物联网
未来技术纵横谈:区块链、物联网与虚拟现实的革新融合
【5月更文挑战第31天】 在数字化浪潮中,创新技术如区块链、物联网(IoT)、和虚拟现实(VR)正塑造着新的经济和社会格局。本文将探讨这些技术的最新发展趋势,分析它们在不同领域的应用前景,并讨论这些技术如何相互融合,共同推动第四次工业革命的深入发展。通过案例分析和专家访谈,文章揭示了这些技术在未来可能带来的变革,并对企业和个人如何适应这一趋势提出了建议。
|
2天前
|
传感器 机器学习/深度学习 数据采集
物联网中的数据收集与处理技术
【5月更文挑战第31天】物联网依赖数据收集与处理技术实现智能化和价值化。传感器实时采集各类信息,但数据多样、复杂及海量性带来挑战。MQTT等协议用于高效传输,Python示例展示了数据发布。数据处理涉及清洗、转换和分析,如机器学习用于故障预测。实时数据处理技术确保高时效性应用的需求。持续的技术创新将推动物联网在各领域的广泛应用。
6 0

相关产品

  • 物联网平台