使用BL0942 计量芯片获取计量数据
目录
- 概述
- 主要特点
- 系统框图
- 封装与管脚描述
- 大致寄存器说明
- 硬件实现和计量数据转换公式
- 通讯接口-SPI
- 代码实现
概述
BL0942 是一颗内置时钟免校准电能计量芯片。
BL0942 能够测量电流、电压有效值、有功功率、有功电能量等参数。
主要特点
- 两路独立的 Sigma-Delta ADC,一路电流和一路电压
- 电流有效值范围(10mA~30A)@1mohm
- 有功电能(1w~6600w)@1mohm@220V
- 可输出电流、电压有效值,快速电流有效值,有功功率
- 批次出厂增益误差小于 1%,外围元件满足一定条件下可以免校准
- SPI(最快速率支持 900KHz)/UART(4800-38400bps)通信方式(TSSOP14L 封装支持最多 4 片级联
Uart 通信) - 电源掉电监测,低于 2.7V 时,芯片进入复位状态
- 内置 1.218V 参考电压源
- 芯片单工作电源 3.3V,低功耗 10mW(典型值)
系统框图
封装与管脚描述
大致寄存器说明
硬件实现和计量数据转换公式
通讯接口-SPI
- 工作在从模式
- 半双工通讯,通讯率可配,最大通讯速率 900Khz
- 固定一种时钟极性/相位(CPOL=0,CPHA=1)
- 帧结构:
在通信模式下,先发送 8bit 识别字节(0x58) 或(0xA8),(0x58)是读操作识别字节,(0xA8)是写操作
识别字节,然后再发送寄存器地址字节,决定访问寄存器的地址(请参见 BL0942 寄存器列表)。
下图分别示出读出和写入操作的数据传送顺序。一帧数据传送完成,BL0942 重新进入通信模式。每次读/写操作所需的 SCLK 的脉冲个数均为 48 位。
代码实现
1.SPI通信–HAL库发送接收接口
SPI 使用硬件SPI软控制CS
//延时函数,一个计数1US
void Bl09_Delay(u8 count);
//发送:
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);
//接收:
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout);
2.
#define R_I_RMS 0x03 //电流有效值寄存器,无符号
#define R_V_RMS 0x04 //电压有效值寄存器,无符号
#define R_WATT 0x06 //有功功率寄存器,有符号
#define R_CF_CNT 0x07 //有功电能脉冲计数寄存器,无符号
#define R_MODE 0x19 //用户模式选择寄存器
#define R_SOFT_RESET 0x1c //写入 0x5A5A5A 时,用户区寄存器复位
#define R_USR_WRPROT 0x1D //用户写保护设置寄存器volatile float Meter_Rece_Voltage = 0;
volatile float Meter_Rece_Current = 0;
volatile float Meter_Rece_Elec = 0;/*******************************************************************************
功能描述:对BL0942的寄存器写
输入参数: addr:寄存器地址temp:寄存器值
*******************************************************************************/
void BL09_Write_Reg(uint8 addr, uint32 temp)
{u8 sendData[6] = {0};sendData[0] = 0XA8; //写操作识别字节sendData[1] = addr; //地址sendData[2] = (u8)((temp&0x00ff0000)>>16);sendData[3] = (u8)((temp&0x0000ff00)>>8);sendData[4] = (u8)((temp&0x000000ff));//检验和数据sendData[5] = ((sendData[0]+sendData[1]+sendData[2]+sendData[3]+sendData[4]) & 0xff);sendData[5] = ~sendData[5];//拉高CSHAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);Bl09_Delay(10);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);Bl09_Delay(5);HAL_SPI_Transmit(&hspi2, sendData, 6 ,1000);Bl09_Delay(5);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
}/*******************************************************************************
功能描述:对BL0942的寄存器读
输入参数: addr:寄存器地址data:
返回值: 0:读取失败1:读取成功
*******************************************************************************/
uint8 BL09_Read_Reg(uint8 addr, uint32 *data)
{u8 sendData[6] = {0};u8 recvData[6] = {0};u8 checkSum;sendData[0] = 0x58; //读操作识别字节sendData[1] = addr; //寄存器地址//拉高CSHAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);Bl09_Delay(10);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);Bl09_Delay(5);HAL_SPI_TransmitReceive(&hspi2, sendData, recvData, 6, 1000);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);//校验和计算checkSum = (sendData[0]+sendData[1]+recvData[2]+recvData[3]+recvData[4]) & 0xff;checkSum = ~checkSum;if(checkSum != recvData[5])return 0;*data = (recvData[2]<<16) + (recvData[3]<<8) + recvData[4];return 1;
}
//BL0942初始化
void BL09_Init(void)
{u32 writeData = 0;u32 readData = 0;OS_ERR err;writeData = 0x5a5a5a; //用户去寄存器复位,使用BL09_Write_Reg(R_SOFT_RESET, writeData); Bl09_Delay(250);Bl09_Delay(250);while(1){writeData = 0x55; //关闭写保护BL09_Write_Reg(R_USR_WRPROT, writeData);writeData = 0;if(BL09_Read_Reg(R_MODE, &readData)){writeData = (readData|(0x01<<6));BL09_Write_Reg(R_MODE, writeData);}if(BL09_Read_Reg(R_MODE, &readData)){if(readData == writeData)break;}OSTimeDly ((OS_TICK )100,(OS_OPT )OS_OPT_TIME_DLY,(OS_ERR *)&err); } writeData = 0xaa; //开启写保护BL09_Write_Reg(R_USR_WRPROT, writeData);
}//BLO942电表数据采集
//这里用的是CT1=1000的电流互感器
void BL09_Meter_Scan(void)
{float tampElec = 0; if(BL09_Read_Reg(R_V_RMS, ®Data))Meter_Rece_Voltage = regData*6.612/100000;if(BL09_Read_Reg(R_I_RMS, ®Data))Meter_Rece_Current = regData*1.206/1000000; if(BL09_Read_Reg(R_CF_CNT, ®Data)){tampElec = regData*5.947/100000; Meter_Rece_Elec += tampElec;}
}
使用BL0942 计量芯片获取计量数据相关推荐
- 免校准的电量计量芯片_万物互联,开启智慧计量新时代—2020年中国物联网计量创新发展论坛在济南举办...
10月22日,2020年中国物联网计量创新发展论坛在泉城济南举办.论坛以"万物互联,开启智慧计量新时代"为鲜明主题,共同探讨了物联网计量领域新技术.新成绩,提出了新方向.新前景.浙 ...
- 电能计量芯片应用心得之选型篇
电能计量芯片应用心得之选型篇 什么是计量芯片 计量芯片是测量交流电信号的一类芯片,因最早是使用于电表产品,所以在行业内也俗称电表芯片,它可以统计用电负载的用电量.测量用电负载的功率大小和电流大小,以及 ...
- 免校准的电量计量芯片_【应用】基于高精度免校准电能计量芯片CSE7761的漏电保护设计,可支持单芯片两路计量...
随着家电产业开始步入物联网时代,终端企业也开始借助更为智能的手段来保障电器的使用安全,如电器电能监测.过载检测.故障预警等等,使得电能计量芯片开始崭露头角.本文将介绍 漏电是由于电器外壳和市电火线间因 ...
- ESP8266+电能计量芯片
ESP8266+BL0937电能计量芯片 1. BL0937计量芯片的介绍 BL0937的应用电路图 BL0937的外围电路图 2. ESP8266与BL0937芯片的引脚连接 ESP引脚 BL093 ...
- 计量芯片应用心得之软件篇
本文内容是我从对电表芯片应用中,积累的一些经验,以便于工程师朋友可以对计量芯片有更多的了解,在应用过程中能够有一些帮助和收获.我们以HLW8110为例,讲一讲软件处理前需要知道的一些芯片原理,和在软件 ...
- 免校准的电量计量芯片_具有免校准和带漏电检测功能的计量芯片HLW8112
具有免校准和带漏电检测功能的计量芯片 HLW8112 未来几年,更多的家电产品将要步入智能化,而随着物联网的快速发展,基 于数字化.物联网和大数据的智能家电将是未来的趋势. 智能家电发展主要有三个阶段 ...
- stm32 + RN8209C单相计量芯片使用心得
RN8209C单相计量芯片使用心得 由于项目需求,最近使用了一下RN8209C单相电量计量芯片,用STM32读取外接用电器的有效功率.第一次接触肯定是看技术手册. RN8209C技术手册V1.5 单相 ...
- 关于钜泉光电ATT7053C计量芯片使用的若干经验
大家好!第一次写东西,完全是当作自己的一个笔记来写的,笔法不成熟,有些凌乱.如果对一些小伙伴有所帮助的话是我的荣幸,也欢迎各位小伙伴指出其中的问题. 首先说一下,使用这款芯片呢是因为一个项目需求,之前 ...
- 免校准的电量计量芯片_电量计量芯片HLW8110的前端电路设计与误差分析校正
电量计量芯片 HLW8110 的前端电路设计与误差分析校正 龙顺宇 ; 许禄枝 ; 邝国旺 ; 徐元哲 ; 吴路光 [期刊名称] <单片机与嵌入式系统应用> [年 ( 卷 ), 期] 20 ...
最新文章
- java中的注解(二)
- Windows sever 2008 动态硬盘数据恢复
- 模拟飞行 android,RFS模拟飞行pro安卓版
- iOS UI 开发按钮的使用
- (转)调用System.gc没有立即执行的解决方法
- Fixjs——显示交互基类InteractiveObject
- 如何枚举String类型的枚举?
- hashcat字典攻击
- oracle logon 乱码,鼎信诺审计软件2013-2014年度常见问题解答
- javascript连接数据库
- 一文图解自定义修改el-table样式
- 台式计算机 如何组装,台式电脑买回家怎么装_组装方法图文分析
- 嵌入式系统框架----软件篇
- 【路径规划】基于蚁群求解多旅行商MTSP问题matlab源码
- Cisco nat inside接口,outside接口,nvi接口的区别
- 研究区分onbeforeunload事件是刷新还是关闭
- DICOM-RT struct转换为nii.gz
- Win8初体验 内存/SSD硬盘性能挑Win7(一)
- 自定义IOS系统弹框
- FPGA功耗的那些事儿
热门文章
- 【QGIS入门实战精品教程】8.1:QGIS制作地图案例教程
- ubuntu16 环境配置
- 生产者消费模型-管程法
- 论文投稿指南——中文核心期刊推荐(力学)
- c语言一个小写字母字节,C语言:给定一个小写字母,转换成大写字母
- c#直接横向打印LocalReport
- 海思SD3403开发板
- Moderate Modular Mode
- Gradle教程和指南 - 构建审视
- java定义苹果类Apple_定义一个水果接口Fruit,里面定义一个表示吃水果的eat方法。定义一个苹果类Apple和一个橘子...