STM32电流互感器数据采集与处理详解

1. 电流互感器简介
在发电、变电、输电、配电和用电的线路中电流大小悬殊,从几安到几万安都有。为便于测量、保护和控制需要转换为比较统一的电流,另外线路上的电压一般都比较高如直接测量是非常危险的。电流互感器就起到电流变换和电气隔离作用。

2. 电流互感器模块
电流互感器模块可以将交流电信号转换为电压信号,此时就能用stm32的ADC采集模块输出的AD信号。

(1)模块介绍
模块搭载ZMCT103c系列小型高精度电流互感器以及高精度运放电路,对信号做精确采样和适当补偿等功能。方便对5A以内的交流电进行信号采集。对应输出模拟交流信号可以调节,可根据电位器(调节放大比例,放大范围0-100倍)来调节所需输出电压,但是输出端(OUT)的最大电压不会超出1/2vCCo

(2)引脚说明

3. STM32采集电流互感器模块数据

此处需要注意的问题是在用STM32采集时如果无交流电通过线圈,STM32的AD接到OUT引脚相当于悬空状态,此时会AD会返回一个STM32悬空的AD值,所以在实际使用时需要在OUT和GND之间加一个下拉电阻:

ADC配置代码如下:

 #include "adc.h"
 #include "delay.h"
															   
void  Adc_Init(void)
{ 	
	ADC_InitTypeDef ADC_InitStructure; 
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );	 
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);  
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		
	GPIO_Init(GPIOA, &GPIO_InitStructure);
                      
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		
	GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;	
	GPIO_Init(GPIOA, &GPIO_InitStructure);	

	ADC_DeInit(ADC1); 

	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;	
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;	
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	
	ADC_InitStructure.ADC_NbrOfChannel = 1;	
	ADC_Init(ADC1, &ADC_InitStructure);	 
	ADC_Cmd(ADC1, ENABLE);	
	
	ADC_ResetCalibration(ADC1);	
	 
	while(ADC_GetResetCalibrationStatus(ADC1));	
	
	ADC_StartCalibration(ADC1);	 
 
	while(ADC_GetCalibrationStatus(ADC1));	 	

}				  

u16 Get_Adc(u8 ch)   
{
  
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );				    
  
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		
	 
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));

	return ADC_GetConversionValue(ADC1);	
}

u16 Get_Adc_Average(u8 ch,u8 times)
{
	u32 temp_val=0;
	u8 t;
	for(t=0;t<times;t++)
	{
		temp_val+=Get_Adc(ch);
		delay_ms(5);
	}
	return temp_val/times;
} 	 

主函数采集通过串口发送数据到上位机:

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"	  
#include "adc.h"
#include "common.h"
#include "usart2.h"
#include "usart3.h"
#include <string.h>
 
u8 mp3_set1[7]={0xAA,0x07,0x02,0x00,0x06,0xB9};
u8 mp3_set2[7]={0xAA,0x07,0x02,0x00,0x05,0xB8};
 
 int main(void)
 {	 
    u16 adcx;
	u8 re = 0;
	 
	delay_init();	      
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	Adc_Init();	//ADC初始化	  		
	usart2_init(9600);//串口2初始化
	delay_ms(200);
 
	while(1)
	{
			adcx=Get_Adc_Average(ADC_Channel_0,10);//ADC通道0采集电流互感器的输出值
			u2_printf("%d\r\n",adcx);//通过串口发送出去			
	}
}

实物图如下,用电风扇线作为测试,串口观察输出:

在风扇断电状态下输出为0:

在电风扇开启状态下便可采集到电流互感器模块的输出:

代码工程链接:https://pan.baidu.com/s/1Pdcm7M7UqIl-YyeDvcFCSA
提取码:nigw

物联沃分享整理
物联沃-IOTWORD物联网 » STM32电流互感器数据采集与处理详解

发表评论