ESP32用ADC1即36引脚analogRead读取模拟量,读数为12位数值,即1111 1111 1111,最大值为4095, 资料 传送门
上说读取的最大的电压为3.3V,实测3V就满量程了。也就是说当读数为4095时,模拟电压为3V,可能存在万用表测量误差,就当他满量程是3.3V吧。
demo如下:

void setup() {Serial.begin(115200);
}void loop() {int vtmp=analogRead(36); //ADC获取电压Serial.printf("采样值为:%d\n", vtmp);Serial.printf("电压为:%.3fV\n", vtmp * 3.3 / 4095);delay(1000);
}

ACS712霍尔互感器,5A量程的输出为185mV/A,20A量程的输出为100mV/A,30A量程的输出为66mV/A,我买的是20A的。
接线如下

ESP32 ACS712
5V VCC
G GND
36 OUT

在空载的情况下,ACS712输出的理论上为2.5V,2.5V即为0点。如果测的是直流电,数量则在2.5+;如果测的是交流电,数值则在2.5+ 2.5-上。实测后发现几个问题:

  1. 空载输出并非2.5V稳定的,而是在2.7±0.2V浮动。
    解决方法:采用50次测量取均值,这样数值相对会稳定点。有资料说要在硬件上加低通滤波,不会搞T_T。
  2. 就算是零点2.5V稳定,按20A量程的输出为100mV/A来计算,如果电流为测量20A,那ACS712的输出电压测为2.5+0.120=4.5V,而ESP32的测量模拟量为3.3V,已经超过了ESP32的量程。怎么办?
    解决方法:想了想,是不是工作电压为5V,零点为2.5V,那工作电压为3.3V,零点是不是也到1.65V了呢?循着这个思路测了一下,确实如此。就是不知道是否还是100mV/A,待测量。如果还是这个标准的话,满量程输出电压为1.65+0.1
    20=3.75V,马马虎虎还能测得上。假设工作电压下降了,输出标准也同比下降的话,那20A的标准就变为66mV/A,那满测量输出为:4.5*0.66=2.97V,那就在ESP32的测量范围内了,不过只只是猜测,待实测证实。

注:github搜索ACS712会出来很多别人已经写好的arduino库。都是针对arduino模拟测量程5V ,采样10位即1023写的。需要把程序里的参数进行调整,例如下面的我根据ESP32的参数进行了些改良:
ACS712.h

#ifndef ACS712_h
#define ACS712_h#include <Arduino.h>#define ADC_SCALE 4095.0//采样值 arduino为1023
#define VREF 3.3 //参考电压,即满量程模拟电压,arduino为5
#define DEFAULT_FREQUENCY 50//交流电频率enum ACS712_type {ACS712_05B, ACS712_20A, ACS712_30A};class ACS712 {public:ACS712(ACS712_type type, uint8_t _pin);int calibrate(); // 零点校准值void setZeroPoint(int _zero);void setSensitivity(float sens);float getCurrentDC(); // 测直流电float getCurrentAC(uint16_t frequency = 50); // 测交流电private:int zero = 2048;//零点模拟值float sensitivity;uint8_t pin;
};#endif

ACS712.cpp

#include "ACS712.h"ACS712::ACS712(ACS712_type type, uint8_t _pin) {pin = _pin;// 不同量程模块的灵敏度,工作电压变了,这里的灵敏度值估计也要同比调整switch (type) {case ACS712_05B: // 5Asensitivity = 0.185;break;case ACS712_20A: // 20Asensitivity = 0.100;break;case ACS712_30A: // 30Asensitivity = 0.066;break;}
}// 零点校准
int ACS712::calibrate() {uint16_t acc = 0;for (int i = 0; i < 50; i++) {// 50次取样平均,原版10次acc += analogRead(pin);}zero = acc / 50;return zero;
}// 设置零点值
void ACS712::setZeroPoint(int _zero) {zero = _zero;
}// 设置灵敏度值
void ACS712::setSensitivity(float sens) {sensitivity = sens;
}// 测量直流电,单位:mA 毫安
float ACS712::getCurrentDC() {int16_t acc = 0;for (int i = 0; i < 50; i++) {//50次采样,原版10次acc += analogRead(pin) - zero;}float I = (float)acc / 50.0 / ADC_SCALE * VREF / sensitivity * 1000 ;return I;
}// 测量交流电,单位:mA 毫安
float ACS712::getCurrentAC(uint16_t frequency) {uint32_t period = 1000000 / frequency;uint32_t t_start = micros();uint32_t Isum = 0, measurements_count = 0;int32_t Inow;while (micros() - t_start < period) {Inow = analogRead(pin) - zero;Isum += Inow*Inow;measurements_count++;}float Irms = sqrt(Isum / measurements_count) / ADC_SCALE * VREF / sensitivity * 1000;return Irms;
}

测量直流电DEMO

#include "ACS712.h"/*This example shows how to measure DC current
*/// We have 30 amps version sensor connected to A0 pin of arduino
// Replace with your version if necessary
ACS712 sensor(ACS712_30A, A0);void setup() {Serial.begin(115200);// calibrate() method calibrates zero point of sensor,// It is not necessary, but may positively affect the accuracy// Ensure that no current flows through the sensor at this moment// If you are not sure that the current through the sensor will not leak during calibration - comment out this methodSerial.println("Calibrating... Ensure that no current flows through the sensor at this moment");int zero = sensor.calibrate();Serial.println("Done!");Serial.println("Zero point for this sensor = " + zero);
}void loop() {// Read current from sensorfloat I = sensor.getCurrentDC();// Send it to serialSerial.println(String("I = ") + I + " mA");// Wait a second before the new measurementdelay(1000);
}

测量交流电DEMO

#include "ACS712.h"/*This example shows how to measure the power consumptionof devices in 230V electrical systemor any other system with alternative current
*/// We have 30 amps version sensor connected to A0 pin of arduino
// Replace with your version if necessary
ACS712 sensor(ACS712_30A, A0);void setup() {Serial.begin(9600);// calibrate() method calibrates zero point of sensor,// It is not necessary, but may positively affect the accuracy// Ensure that no current flows through the sensor at this moment// If you are not sure that the current through the sensor will not leak during calibration - comment out this methodSerial.println("Calibrating... Ensure that no current flows through the sensor at this moment");sensor.calibrate();Serial.println("Done!");
}void loop() {// We use 230V because it is the common standard in European countries// Change to your local, if necessaryfloat U = 230;// To measure current we need to know the frequency of current// By default 50Hz is used, but you can specify desired frequency// as first argument to getCurrentAC() method, if necessaryfloat I = sensor.getCurrentAC();// To calculate the power we need voltage multiplied by currentfloat P = U * I;Serial.println(String("I = ") + I + " mA");Serial.println(String("P = ") + P + " Watts");delay(1000);
}

原版库传送门

ESP32+ACS712霍尔电流传感器小结相关推荐

  1. 浅谈霍尔电流传感器ACS785/ACS712系列电流检测方式

    电流检测方式 一.检测电阻+运放 优势: 成本低.精度较高.体积小 劣势: 温漂较大,精密电阻的选择较难,无隔离效果. 分析: 这两种拓扑结构,都存在一定的风险性,低端检测电路易对地线造成干扰:高端检 ...

  2. 霍尔电流传感器ACS712/ACS724/CH701应用于物联网智能光伏电路

    太阳能光伏发电系统是利用太阳电池半导体材料的光伏效应,将太阳光辐射能直接转换为电能的一种新型发电系统,有独立运行和并网运行两种方式,在行业中光伏的主流使用形式是集中式发电,即将光伏模块(PV modu ...

  3. 经典霍尔电流传感器ACS712即将停产,需要改用ACS723/ACS724或ACS71240

    ACS712: 带 2.1 kVRMS 电压绝缘及低电阻电流导体的全集成.基于霍尔效应的线性电流传感器 IC ACS712是Allegro推出的经典霍尔电流传感器,已经在国内市场使用十多年,可为工业. ...

  4. 进口芯片供货紧张,ACS712即将停产,国产汽车级霍尔电流传感器迎来新机会

    ACS712是美国Allegro公司在10多年以前推出的一款经典的霍尔电流传感器IC,该芯片完全基于霍尔感应的原理设计,由一个精确的低偏移线性霍尔传感器电路与位于接近IC表面的铜箔组成,电流流过铜箔时 ...

  5. 工频风力发电储能逆变电路中的电流检测(霍尔电流传感器ACS712/CH701应用案例)

    在传统的风力发电中,由于风力的不稳定性,因此直接产生的电压不稳定,不能直接被利用,需要进一步的稳压,储能,转化才能实现正常的使用. 为了克服传统的风力发电问题,本文介绍了一种工频风力发电储能逆变电路, ...

  6. 霍尔电流传感器在UPS蓄电池浮充电流远程监测方案的应用

    王兰 安科瑞电气股份有限公司 摘要:针对无人平台UPS蓄电池多次出现浮充电流过高的现象,介绍了UPS系统的结构和工作原理,通过应用霍尔电流传感器,DCS组态,实现UPS蓄电池浮充电流远程监控,异常电流 ...

  7. 光伏直流柜空间有限制怎么办?霍尔电流传感器AHKC-BS来帮忙

    在光伏直流柜中,鉴于光伏直流柜中一般汇流采用铜牌接入且柜体空间有限制,如图,可推荐采用8个体积较小的AHKC-BS 200A/5V霍尔开环电流传感器. 霍尔电流传感器AHKC-BS 测量DC 50-5 ...

  8. 霍尔电流传感器CH701/CH701W应用于电动汽车模式2充电的装置

    电动汽车充电是电动汽车使用过程中必不可少的环节,充电快慢影响着电动汽车用户出行的规律.根据电动车电池组的技术特性和使用性质,存在着不同的充电设施,不同的充电模式,不同的充电方法.电动汽车充电主要有三种 ...

  9. 浅谈霍尔电流传感器在数据中心直流列头柜里的运用

    摘要:数据中心供电电源质量的好坏直接影响到IT设备的安全运行,因此对数据中心直流列头柜电源进出线实行监测非常重要,而通过霍尔电流传感器可以采集主进线电流.多路支路直流电流和漏电流. 0.概述 直流列头 ...

最新文章

  1. 舒尔补在SLAM中的应用
  2. Ubuntu下Qt配置Opencv
  3. 【STM32】FreeRTOS 调度器开启和任务相关函数详解
  4. C++中,有哪4种与类型转换相关的关键字?各有什么特点?应该在什么场合下使用?
  5. 十分钟搞懂JSON(JSON对象---JSON字符串---对象 之间的区别)
  6. VueJS组件之全局组件与局部组件
  7. 【教训】rm -fr ./* 教训
  8. 基于JAVA+Servlet+JSP+MYSQL的问卷调查管理系统
  9. 解决 gcc/g++ 编译动态库通过却无法运行的问题
  10. android 5.1 改mac地址,mac地址可以随便改吗
  11. 单出口双防火墙双核心冗余_各类冗余备份技术合集
  12. Pandas:用Python做日报(重构)
  13. Linux网络流量监控工具
  14. shell脚本中set -e作用
  15. 说明书丨Epigentek EpiNext 高灵敏免疫共沉淀测序试剂盒
  16. 微信小程序如何保存图片到相册
  17. 在windows系统中安装显卡驱动
  18. git设置用户名密码
  19. PID控制里面积分控制为什么能消除静态误差及微分控制为什么能减少超调量的原因
  20. 程序员成功之路 ——The road ahead for programmer(演讲稿)(转)

热门文章

  1. 自定义html标签教程,HTML自定义标签
  2. 【两万字】面试128题汇总(含超详细答案)
  3. vue2+vant的图书商城
  4. 华为交换机,路由器升级版本
  5. 京东敏捷软件开发套路
  6. 开水果店常见的贮藏保鲜方法,开水果店有哪些水果保鲜的办法
  7. 外刊/网站公众号以一敌三的英语外刊精读公众号 英语外刊阅读
  8. 问鼎EDA顶会冠军之后,我们还有哪些路要走?
  9. BIM家装族库丨桌子族
  10. Java高级编程12-姜国海 事件处理