使用BL0942 计量芯片获取计量数据

这篇具有很好参考价值的文章主要介绍了使用BL0942 计量芯片获取计量数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

BL0942 是一颗内置时钟免校准电能计量芯片。
BL0942 能够测量电流、电压有效值、有功功率、有功电能量等参数。

主要特点

  1. 两路独立的 Sigma-Delta ADC,一路电流和一路电压
  2. 电流有效值范围(10mA~30A)@1mohm
  3. 有功电能(1w~6600w)@1mohm@220V
  4. 可输出电流、电压有效值,快速电流有效值,有功功率
  5. 批次出厂增益误差小于 1%,外围元件满足一定条件下可以免校准
  6. SPI(最快速率支持 900KHz)/UART(4800-38400bps)通信方式(TSSOP14L 封装支持最多 4 片级联
    Uart 通信)
  7. 电源掉电监测,低于 2.7V 时,芯片进入复位状态
  8. 内置 1.218V 参考电压源
  9. 芯片单工作电源 3.3V,低功耗 10mW(典型值)

系统框图

使用BL0942 计量芯片获取计量数据,单片机,物联网,嵌入式硬件

封装与管脚描述

使用BL0942 计量芯片获取计量数据,单片机,物联网,嵌入式硬件
使用BL0942 计量芯片获取计量数据,单片机,物联网,嵌入式硬件

大致寄存器说明

使用BL0942 计量芯片获取计量数据,单片机,物联网,嵌入式硬件
使用BL0942 计量芯片获取计量数据,单片机,物联网,嵌入式硬件

硬件实现和计量数据转换公式

使用BL0942 计量芯片获取计量数据,单片机,物联网,嵌入式硬件

使用BL0942 计量芯片获取计量数据,单片机,物联网,嵌入式硬件

通讯接口-SPI

  1. 工作在从模式
  2. 半双工通讯,通讯率可配,最大通讯速率 900Khz
  3. 固定一种时钟极性/相位(CPOL=0,CPHA=1)
  4. 帧结构:
    在通信模式下,先发送 8bit 识别字节(0x58) 或(0xA8),(0x58)是读操作识别字节,(0xA8)是写操作
    识别字节,然后再发送寄存器地址字节,决定访问寄存器的地址(请参见 BL0942 寄存器列表)。
    下图分别示出读出和写入操作的数据传送顺序。一帧数据传送完成,BL0942 重新进入通信模式。每次读/写操作所需的 SCLK 的脉冲个数均为 48 位。
    使用BL0942 计量芯片获取计量数据,单片机,物联网,嵌入式硬件

代码实现

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.文章来源地址https://www.toymoban.com/news/detail-529947.html

#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];
	
	//拉高CS
	HAL_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;			//寄存器地址
	
	//拉高CS
	HAL_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, &regData))
		Meter_Rece_Voltage = regData*6.612/100000;
	if(BL09_Read_Reg(R_I_RMS, &regData))
		Meter_Rece_Current = regData*1.206/1000000;			
	if(BL09_Read_Reg(R_CF_CNT, &regData))
	{
		tampElec = regData*5.947/100000;					
		Meter_Rece_Elec += tampElec;
	}	
}

到了这里,关于使用BL0942 计量芯片获取计量数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【单片机】使用AD2S1210旋变芯片读取RVDT角位移及速度

      最近在做单片机的子项目,经过近半个月的安装调试,第一阶段顺利完成了。只能说第一次做这种小工程确实缺乏经验,跟书本上学的还是有些出入。做下记录,方便后面来查看。   基于STM32单片机,使用AD2S1210旋变芯片读取RVDT变压器电压。    RVDT :旋转可变差分变

    2024年04月14日
    浏览(21)
  • 国民技术 MCU N32单片机所有系列---JLink添加芯片,方便使用Keil和JFlash

    1.将下图JLink tool adds Nations chip V1.0.12文件中选中的文件复制到自己电脑的JLINK的目录下(JLINK默认的下载路径是C:Program FilesSEGGERJLink   或者  C:Program Files(x86)SEGGERJLink) 2.然后直接把JLink tool adds Nations chip V1.0.12文件中的JLinkDevices.xml复制替换到自己电脑的JLINK的目录下的JLin

    2024年02月03日
    浏览(48)
  • 【74HC595】51单片机(普中A2开发板)LED点阵屏点亮以及74HC595芯片的使用笔记

    纯小白写的文章,如有问题,欢迎评论区讨论,反驳,指正。 如果你只想了解74HC595如何使用,建议只看2.3。 通过查看普中A2开发板的原理图(图1)可以知道,通过P0(P0_0、P0_1…P0_7)口和DPa、DPb…DPh来控制哪一颗LED点亮。我这个开发板上的点阵模块没有按照他给的原理图上

    2024年02月05日
    浏览(75)
  • 单片机GD32F303RCT6 (Macos环境)开发 (二十)—— 光感芯片veml7700的使用

    1、veml有7个寄存器,每个十六位,见图。 00是config寄存器, 01 02 是中断设置的阈值 03是节能模式的设置 04 是得到的光的亮度值 05是得到的data of whole WHITE 06是中断设置值。 2、我们只测试得到光的亮度值,所以veml寄存器设置如下: 设置gain,integration time ,power save mode ,interrup

    2024年02月04日
    浏览(62)
  • 单片机-芯片怎么看图连接

    单片机连接数码管 硬件连接线路图 单片机中的IO口连接端子 J25  ,J25 连接 2个电阻 PR14 ,引出管脚 P22 ,P23,P24 P22 、P23、P24  连接 3-8 译码器  三输入、8输出  8 输出 ,连接8个LED1~LED8 用到三个芯片: 单片机芯片:STC89C52 3-8 译码器 ---D 74HC138 双 P 沟道增强型 MOS 管---D74HC24

    2024年02月11日
    浏览(39)
  • 智融SW3526多协议芯片单片机驱动

    目录 1、芯片概念      2、SW3526配置ADC寄存器 3、SW3526获取ADC数据 4、IIC底层驱动代码  5、SW3526写指令时序图 6、单片机IIC写指令代码  7、SW3526读数据时序图  8、单片机IIC读数据代码 9、SW3526资料(52和32的程序) 10、SW3526产品模型         SW3526 是一款高集成度的多快充协

    2024年02月02日
    浏览(40)
  • 交流220v转12v给单片机供电芯片

    客户的应用需求:AD220V转DC12V 体积要非常小,单片机使用,单片机设备12V 电流很小不会超过100mA? 【AD220V转DC12V体积小的问题】 问题:我需要将交流电(220V)转换为直流电(12V),并且需要一个非常小的体积。同时,我需要根据输出电流的不同,选择不同型号的单片机。 解

    2024年02月12日
    浏览(35)
  • 成功解决keil识别不到单片机芯片,下载不了程序

    我的芯片是STM32F429,正点原子的阿波罗。 今天使用开发板做实验,突然找不到芯片了, 以前下载的PWM波也运行不了 。查找了好久,原来是芯片锁了,终于解决了。 我是第二种办法实现给芯片解锁的,第一种是我猜测的。 解决办法: 第一种: 先给驱动板上电,boot0接到3.3

    2024年02月15日
    浏览(32)
  • 【单片机】74系列芯片引脚图资料大全

    反相器 驱动器   LS04 LS05 LS06 LS07 LS125 LS240 LS244 LS245 与门 与非门   LS00 LS08 LS10 LS11 LS20 LS21 LS27 LS30 LS38 或门 或非门 与或非门   LS02 LS32 LS51 LS64 LS65 异或门 比较器   LS86 译码器   LS138 LS139 寄存器   LS74 LS175 LS373 反相器:           Vcc  6A  6Y  5A  5Y  4A  4Y    六非

    2024年04月27日
    浏览(35)
  • keil中添加stc单片机芯片包的方法

            以前在编程STC89C52单片机的时候,选择芯片包的时候都是选择的atmel公司的AT89C51,因为他们不管在程序上还是在硬件上都是兼容的。博主最近打开一个工程代码,它是用STC89C52芯片作为工程的目标芯片,我在打开代码的时候就出现如下提示:         它提示我,没有

    2024年02月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包