HLW8112芯片软件实现代码(16) 接前一篇文章HLW8112芯片软件实现代码15二、寄存器介绍2. 详述2HLW8112_Measure函数上一回继续讲解HLW8112_Measure函数讲解了第5段代码。本回继续往下进行解析。为了便于理解和回顾再次贴出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); //插入换行 }6Read_HLW8112_PB函数Read_HLW8112_PB函数也在HLW8112-SPI.c中代码如下/* * Function : void Read_HLW8112_PB(void) * Describe : 读取B通道功率 * Input : none * Output : none * Return : none * Record : 2019/03/28 */ void Read_HLW8112_PB(void) { //计算公式U16_AC_P (U32_POWERPA_RegData * U16_PowerPAC_RegData) / (电压系数 * 电流系数 * 2^31) float a; unsigned long b; U32_POWERPB_RegData Read_HLW8112_RegData(REG_POWER_PB_ADDR, 4); //读取功率寄存器值 if (U32_POWERPB_RegData 0x80000000) { b ~U32_POWERPB_RegData; a (float)b; } else { a (float)U32_POWERPB_RegData; } a a * U16_PowerPBC_RegData; a a / 1; //DEMO板的电流系数 1 a a / 1; //DEMO板的电压系数 1 a a / 0x80000000; //单位为mW比如算出来5000123表示5000.123W a a * D_CAL_B_P; //直流测量需要校正D_CAL_A_P是校正系数默认是1 U32_AC_P_B a; }代码中U32_POWERPB_RegData是同文件中的全局变量 保存的是B通道功率寄存器的值。unsigned long U32_POWERPB_RegData; //B通道功率寄存器值REG_POWER_PB_ADDR宏 也在HLW8110.h中定义如下#define REG_POWER_PB_ADDR 0x2DREG_POWER_PB_ADDR对应的是通道B平均功率寄存器PowerPB。通道B平均功率寄存器PowerPB的详情如下读取了通道B有功功率值之后保存到U32_POWERPB_RegData变量中。接下来判断最高位Bit31是否为1。如果为1则说明是补码需要取绝对值如果为0则是正常值注意这里讲解的是直流测量交流测量另有计算方法。这一段对应上边代码中的以下部分if (U32_POWERPB_RegData 0x80000000) { b ~U32_POWERPB_RegData; a (float)b; } else { a (float)U32_POWERPB_RegData; }接下来的一系列计算a a * U16_PowerPBC_RegData; a a / 1; //DEMO板的电流系数 1 a a / 1; //DEMO板的电压系数 1 a a / 0x80000000; //单位为mW比如算出来5000123表示5000.123W a a * D_CAL_B_P; //直流测量需要校正D_CAL_A_P是校正系数默认是1就是按照芯片手册中的计算公式进行的计算代码中的第1行a a * U16_PowerPBC_RegData;相当于公式中的PowerPB * PowerPBC。代码中的第2行a a / 1; //DEMO板的电流系数 1相当于公式中的PowerPB * PowerPBC / K1。K1的值前文书讲过了视具体的情况而定对于官方Demo来说是1。如同上回书一样到底K1是与电流A通道相同还是单独算的需要后续探明。代码中的第3行a a / 1; //DEMO板的电压系数 1相当于公式中的PowerPB * PowerPBC / (K1 * K2) 。K2的值前文书讲过了视具体的情况而定对于官方Demo来说是1。代码中的第4行a a / 0x80000000; //单位为mW比如算出来5000123表示5000.123W相当于公式中的PowerPB * PowerPBC / (K1 * K2 * 2^31) 。代码中的第5行a a * D_CAL_B_P; //直流测量需要校正D_CAL_A_P是校正系数默认是1是再通过功率校正系数进行校正。一般该系数取1就好。同样实际上B通道和A通道的方法如出一辙参见HLW8112芯片软件实现代码13-CSDN博客只不过B通道一般用于测量漏电。下一回继续解析HLW8112_Measure函数中的后续函数。

相关新闻

最新新闻

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现 【免费下载链接】serenity The Serenity Operating System 🐞 项目地址: https://gitcode.com/GitHub_Trending/se/serenity 导读 本文以 getopt(3) 手册 为核心&a…

2026/9/30 14:41:37
轻量服务器还是ECS?大促云服务器选购与避坑实战指南

轻量服务器还是ECS?大促云服务器选购与避坑实战指南

每年大促节点,群里永远有人在问同一个问题:“38元的轻量服务器到底怎么抢?为什么我每次点进去都是已售罄?68元直购和99元的ECS我到底选哪个?”作为一个常年帮团队和自己采购云服务器的老用户,我太清楚这种纠…

2026/9/30 21:32:07
为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南 【免费下载链接】agents Multi-harness agentic plugin marketplace for Claude Code, Codex, Cursor, OpenCode, GitHub Copilot, and Google Antigravity 项目地址:…

2026/9/30 19:41:56
PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署 【免费下载链接】PaddleOCR Turn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between i…

2026/9/30 18:23:43
Spring源码解析:构造器注入的类型转换与候选匹配机制

Spring源码解析:构造器注入的类型转换与候选匹配机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 22:57:57
openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由 【免费下载链接】openai-agents-python A lightweight, powerful framework for multi-agent workflows 项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-pyth…

2026/9/30 21:32:11

日新闻

周新闻

月新闻