电流检测电路与数据处理:STM32 ADC和DMA应用的进阶指南(第二部分)

文章目录

  • 前言
  • 一、电流检测原理
  • 1.霍尔效应
  • 2.CC6902电流传感器
  • 二、电流检测电路
  • 三、数据处理

  • 前言

    前一部分介绍了如何配置ADC和DMA,这一部分介绍在硬件部分如何实现电流检测以及检测到电流后的数据处理。


    一、电流检测原理

    1.霍尔效应

    在半导体上外加与电流方向垂直的磁场,会使得半导体中的电子与空穴受到不同方向的洛伦兹力而在不同方向上聚集,在聚集起来的电子与空穴之间会产生电场,电场力与洛伦兹力产生平衡之后,不再聚集,此时电场将会使后来的电子和空穴受到电场力的作用而平衡掉磁场对其产生的洛伦兹力,使得后来的电子和空穴能顺利通过不会偏移,这个现象称为霍尔效应。而产生的内建电压称为霍尔电压。

    2.CC6902电流传感器

    CC6902 内部集成了一颗高精度,低噪声的线性霍尔电路和一根低阻抗的主电流导线。当采样电流流经主电流导线,其产生的磁场在霍尔电路上感应出相应的电信号,经过信号处理电路输出电压信号,使得产品更易于使用。线性霍尔电路包含了高灵敏度霍尔传感器,霍尔信号预放大器,高精度的霍尔温度补偿单元,振荡器,动态失调消除电路和放大器输出模块。在无磁场的情况下,静态输出为 50%VCC。

    名称 编号 功能
    IP+ 1、2 采样电流正端
    IP- 3、4 样电流负端
    GND 5
    OUT 6 信号输出端
    NC 7 未连接
    VCC 8 电源电压

    二、电流检测电路


    首先VCC接5V的电压供电,GND脚接地,要检测的电流通过IP+引脚流入电流传感器,从IP-引脚流出,电流大小转化为电压大小从OUT脚输出。经过电阻的分压进入运放,运放起到增强驱动能力以及滤波和隔离的作用,其他电容作用为滤除干扰。最后AD-CUR节点接入单片机GPIO引脚。
    这里选择的电流传感器型号为CC6902-30,检测电流的范围为-30~30A,灵敏度为0.067mv/A,静态输出电压为VCC/2(V)。检测电流与输出电压的关系为:VOUT(V) = VCC (V)/ 2 + 0.067 × IP(A)。当检测的电流为20A时,VOUT为3.84V.通过运放前的电阻分压,AD_CUR的电压为1.28V。

    三、数据处理

    在理想情况下,电流值不变,VOUT电压值就不变,但是电路中往往存在各种各样的干扰,使得单片机读到的电压值有波动。这时候我们要多采集几次数据,然后取平均数,这样数据就会更加稳定。
    多ADC通道求平均值示例代码如下:
    首先定义ADC_ConvertedValue二维数组变量,TIMES为采样次数,AD_CHANNEL 为通道数。
    然后在Get_Adc_Average函数中获得某一通道读取ADC值的平均数,Get_Adc_Average函数中变量ch为需要求平均数的通道,变量ADC_CHANNL为总通道数,变量ADCCon_Value为ch通道每一次读到的数值,ADC_Buf存放平均值。

    extern volatile uint16_t ADC_ConvertedValue[TIMES][AD_CHANNEL];
    void Get_Adc_Average(uint16_t *ADCCon_Value, uint8_t ADC_CHANNL, uint8_t ch, uint16_t *ADC_Buf)
    {
    	uint8_t  i, j;
    	uint8_t times;
    	uint16_t filter_temp;	
    	
    	uint16_t filter_buf[TIMES];
    
    	filter_sum = 0;
    	//排序
    	for (i = 0; i < TIMES; i++)
    	{	//这里获取某一通道每一次检测的ADC数值
    		filter_buf[i] = *(ADCCon_Value+i*ADC_CHANNL+ch);//这里获取某一通道每一次采样的ADC数值。相当于获取二维数组某一列全部的值。
    	}
    	
    	for (j = 0; j < TIMES - 1; j++)
    	{
    		for (i = 0; i < TIMES - 1 - j; i++)
    		{
    			if (filter_buf[i] > filter_buf[i + 1])
    			{
    				filter_temp = filter_buf[i];
    				filter_buf[i] = filter_buf[i + 1];
    				filter_buf[i + 1] = filter_temp;
    			}
    		}
    	}
    	//去掉最大和最小各两个值取平均数
    	for(times = 2; times < TIMES-2; times++)
    	{
    		filter_sum += filter_buf[times];
    	}
    	
    	ADC_Buf[ch] = filter_sum / (TIMES-4);
    }
    

    可以使用以下代码调用Get_Adc_Average函数

    for(ch1 = 0; ch1 < AD_CHANNEL; ch1++)
    	{
    		Get_Adc_Average((uint16_t *)ADC_ConvertedValue, AD_CHANNEL, ch1, ADC1_Ave_Val);
    	}
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » 电流检测电路与数据处理:STM32 ADC和DMA应用的进阶指南(第二部分)

    发表评论