尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

HLW8112芯片软件实现代码(17)

HLW8112芯片软件实现代码(17)
📅 发布时间:2026/7/18 5:27:01

接前一篇文章:HLW8112芯片软件实现代码(16)

二、寄存器介绍

2. 详述

(2)HLW8112_Measure函数

上一回继续讲解HLW8112_Measure函数,讲解了第6段代码。本回继续往下进行解析。为了便于理解和回顾,再次贴出HLW8112_Measure函数代码,在HARDWARE\HLW8112-SPI\HLW8112-SPI.c中,如下:

/*===================================================== * Function : void HLW8012_Measure(void); * Describe : * Input : none * Output : none * Return : none * Record : 2018/05/10 =====================================================*/ void HLW8112_Measure(void) { Read_HLW8112_PA_I(); Read_HLW8112_U(); Read_HLW8112_PA(); Read_HLW8112_EA(); Read_HLW8112_PB_I(); Read_HLW8112_PB(); Read_HLW8112_EB(); Read_HLW8112_DC_Offset(); printf("直流参数测量-SPI\r\n"); printf("A通道电能参数\r\n"); printf("U32_AC_V = %f\r\n", U32_AC_V); //电压 printf("U32_AC_I = %f\r\n", U32_AC_I); //A通道电流 printf("U32_AC_P = %f\r\n", U32_AC_P); //A通道功率 printf("U32_AC_E = %f\r\n", U32_AC_E); //A通道电量 printf("B通道电能参数\r\n"); printf("U32_AC_V = %f\r\n", U32_AC_V); //电压 printf("U32_AC_I_B = %f\r\n", U32_AC_I_B); //B通道电流 printf("U32_AC_P_B = %f\r\n", U32_AC_P_B); //B通道功率 printf("U32_AC_E_B = %f\r\n", U32_AC_E_B); //B通道电量 printf("\r\n\r\n"); //插入换行 printf("寄存器数值\r\n"); printf("U16_RMSIA_Offset = %x\r\n", U16_RMSIA_Offset); printf("U16_RMSIB_Offset = %x\r\n", U16_RMSIB_Offset); printf("U16_PAOS_Offset = %x\r\n", U16_PAOS_Offset); printf("U16_PBOS_Offset = %x\r\n", U16_PBOS_Offset); printf("U32_RMSIA_RegData = %x\r\n", U32_RMSIA_RegData); printf("U32_RMSIB_RegData = %x\r\n", U32_RMSIB_RegData); printf("U32_RMSU_RegData = %x\r\n", U32_RMSU_RegData); printf("U32_POWERPA_RegData = %x\r\n", U32_POWERPA_RegData); printf("U32_POWERPB_RegData = %x\r\n", U32_POWERPB_RegData); printf("\r\n\r\n"); //插入换行 }

7)Read_HLW8112_EB函数

Read_HLW8112_EB函数也在HLW8112-SPI.c中,代码如下:

/*===================================================== * Function : void void Read_HLW8112_EB(void) * Describe : 读取B通道有功电量 * Input : none * Output : none * Return : none * Record : 2019/03/28 =====================================================*/ void Read_HLW8112_EB(void) { //因为掉电数据不保存,所以系统上电后,应读出存在EEPROM内的电量数据,总电量 = EEPROM内电量数据+此次计算的电量 //功率计算公式 = (U32_ENERGY_PB_RegData * U16_EnergyBC_RegData * HFConst) / (电流系数 * 电压系数 * 2^29 * 2^12),HFConst(默认值1000H = 2^12) float a; U32_ENERGY_PB_RegData = Read_HLW8112_RegData(REG_ENERGY_PB_ADDR, 3); //读取功率寄存器值 a = (float)U32_ENERGY_PB_RegData; a = a * U16_EnergyBC_RegData; a = a / 0x20000000; //电量单位是0.001KWH,比如算出来是2.002,表示2.002KWH a = a / 1; //DEMO板的电流系数 = 1 a = a / 1; //DEMO板的电压系数 = 1 a = a * D_CAL_B_E; //直流测量需要校正,D_CAL_B_E是校正系数,默认是1 U32_AC_E_B = a; if (U32_AC_E_B >= 1) //每读到0.001度电就清零 { U32_AC_BACKUP_E_B += U32_AC_E_B; //IO_HLW8112_SDI = LOW; HLW8112_WriteREG_EN(); //打开写8112 Reg //清零REG_ENERGY_PB_ADDR寄存器 IO_HLW8112_CS = LOW; HLW8112_SPI_WriteReg(REG_EMUCON2_ADDR); HLW8112_SPI_WriteByte(0x07); //电量寄存器B读后清零,A不清零 HLW8112_SPI_WriteByte(0xff); IO_HLW8112_CS = HIGH; U32_ENERGY_PB_RegData = Read_HLW8112_RegData(REG_ENERGY_PB_ADDR, 3); //读后清零 U32_ENERGY_PB_RegData = Read_HLW8112_RegData(REG_ENERGY_PB_ADDR, 3); //读后清零 U32_AC_E_B = 0; //每读到0.001度电就清零,然后再设置读后不清零 IO_HLW8112_CS = LOW; HLW8112_SPI_WriteReg(REG_EMUCON2_ADDR); HLW8112_SPI_WriteByte(0x0f); //电量寄存器读后不清零 HLW8112_SPI_WriteByte(0xff); IO_HLW8112_CS = HIGH; HLW8112_WriteREG_DIS(); //关闭写8112 Reg } }

代码中,U32_ENERGY_PB_RegData 是同文件中的全局变量 ,保存的是B通道有功电能寄存器的值。

unsigned long U32_ENERGY_PB_RegData; //B通道有功电能(量)寄存器值

REG_ENERGY_PB_ADDR宏也在HLW8110.h中定义,如下:

#define REG_ENERGY_PB_ADDR 0x29

REG_ENERGY_PB_ADDR对应的是通道B有功电能寄存器(Energy_PB)。

通道B有功电能寄存器(Energy_PB)的详情如下:

读取了通道B有功电能值之后,保存到U32_ENERGY_PB_RegData变量中。这里注意:对于电能来说,就没有补码一说了。

接下来的一系列计算:

a = (float)U32_ENERGY_PB_RegData; a = a * U16_EnergyBC_RegData; a = a / 0x20000000; //电量单位是0.001KWH,比如算出来是2.002,表示2.002KWH a = a / 1; //DEMO板的电流系数 = 1 a = a / 1; //DEMO板的电压系数 = 1 a = a * D_CAL_B_E; //直流测量需要校正,D_CAL_B_E是校正系数,默认是1

就是按照芯片手册中的计算公式进行的计算:

代码中的第1行:

a = a * U16_EnergyBC_RegData;

相当于公式中的EnergyPB * EnergyPBC。

代码中的第2行:

a = a / 0x20000000; //电量单位是0.001KWH,比如算出来是2.002,表示2.002KWH

相当于公式中的EnergyPB * EnergyPBC / 2^29。

代码中的第3行:

a = a / 1; //DEMO板的电流系数 = 1

相当于公式中的EnergyPB * EnergyPBC / (2^29 * K1)。K1的值前文书讲过了,视具体的情况而定,对于官方Demo来说是1。

代码中的第4行:

a = a / 1; // DEMO板的电压系数 = 1

相当于公式中的EnergyPB * EnergyPBC / (2^29 * K1 * K2)。K2的值前文书讲过了,视具体的情况而定,对于官方Demo来说是1。

代码中的第5行:

a = a * D_CAL_B_E; //直流测量需要校正,D_CAL_B_E是校正系数,默认是1

是再通过功率校正系数进行校正。一般该系数取1就好。

同HLW8112芯片软件实现代码(14)-CSDN博客,上边公式中剩余2项HFconst和4096,由于HFConst的默认值为4096而相互抵消了。

接下来来到以下代码片段:

U32_AC_E_B = a; if (U32_AC_E_B >= 1) //每读到0.001度电就清零 { U32_AC_BACKUP_E_B += U32_AC_E_B; //IO_HLW8112_SDI = LOW; HLW8112_WriteREG_EN(); //打开写8112 Reg //清零REG_ENERGY_PB_ADDR寄存器 IO_HLW8112_CS = LOW; HLW8112_SPI_WriteReg(REG_EMUCON2_ADDR); HLW8112_SPI_WriteByte(0x07); //电量寄存器B读后清零,A不清零 HLW8112_SPI_WriteByte(0xff); IO_HLW8112_CS = HIGH; U32_ENERGY_PB_RegData = Read_HLW8112_RegData(REG_ENERGY_PB_ADDR, 3); //读后清零 U32_ENERGY_PB_RegData = Read_HLW8112_RegData(REG_ENERGY_PB_ADDR, 3); //读后清零 U32_AC_E_B = 0; //每读到0.001度电就清零,然后再设置读后不清零 IO_HLW8112_CS = LOW; HLW8112_SPI_WriteReg(REG_EMUCON2_ADDR); HLW8112_SPI_WriteByte(0x0f); //电量寄存器读后不清零 HLW8112_SPI_WriteByte(0xff); IO_HLW8112_CS = HIGH; HLW8112_WriteREG_DIS(); //关闭写8112 Reg }

与Read_HLW8112_EA函数中的机制类似,这段代码的意思是就是:当电能大于1度的时候,就设置EMUCON2(计量控制寄存器2),让EPB_CB在读后清零、而EPA_CA读后不清零。然后读取电能寄存器,使得电量寄存器A和B都清零。然后再设置电能寄存器A和B在读后均不清零。

下一回继续解析HLW8112_Measure函数中的后续函数。

相关新闻

  • MCP协议如何优化长上下文AI开发流程
  • 技术博客写作指南:编程语言、框架与开发工具实践
  • AI技术如何革新传统网络爬虫

最新新闻

  • Thorium浏览器:3大架构革新与5倍性能飞跃的深度技术解析
  • 文学作品中父母爱情叙事的功能解析与代际影响研究
  • 《绝望的主妇》S3E11剧情解析:秘密、真相与郊区生活表象
  • Anaconda环境管理:Python开发的高效解决方案
  • 互联网核心技术演进与TCP/IP协议实战解析
  • Android WorkManager:后台任务调度最佳实践

日新闻

  • 宝珀中国官方售后服务中心|官方热线和维修地址权威信息声明(2026年7月更新) - 宝珀官方售后服务中心
  • # 2026年北京知识产权律师推荐怎么选?看这五点关键不踩雷 - 本地品牌推荐
  • 2026实测教程:生成的拼豆图纸不满意怎么修改才省事 - 省事研究所

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号