关于串口通信读取BL0942芯片电压电流的使用

概述:

  通过串口通信来获取BL0942芯片采集到的电压电流,采用的芯片为10引脚类型,电压采样为电阻采样,电流采样为互感器采样。

芯片功能特点:

  1. 两路独立的Sigma-Delta ADC,一路电流和一路电压。

  2. 电流有效值范围(10mA~35A)@1mohm  有功电能(1w~7700w)@1mohm

  3. 可测量电流电压有效值,快速电流有效值,有功功率,电流电压波形

  4. 批次出厂增益误差小于1%,外围元件满足一定条件下可以免校准

  5. 电流通道具备过流监控功能,监控阈值及响应时间可设置

  6. 电压/电流过零信号输出  内置波形寄存器,可输出波形数据用于负载类型分析

  7. 集成SPI(最快速率支持900KHz)/UART(4800-38400bps)通信方式

  8. 电源掉电监测,低于2.7V时,芯片进入复位状态

  9. 内置1.218V参考电压源  内置振荡电路,时钟约4MHz

  10. 芯片单工作电源3.3V,低功耗10mW(典型值)

 封装与管脚描述:

  采用的10引脚封装芯片

寄存器说明:

通过串口向BL0942发送指令,根据寄存器地址我们可以读取到相应数据。

 

特殊寄存器说明: 

电压采样电路及说明:

 电压采样使用的方法为电阻采样,由芯片管脚描述中所说VP为电压信号输入端,可以看到图中电压通道通过R2(390K*5)+R1(0.51K)电阻分压把交流220V电压降到mV级信号给VP管脚;根据提供的公式:

V = \frac{V_eff * V_ref * (R1 + R2)}{ 73989 * R1 * 1000}

其中,V_eff 表示电压有效值,V_ref 表示典型值1.218V。

我们就可以算出实际的电压值,不同个体芯片会有些许误差,可以通过自定义系数来校正。

下图为芯片应用指南的电阻电路图:

电流采样电路及说明: 

  电流采样使用的方法为电流互感器采样,由芯片管脚描述中所说IP,IN为电流模拟输入端;我们只需看图中IP1,IN1引脚。假设电流互感器CT1的变比为Rt=2000(2000:1),负载电阻R5(3.3欧),根据提供的公式:

I=\frac{I_eff*V_ref}{305978*(R5*1000)/Rt}

其中,I_eff 表示电流有效值,V_ref 表示典型值1.218V。

我们就可以算出实际电流值。

 下图为芯片应用指南的互感电路图:

串口通信说明: 

  该芯片有两种通信方式,SPI和串口通信,我使用的是串口通信方式。

  波特率配置:4800bps和9600bps通过硬件连接选择,19200bps和38400bps通过发送指令选择,我在这直接使用的4800bps。下图为波特率配置:

注意A2,A1为器件地址,即每个串口可以同时与4个芯片通信,默认为00,下图为写入时序:

读取时序:

 

获取电压,电流数据方式: 

  直接发送读取电压电流寄存器的指令,芯片会直接返回相应的原始值,我使用的另一种方法,通过发送读取全包指令,芯片会返回一系列数据,其中包括电压电流,并且数据有包头HEAD,方便代码逻辑编写。下图为全包数据格式:

代码实现: 

1.发送命令实现

//发送命令
uint32_t BL0942_ReadRegister1(uint8_t reg_addr) {
    uint8_t cmd = 0x58;
    uint8_t addr = reg_addr;
   
    //uint8_t checksum = ~((cmd + addr) & 0xFF);
    
    // 使用固定大小的数组
    uint8_t send_data[2];

    // 手动填充数组
    send_data[0] = cmd;
    send_data[1] = addr;
  

    // 发送读命令
    UartWrite1(send_data, sizeof(send_data));

}
void UartWrite1(unsigned char *data,int length)//串口1写数据   数据指针  数据长度
{
	unsigned int i=0;
	USART_ClearFlag(USART1,USART_FLAG_TC);
	for(i=0;i<length;i++)
	{
		USART_SendData(USART1,*(data++));
		while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
		{
			 __NOP(); 
		}
	}
    USART_ClearFlag(USART1,USART_FLAG_TC);
    
}

2.接收数据及处理 

void Date_Count1(u8 buf)//在串口中断中不断接收信息
{
    if(buf==0x55)//判断包头,确认无误继续接收
    {
        USART_rBuffer1[0] = buf;
		USART_RXD_Counter = 1;
    }
    else if((USART_RXD_Counter > 0) && (USART_RXD_Counter < 23))//接收全包数据
    {
        USART_rBuffer1[USART_RXD_Counter++] = buf;
    }
    else USART_RXD_Counter=0;
    if(USART_RXD_Counter==23)//和校验
    {
        int i;
        uint32_t v_rms_raw;
        uint32_t a_rms_raw;
        uint32_t p_rms_raw;
        uint8_t checksum;
        checksum=0x58;
        for ( i = 0; i < 22; i++) 
        {
            checksum += USART_rBuffer1[i];
        }
        checksum= checksum  & 0xFF;
        checksum= ~checksum;
        if(checksum==USART_rBuffer1[22])//和校验无误,数据处理
        {
            v_rms_raw= (USART_rBuffer1[6] << 16) | (USART_rBuffer1[5] << 8) | USART_rBuffer1[4]; 
            voltage_AC_IN = (v_rms_raw * 1.218*3.824) / 73989;//3.824=(R1+R2)/R1*1000
            a_rms_raw= (USART_rBuffer1[3] << 16) | (USART_rBuffer1[2] << 8) | USART_rBuffer1[1]; 
            current_OUT1 =  (a_rms_raw * 1.218) / 305978;
            current_OUT1 = current_OUT1/1.65;//1.65=(R5*1000)/Rt
            
        }
    }
    
}

3.主函数

int main(void)
 {	
    uint32_t current_rms ;    
    SystemInit();//系统初始化 
    SysTick_Init();
	SysTick_Config(36000);
	initio();
	initdat();
	uart1_init1(4800); 
    BL0942_Init();
    while(1)
	{   

        Date_Read++;
        if(Date_Read>1000)
        {
           BL0942_ReadRegister1(0xAA);
           del(600);
           printf("电压:%0.1f",voltage_AC_IN);
           printf("电流:%0.1f",current_OUT);
           Date_Read=0;
        }
	}	 
}

<think>好的,用户想了解电流互感器采样电路的设计原理和应用。首先,我需要回忆电流互感器(CT)的基本工作原理。CT主要用于交流电流的测量,通过电磁感应将一次侧的大电流转换为二次侧的小电流,通常二次侧电流较小,比如5A或1A,以便于测量和处理。 接下来,设计电流互感器采样电路的关键步骤包括信号转换、调理和采样。用户提到的引用资料中,特别是引用[2]和引用[3],提到了几种常用的电路设计方法,比如采样电阻转换、单电源运放处理交流信号以及精密整流电路。需要结合这些信息来组织回答。 首先,信号转换部分,CT输出的交流电流需要通过采样电阻转换为电压信号。根据欧姆定律,电压等于电流乘以电阻,所以选择合适的采样电阻值很重要,既要考虑功耗,也要考虑输出电压的范围。 然后是信号调理。因为CT输出的是交流信号,而很多AD转换器是单极性的,不能直接处理负电压。这里需要用到运放电路,可能采用单电源运放搭建的交流耦合电路,或者精密整流将交流转为直流。引用[3]提到的虚短和虚断概念在运放电路设计中很关键,需要计算放大倍数,确保信号在AD的输入范围内。 还要考虑抗干扰和滤波。CT容易受到高频噪声的影响,加入RC低通滤波可以滤除高频噪声,提高采样精度。此外,保护电路如TVS二极管可以防止过电压损坏后续电路。 应用方面,引用[1]提到的高压短路保护、电机控制等场景,需要强调CT采样在隔离和高电压环境下的优势。同时,引用[2]中提到的双电源运放和单电源解决方案需要对比说明,帮助用户理解不同设计的适用情况。 用户可能还关心如何选择元件参数,比如采样电阻、运放型号、滤波电容和电阻的计算方法。需要给出具体的例子,比如采样电阻为10Ω,放大倍数计算等,让设计更具体。 最后,要确保回答结构清晰,分点说明设计原理、关键步骤和应用场景,并自然地插入引用标记。同时,生成的相关问题要围绕用户可能进一步想了解的内容,比如电路参数计算、常见问题解决方案、与霍尔传感器的比较等。</think>### 电流互感器采样电路设计原理及应用 #### 一、设计原理 1. **信号转换与隔离** 电流互感器(CT)通过电磁感应原理,将一次侧大电流按比例转换为二次侧小电流(如$5\text{A}$或$1\text{A}$)。二次侧电流通过采样电阻$R_s$转换为电压信号$V_s = I_s \cdot R_s$,实现电流-电压转换[^2]。 2. **信号调理需求** - CT输出为交流信号,需适配单极性模数转换器(ADC)。 - 常见方法包括: - **单电源运放电路**:采用交流耦合(隔直电容)与偏置电压,将交流信号抬升至正电压范围[^3]。 - **精密整流电路**:将交流信号转换为直流信号,便于ADC直接采样[^2]。 3. **放大与滤波** - 使用运算放大器(如单电源运放)放大信号至ADC输入范围(如$0-3.3\text{V}$)。 - 通过RC低通滤波器抑制高频噪声,计算公式为$f_c = \frac{1}{2\pi R C}$[^3]。 4. **保护电路** 加入TVS二极管或稳压管,防止过压损坏ADC输入端口[^1]。 --- #### 二、典型电路设计示例 1. **单电源运放调理电路** ```plaintext CT输出 → 采样电阻Rs → 隔直电容C1 → 运放同相端(叠加偏置电压Vref) → 放大输出 → ADC ``` 放大倍数由反馈电阻$R_f$和输入电阻$R_{in}$决定:$$A_v = 1 + \frac{R_f}{R_{in}}$$[^3]。 2. **精密全波整流电路** ```plaintext CT输出 → 采样电阻Rs → 精密整流桥 → 滤波电容 → ADC ``` 整流后信号为全波直流,可直接输入单极性ADC[^2]。 --- #### 三、应用场景 1. **高压系统监测** 用于电网短路保护、电机控制等场景,实现非接触式电流测量[^1]。 2. **能源管理** 在电池管理系统(BMS)中监测充放电电流,或光伏逆变器中实现功率计算[^1]。 3. **工业自动化** 对交流电机、变频器等设备的电流进行实时采样与控制[^2]。 --- #### 四、设计注意事项 1. **采样电阻选择** $R_s$需平衡功耗与信号幅度,例如$10\Omega$电阻在$1\text{A}$时产生$10\text{mW}$功耗。 2. **运放选型** 优先选择低失调电压、高共模抑制比(CMRR)的运放(如AD8605)。 3. **抗干扰设计** 采用屏蔽线缆并远离高频干扰源,必要时加入共模扼流圈。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值