stm32_acs712电流采集计算思路

本文介绍了如何使用ACS712传感器进行电流测量,包括测量参数、调试步骤、ADC精度校准以及不同灵敏度下的电流计算公式。强调了分压电阻对精度的影响及可能的修正方法。

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

Acs712数据手册地址 :https://item.szlcsc.com/45473.html

需要测量的参数

0 实际电流值 : ACS712_A

1  acs712供电电压 : Vin   

2  ACS 输出电压 : 712_OUT_V

3  ACS 输出电压, 经过分压电阻后送到ADC引脚的电压 : R_OUT_V

4 单片机12位ADC读出的原始值 :adc_data

5 分压低端电阻: R1  (10k ) 高端电阻 :R2   (5.1k)

6 acs712 中点电压 = 供电vin*0.5      例 :5*0.5=2.5v

7 分压比  712_OUT_V/R_OUT_V = (R1+R2)/R1   

思路: 1 进调试查看获得adc_data

1  adc_data/4095*3.3= 采集的ADC引脚电压    用万用表测量应该等于 R_OUT_V 电压如不相等需进行比例修正. (ADC采集的准确度有偏差或基准电压3.3v有问题),一般调整公式的3.3v 基准电压值使计算的数和测量的数相等.

2  (采集的ADC端口电压/R1)*(R1+R2)=ACS 输出电压   用万用表测量应该等于 712_OUT_V电压如不相等需进行比例修正.(电阻精度不够,带来的分压偏差),一般调整公式的分压电阻值(实际测量一下电阻值)使计算的数和测量的数相等.

3  05B 灵敏度 185mv/A  :

(ACS 输出电压 -acs712 中点电压)/0.185= 实际电流值

   20A 灵敏度 100mv/A  :

 (ACS 输出电压 -acs712 中点电压)/0.1  = 实际电流值

20A :融合后公式 ACS712_A =(((adc_data/4095*3.3)/R1)*(R1+R2)-acs712 中点电压)/0.1

05B :融合后公式 ACS712_A =(((adc_data/4095*3.3)/R1)*(R1+R2)-acs712 中点电压)/0.185

续:如果想继续提高精度,还可以根据温度系数来修正检测灵敏度

### ACS712 电流传感器与 STM32F103 的配置及代码示例 为了实现 ACS712 电流传感器与 STM32F103 微控制器的配合工作,需要完成以下几个方面的设置:GPIO 初始化、ADC 配置以及数据采集处理。 #### GPIO 和 ADC 配置 STM32F103 的 GPIO 可以被配置为模拟输入模式以便接收来自 ACS712 的信号。具体来说: - 将 ACS712 的输出引脚连接到 STM32 的某个 ADC 输入通道对应的引脚上。 - 使用 HAL 库或其他库函数初始化相应的 GPIO 引脚为模拟输入模式[^2]。 以下是具体的 GPIO 和 ADC 配置过程: ```c #include "stm32f1xx_hal.h" // 定义使用的 ADC 和 GPIO 引脚 #define CURRENT_SENSOR_PIN GPIO_PIN_0 #define CURRENT_SENSOR_GPIO_PORT GPIOA #define ADC_CHANNEL ADC_CHANNEL_0 void MX_ADC_Init(void) { ADC_HandleTypeDef hadc; __HAL_RCC_ADC1_CLK_ENABLE(); // 启用 ADC1 时钟 hadc.Instance = ADC1; // 设置 ADC 实例 hadc.Init.ScanConvMode = DISABLE; // 单次转换模式 hadc.Init.ContinuousConvMode = ENABLE; // 连续转换模式 hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; // 软件触发 hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐 hadc.Init.NbrOfConversion = 1; // 转换次数 if (HAL_ADC_Init(&hadc) != HAL_OK) { // 初始化 ADC Error_Handler(); } ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = ADC_CHANNEL; // 设置 ADC 通道 sConfig.Rank = 1; // 排序优先级 sConfig.SamplingTime = ADC_SAMPLETIME_144CYCLES; // 采样时间 if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { // 配置 ADC 通道 Error_Handler(); } } void MX_GPIO_Init(void) { GPIO_InitTypeDef gpio_init_structure; __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 GPIOA 时钟 gpio_init_structure.Pin = CURRENT_SENSOR_PIN; // 设置引脚 gpio_init_structure.Mode = GPIO_MODE_ANALOG; // 模拟输入模式 gpio_init_structure.Pull = GPIO_NOPULL; // 不使用上下拉电阻 HAL_GPIO_Init(CURRENT_SENSOR_GPIO_PORT, &gpio_init_structure); // 初始化 GPIO } ``` 上述代码完成了 GPIO 和 ADC 的基本初始化操作。其中 `MX_ADC_Init` 函数负责配置 ADC 参数,而 `MX_GPIO_Init` 则将指定的 GPIO 引脚配置为模拟输入模式。 #### 数据采集与处理 通过 ADC 获取的数据通常是一个数值范围内的整数(例如 0 至 4095 对应于 0V 至 3.3V)。这些原始数据可以通过简单的线性变换转化为实际的电流值。假设 ACS712 输出电压与电流的关系已知,则可以编写如下代码进行计算: ```c uint16_t adc_value; float current_mA; adc_value = HAL_ADC_GetValue(&hadc); // 读取 ADC 值 current_mA = ((float)(adc_value * 3.3 / 4095)) * 1000 - 2500; // 计算当前电流 mA ``` 这里的关键在于理解 ACS712 的输出特性并将其映射至实际物理量。对于不同版本的 ACS712(如 5A 或 20A),其灵敏度可能有所不同,因此需查阅产品手册获取精确参数[^1]。 #### 注意事项 在设计电路时需要注意以下几点: - 确保供电电压满足 ACS712STM32 的需求。 - 如果负载电流较大,建议增加散热措施以防损坏器件。 - 测试阶段可通过调整负载观察测量结果是否合理验证系统功能正常与否。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值