当前位置: 首页 > news >正文

MicroPython使用ESP32和acs712模块测量电流

我们在做物联网应用时,电流检测是监控设备能耗、优化电源管理的重要手段,本文介绍如何利用MicroPython开发ESP32与ACS712霍尔电流传感器模块,实现高精度电流测量,并提供硬件连接、代码实现及校准方法,适用于智能家居、工业自动化等场景。

ACS712模块特性

  • 低噪声模拟信号路径,确保信号传输过程中的高信噪比。
  • 通过新增FILTER引脚设置器件带宽,可灵活调节滤波范围以适应不同应用场景。
  • 阶跃输入电流下输出上升时间为5微秒,可快速响应电流变化。
  • 具有80kHz带宽,支持高频电流检测。
  • 在环境温度为25°C时总输出误差仅为1.5%,常温下测量精度高。
  • 小尺寸、薄型SOIC8封装,节省电路板空间,适合紧凑设计。
  • 内阻低至1.2 mΩ,可减少电流测量时的额外功耗。
  • 引脚1-4与引脚5-8之间的最小隔离电压为2.1 kVRMS(千伏有效值,隔离电压单位),电气隔离安全性高。
  • 5.0 V单电源供电,大大简化系统电源设计。
  • 输出灵敏度66至185 mV/A(依型号而定),适配不同量程(±5A/±20A/±30A)。
  • 输出电压与交流或直流电流成比例,可兼容交/直流测量。
  • 出厂校准确保高精度,无需用户额外校准。
  • 极稳定的输出偏移电压,降低温度漂移影响。
  • 近乎零磁滞,可提升重复测量一致性。
  • 输出与电源电压比率相关,电压波动时仍保持比例关系,减少供电不稳定的干扰。

ACS712的典型应用

下图是ACS712的典型应用原理图,ACS712输出模拟信号VOUT(输出电压),该信号与检测范围内的单向或双向交流/直流主电流IP呈线性变化。推荐使用CF(滤波电容)进行噪声管理,其容值需根据具体应用场景选择。

典型应用

管脚说明

编号名称描述
1、2IP+被测电流输入正极端子,内置保险丝
3、4IP-被测电流输入负极端子,内置保险丝
5GND信号地端子(参考电平基准)
6FILTER连接外部电容以设置器件带宽的引脚(电容值决定滤波频率)
7VIOUT模拟信号输出引脚,输出电压与电流值成比例(范围:0~VCC)
8VCC模块电源正极输入端子(典型值5V)

ACS712的量程

ACS712根据电流的量程不同有三种不同的芯片,分别是5A、10A和30A的芯片。以5A为例,测量时当电流为0时,输出端电压为2.5V,根据被测电流的方向不同,输出端的电压会大于或小于2.5V,当测量直流电流时,可以通过电压值来判断电流的方向,如果不考虑电流方向,可以取测量值与2.5V差值的绝对值。需要注意的是,输入电压对测量结果会产生明显的影响,在使用时应该尽量保持输入电压的稳定,并且根据输入电压的不同来校准一下零点电压。

ACS712模组

这是万能的某宝能买到的最常见的ACS712电流测量模组,分为5A、10A、30A的量程,不同的量程芯片不一样。
ACS712模组

这个模组电路非常简单,下面是它的原理图:
模组原理图
电路中有一个电源指示led,有两个滤波电容,测量信号直接从7脚接出,使用时需要注意输出管脚电压与输入电路电压的匹问题。

ESP32使用ACS712模块

ESP32的ADC允许的输入电压范围为03.3v,超过此范围可能会导致芯片损坏,而ACS712的额定工作电压是5V,理论上的输出电压为05V,会超过ESP32的允许电压,因此,需要使用分压电路对输出电压进行衰减,如下图所示,这是ACS712手册中推荐的一个针对3.3V的AD转换器的电路。

3.3V MCU应用电路

通过电阻分压后,输出端的电压为4V,通过一个二极管后,压降约为0.7V,所以输出电压的最大值为:5*0.8-0.7=3.3V。

源码示例

下面是使用MicroPython和ESP32读取ACS712电流值的例子,可以根据自己不同的情况来确定零电流时的电压


SENSITIVITY = 0.1 # 100mV/A(ACS712-20A型号)
ZERO_VOLTAGE = 2.345  # 零电流时电压

def read_current(adc):
    """读取电流值(单位:A)"""
    sum_val = 0
    for _ in range(20):
        sum_val += adc.read()
        time.sleep_ms(1)
    adc_value = sum_val / 20
    print("adc 值:", adc_value)
    voltage = adc_value * 3.3 / 4095
    print("电压值:", voltage)
    return (voltage - ZERO_VOLTAGE) / SENSITIVITY

def main():
    # ADC配置(GPIO4)
    adc = machine.ADC(machine.Pin(4))
    adc.atten(machine.ADC.ATTN_11DB)  # 0-3.3V量程
    for i in range(100):
        print('current is:', read_current(adc))
        time.sleep(1)
main()

相关文章:

  • BFS与Flood Fill:算法原理、实现细节与复杂度分析
  • 在 Spring Boot 中使用 `@Autowired` 和 `@Bean` 注解
  • 一周学会Flask3 Python Web开发-response响应格式
  • 第4章:在LangChain中如何实现响应式流(Response Streaming)
  • 数据结构系列一:初识集合框架+复杂度
  • Py2学习笔记
  • Golang学习笔记_36——装饰器模式
  • 臻识相机,华夏相机,芊熠车牌识别相机加密解密
  • 【C++复习专题】—— 类和对象,包含类的引入、访问限定符、类的6个默认成员函数等
  • 通过例子学 rust 个人精简版 5-all
  • 【C语言】指针(5)
  • 小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025)
  • C++ unordered_map和unordered_set的使用,哈希表的实现
  • One-Prompt-One-Story:无须训练即可保持身份一致性
  • 量子计算的威胁,以及企业可以采取的措施
  • Android Studio SVN下载安装
  • Denoising Diffusion Restoration Models论文解读
  • 解释器vs编译器
  • 前端利器:DateUtils 日期时间工具深度剖析
  • 用openresty和lua实现壁纸投票功能
  • 购物网站建设和使用/优化大师电脑版官网
  • 推荐做木工的视频网站/深圳seo技术
  • 网站建设论坛社区/网站seo优化报告
  • 微信营销软件破解版/作品提示优化要删吗
  • 加强网站建设说明报告范文/中国营销网官网
  • wordpress如何搭建一个购物网站/线上运营推广方案