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

本文深入探讨STM32利用霍尔效应和CC6902电流传感器进行电流检测的原理,详细解析电流检测电路设计,并分享了数据处理的方法,包括如何通过ADC和DMA获取稳定的电流值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

前一部分介绍了如何配置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.067v/A,静态输出电压为VCC/2(V)。检测电流与输出电压的关系为:VOUT(V) = VCC (V)/ 2 + 0.067 × IP(A)。当检测的电流为20A时,VOUT为3.84V.通过运放前的两个1KΩ电阻和运放后1KΩ和10KΩ电阻分压,AD_CUR的电压为1.745V。

三、数据处理

在理想情况下,电流值不变,VOUT电压值就不变,但是电路中往往存在各种各样的干扰,使得单片机读到的电压值有波动。这时候我们要多采集几次数据,然后取平均数,这样数据就会更加稳定。
多ADC通道求平均值示例代码如下:

由于电流检测涉及到电路的设计安全性等问题,因此本回答仅提供基于STM32单片机ADC采样代码供参考。 首先需要确定电流检测电路设计,常见的电流检测电路包括电阻式电流检测霍尔效应电流检测。本回答以电阻式电流检测为例,电路设计如下: ![电路设计](https://i.ibb.co/F0dDfYn/circuit.png) 其中,R1为检测电阻,RL为负载电阻,VIN为待检测电流的输入电源。 接下来是基于STM32单片机ADC采样代码。 首先需要对ADC进行初始化,主要包括GPIO的初始化ADC的初始化。以STM32F103为例,代码如下: ```c void ADC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; // 使能ADC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置PA1为模拟输入引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); // ADC参数配置 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); // 使能ADC1 ADC_Cmd(ADC1, ENABLE); } ``` 然后是ADC采样函数的编写,主要包括ADC采样配置ADC采样数据读取。代码如下: ```c uint16_t ADC_Read(void) { ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5); // 采样通道配置 ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 开始采样 while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待采样完成 return ADC_GetConversionValue(ADC1); // 读取采样数据 } ``` 最后在主函数中调用ADC初始化函数ADC采样函数即可。代码如下: ```c int main(void) { ADC_Init(); while (1) { uint16_t ADC_value = ADC_Read(); float current = (float)ADC_value * 3.3 / 4096 / 0.1; // 计算电流值 // 处理电流值 } } ``` 需要注意的是,由于电阻式电流检测会引入电路的电阻损耗,因此需要根据具体的电路参数进行校准。同时,为了保证采样精度,还需要考虑ADC采样的参考电压等因素。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值