基于STM32F103的ACS712电流传感器使用教程

本文介绍了如何使用STM32F103RCT6微控制器和ACS712霍尔电流传感器,配合电流互感器测量交流电流。通过配置STM32CubeMX和HAL库,实现ADC与TIM的DMA采集,从而实时监测电流变化。作者分享了电流互感器的正确使用方法,并展示了Python数据分析电流数据的流程。

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

首先介绍一下我使用的板子和外设,首先是正点原子的ministm32,mcu为stm32f103rct6,使用的电流传感器为acs712霍尔电流传感器。

然后想要测量电流数据你还得需要一个电流互感器,我因为需要测量的是大电流所以购买的是转化比比较低的版本。

然后说说电流互感器的使用方法,一开始我直接将整根电线穿进去,发现没有电流的变化,后来经过老师指导发现你需要将插座导线的保护壳拆开,单独测量火线的值

如图所示,我购买的是10/5A,穿心3匝(如果1匝则直接将火线穿过即可),所以需要多绕两圈(棕色的是火线),然后将电流互感器上的导线接到霍尔电流传感器上(接哪一头影响不大,可所以接)。

然后讲讲霍尔电流测量电流的方法,理论上就是通过测量电流值,输出电压值,然后我们可以根据adc读取到的电压值结合原理图来反推电流值。如图所示(不同量程的图不同,根据自己购买的型号进行换算),举个例子,如果adc读取到3v电压,那么测量到的电流值大约为5A:

 说完原理我们再来通过stm32cubemx来生成相关代码,这里我直接转载西瓜大大的文章,根据他的教程来即可生成代码

STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx_四臂西瓜的博客-CSDN博客_基于stm32的交流信号采集程序

在tim3的设置教程中根据自己需要的采样率进行修改,比如我需要的是10Khz,则将其修改为7200-1

这里只贴上需要修改的代码:分别在main.c的51和107行

uint16_t adc_buff[1000];//存放ADC采集的数据
	HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_buff, 1000); //让ADC1去采集1000个数,存放到adc_buff数组里
	while (!AdcConvEnd)	;	//等待转换完毕
	for (uint16_t i = 0; i < 1000; i++)
	{
		  //printf("\r\n电流数据为:\r\n");		  
			printf("\r%.5f %.3f\r\n",i*0.00001,adc_buff[i] * 3.3 / 4095*5 - 2.480*5); //数据打印,查看结果
	}

则打印出来的0电流(即排插没有接其他电器)时数据如下,左边是时间,单位为s,右边为电流数据,单位为A,记得将波特率设置为115200,否则会乱码。

 然后通过Python打印

import matplotlib.pyplot as plt
import numpy as np

data = np.loadtxt('computer.txt')

plt.plot(data[:,0],data[:,1])
plt.xlabel("Time(s)")
plt.ylabel("Current(A)")
plt.show()

图片如下

该图为笔记本电脑充电时的数据。

测试完毕。

ACS712是一款基于霍尔效应的电流传感器模块,它可以用于测量交流和直流电流。将其与STM32微控制器结合使用时,通常需要通过ADC(模数转换器)读取来自ACS712的模拟电压信号,并将该信号转化为实际的电流值。 以下是简单的步骤说明以及示例代码框架: ### 步骤 1. **硬件连接** 将ACS712模块的VCC、GND分别接到电源上,OUT引脚连接到STM32的一个可用ADC通道(例如PA0)。确保供电电压匹配。 2. **初始化GPIO及ADC** - 配置STM32的GPIO作为输入模式。 - 初始化ADC外设以准备采样数据。 3. **采集并处理数据** 使用ADC对从ACS712传来的模拟量进行数字化采样。然后根据公式计算出对应的电流大小: \[ I = (V_{out} - V_0) / m \] 其中 \(I\) 是目标电流;\(V_{out}\) 表示当前输出电压;\(V_0\) 可理解为空载状态下的偏移电压(一般约等于一半工作电压如2.5V),而斜率因子m则依据所选型号(比如±5A版为185mv/A)确定下来。 4. 示例伪代码结构 ```c #include "stm32fxxx.h" // 根据具体的芯片型号包含相应的头文件 void ADC_Init(void); uint16_t Read_ADC_Value(void); int main(){ uint16_t adcValue; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO , ENABLE); // 开启GPIO时钟 GPIO_InitTypeDef GPIO_InitStructure; GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;// PA0 连接 ACS712 OUT端口 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//设置为模拟输入 GPIO_Init(GPIOA,&GPIO_InitStructure); ADC_Init(); while(1){ adcValue=Read_ADC_Value(); float voltage=(float)(adcValue*3.3)/4096;//假设系统运行于3.3v参考电压下并且分辨率为12bit if(voltage>2.6 && voltage<2.4){continue;}else{ float current=(voltage-2.5)*scale_factor;// scale_factor取决于具体版本,需查阅资料得到确切数值 printf("Current=%f A\n",current); } } } /*函数声明*/ void ADC_Init(void) { ...... } ``` 请注意上述仅为简化示意程序,真实项目还需考虑更多细节包括但不限于校准偏差补偿等。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值