亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

使用 ACS712 测量任何交流电流

组件和用品

Arduino UNO
× 1
OLED i²c 128x32
× 1
ACS712 30A
× 1
LCD 16x2 i²c
× 1

关于这个项目

使用电源线时请小心

您好,欢迎来到另一个教程,这是关于测量交流电 (AC),使用 ACS712 我使用的是 30Amps 版本,即 ACS712 30A,还有我们可爱的 Arduino Uno 板,我试图添加一个 OLED 屏幕,但不幸的是结束了在拍摄教程时打破它所以我切换到 LCD,但在下面你会找到两个版本的接线和代码。

“任何交流电……”我的意思是我们将看到一个适用于所有信号类型的代码/库,不仅是正弦波,而且我们的电流表将能够计算出真正的均方根。请注意,传感器使用霍尔效应(在电导体上产生电压差,横向于导体中的电流和垂直于电流的外加磁场)

您可以将此项目与此项目相结合:使用 Arduino 和 ZMPT101B 轻松测量交流电压

测试将在白炽灯泡上进行,由与参考万用表和 ACS712 电流传感器模块串联的调光器控制。

这是计划:

  • 首先,我们需要将模块与 Arduino 板连接起来,并检查调光器开启时的信号形状 - 全周期 - 半周期。
  • 然后我们将检查一个不需要任何库的简单代码,但它仅适用于正弦波信号(将对其进行测试)。
  • 之后我们将看到用于测量 AC 的 TRMS 并使用 LCD 的代码。

零件

选择ACS712时请慎重,不要像我一样尝试安全(通过购买30Amps版本),当您尝试将其用于家庭用途或小放大器应用时,这只会产生很大的波动,所以在这里对我来说,5A 或 10A 版本就可以了。另请注意,30A 或 20A ……也会影响您的校准,但在视频和代码注释中解释了如何校准。

这些是我使用的部件,您可以用任何兼容的板替换 UNO,或者用 OLED 或您喜欢的任何显示器替换 LCD i²c。

测试 1

接线 代码

测试 1 的接线可以在下面(接线 1)和代码(代码 1)旁边找到。

结果

上传代码并启动串行绘图仪,您应该能够看到类似正弦波的信号,红线显示当我调低调光器时,电流开始具有通常在三端双向可控硅中找到的形状。

测试 2

现在,如果您只想使用上面的代码测量电流,您将得到大约 512 – 511 的值,它们根本不反映 RMS 值。因此,为了测量信号 RMS 值,我们将保持与上述相同的接线,但现在我们需要另一个可以计算 RMS 的代码。

布线 代码

接线与(接线 1)相同,但可以在下面找到不同的代码(代码 2)。

结果

如您所见,左侧的值 (RMS) 与万用表测量的值相同,右侧的值是峰峰值,请注意调光器处于全周期,因为我使用的是 75W 灯泡和230VAC/50Hz。

!!!!!!!!!!!!!!!!!!但是!!!!!!!!!!!!!!!!!!!!!!!!

在这里,我一直调低了调光器,这意味着我大约在一个周期的 1/4 左右,万用表给我 0.21A 但我的代码给了我 0.36A,代码仍然测量从峰值到峰值,但是正如你在上面看到的,当我把调光器调到最低时,我的信号不是线性的。

这就是 TRMS 测量与仅适用于正弦波信号的测量之间的区别。

测试 3

现在你看到了上面代码的问题,但幸运的是有一个库可以解决,我真的很感激这个库所做的所有工作,因为你知道如果你想计算一个 RMS 值,你需要使用积分微积分,并且这在电子开发板上很难实现,您可以查看库 cpp 文件,看看使用了哪些方法,例如“Average”“Sigma”……与统计/概率相关的事情……

布线, 代码 图书馆

接线与上面使用的接线(接线1)相同,您可以在下面找到代码(代码3)。

您可以在此处下载过滤器库:在此处下载库

结果

正确的结果在中间,左边的是没有校准的,右边是用来演示如何校准的(查看视频)。

正如您所看到的,两个代码对非线性信号的响应存在巨大差异,但第二个代码充当 TRMS 万用表。

用 LCD/OLED 测试

在这里,我们保持相同的事情,我们所做的就是不使用串行监视器,我们可以使用 LCD 或 OLED

布线, 代码 图书馆

接线可在下方 (Wiring_LCD) 和 (Wiring_OLED) 中找到,代码也在下方 (Code_ACS712_LCD) 和 (Code_ACS712_OLED)。

这是 OLED 库

https://github.com/adafruit/Adafruit_SSD1306https://github.com/adafruit/Adafruit-GFX-Library

这是 LCD_i2c_library

https://drive.google.com/file/d/1Oc56q2GPs5SOA-PdbVHHSxKCnI9KY5xd/view

结果

这是我唯一能做的测试,因为我在尝试拍摄视频教程时弄坏了 OLED 屏幕。总的来说,它的工作方式与我们之前看到的一样,只是在 LCD i²c 屏幕上显示它。 (是的 TRMS 值不是峰峰值方法)。

就这些了,希望大家喜欢本教程不要忘记点赞视频教程,如果想支持就订阅SurtrTech频道,非常感谢。

有任何问题请在评论中留言。

代码

  • Code_1.ino
  • Code_2.ino
  • Code_3.ino
  • Code_ACS712_LCD.ino
  • Code_ACS712_OLED.ino
Code_1.inoArduino
此代码用于测试模块和可视化信号 shap
/*此代码适用于 ACS712 电流传感器,它允许读取原始数据 最好与串行绘图仪一起使用 更多详情请访问 www.surtrtech.com*/ #define Current_sensor A0 //传感器模拟输入 pinfloat i;void setup() {Serial.begin(9600);pinMode(Current_sensor, INPUT);}void loop() { i =analogRead(Current_sensor); Serial.println(i);延迟(100); //修改或移除延迟会改变信号的显示方式 //设置它直到你得到正确的正弦波形状}
Code_2.inoArduino
此代码使用峰峰值测量方法计算正弦波信号的 RMS
/* 此代码适用于 ACS712 电流传感器,它允许计算正弦波交流电的 RMS * 它使用峰峰值计算 RMS 的方法 * 欲了解更多信息,请查看 www.surtrtech.com */#define SAMPLES 300 //每次循环时您想要采样的数量#define ACS_Pin A0 //ACS712 数据引脚 analong inputfloat High_peak,Low_peak; //测量或计算变量float Amps_Peak_Peak, Amps_RMS;void setup() { Serial.begin(9600); pinMode(ACS_Pin,INPUT); //定义引脚模式}void loop() { read_Amps(); //启动read_Amps函数 Amps_RMS =Amps_Peak_Peak*0.3536*0.06; //现在我们有峰峰值,通常公式只需要乘以 0.3536 //但是由于值会很大,你应该乘以 0.06,你可以先不使用它,//做你的计算并将它们与由电流表测量的实际值。例如:0.06=实际值/测量值 Serial.print(Amps_RMS); //这里我显示RMS值和峰峰值,你可以打印你想要的并添加“A”符号... Serial.print("\t"); Serial.println(Amps_Peak_Peak); delay(200);}void read_Amps() //read_Amps 函数计算高峰值和低峰值之间的差值 { //获取峰峰值 int cnt; //计数器High_peak =0; //我们首先假设我们的高峰值等于0,低峰值是1024,是的倒置Low_peak =1024; for(cnt=0; cnt High_peak) //如果该值高于峰值(最初为 0){ High_peak =ACS_Value; //高峰值将从0变为找到的那个值 } if(ACS_Value  
Code_3.inoArduino
此代码使用统计公式来计算任何信号的 TRMS 并将其显示在串行监视器上
/* 此代码适用于 ACS712 电流传感器,它允许计算信号 TRMS * 访问 www.surtrtech.com有关更多详细信息 */#include  //这个库做了大量工作检查它的 .cpp 文件#define ACS_Pin A0 //A0 模拟输入上的传感器数据引脚浮点 ACS_Value; //这里我们保留原始数据值sfloat testFrequency =50; // 测试信号频率 (Hz)float windowLength =40.0/testFrequency; // 平均信号需要多长时间,对于 statististfloatintercept =0; // 根据校准测试进行调整浮动斜率 =0.0752; // 根据校准测试进行调整 //请查看 SurtrTech 的 ACS712 教程视频以了解如何获取它们,因为这取决于您的传感器,或查看以下 float Amps_TRMS; // 以安培为单位估计的实际电流 unsigned long printPeriod =1000; // 以毫秒为单位// 自上次读取以来以毫秒为单位的跟踪时间 unsigned long previousMillis =0;void setup() { Serial.begin(9600); // 启动串口 pinMode(ACS_Pin,INPUT); //定义pin模式}void loop() { RunningStatistics inputStats; // 创建统计信息以查看原始测试信号 inputStats.setWindowSecs( windowLength ); //设置窗口长度 while( true ) { ACS_Value =analogRead(ACS_Pin); // 读取模拟值: inputStats.input(ACS_Value); // 记录到 Stats 函数 if((unsigned long)(millis() - previousMillis)>=printPeriod) { // 我们每一秒都做一次计算 previousMillis =millis(); // 更新时间 Amps_TRMS =截距 + 斜率 * inputStats.sigma(); Serial.print("\t 安培:"); Serial.print( Amps_TRMS ); } }}/* 关于斜率和截距 * 首先你需要知道所有的 TRMS 计算都是由库中的函数完成的,它是“inputStats.sigma()”值 * 首先你可以显示“inputStats.sigma ()" 作为您的 TRMS 值,然后尝试在输入为 0.00A 时使用它进行测量 * 如果测量值为 0,就像我得到的一样,您可以将截距保持为 0,否则您需要添加或减去以使其成为值等于 0 * 换句话说“去除偏移” * 然后打开电源到一个已知值,例如使用灯泡或 LED,你知道它的功率并且你已经知道你的电压,所以稍微算一下你将得到理论安培数 * 你将该理论值除以测量值,然后得到斜率,现在放置它们或修改它们 */
Code_ACS712_LCD.inoArduino
此代码使用 TRMS 计算方法并将其显示在 LCD i²c
/* 此代码适用于 ACS712 和 LCD ic * 它测量交流电的 TRMS 并在屏幕上显示该值 * 访问 www.SurtrTech.com有关更多详细信息 */#include  //该库做了大量工作检查其 .cpp 文件#include  //LCD ic library#define ACS_Pin A0 //ACS712 数据引脚#define I2C_ADDR 0x27 //I2C地址,你应该先用code扫描地址(0x27)这里#define BACKLIGHT_PIN 3 //声明LCD引脚#define En_pin 2#define Rw_pin 1#define Rs_pin 0#define D4_pin 4#define D5_pin 5#define D6_pin 6#define D7_pin 7LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); //声明lcdfloat testFrequency =50; // 测试信号频率 (Hz)float windowLength =40.0/testFrequency; // 平均信号需要多长时间,对于 statististfloatintercept =0; // 根据校准测试进行调整浮动斜率 =0.0752; // 根据校准测试进行调整 //请查看 SurtrTech 的 ACS712 教程视频以了解如何获取它们,因为这取决于您的传感器,或查看以下 float Amps_TRMS;浮点 ACS_Value;无符号长打印周期 =1000; unsigned long previousMillis =0;void setup() { digitalWrite(2,HIGH);液晶显示器开始(16,2); lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(高); //照明背光lcd.home(); }void loop() { RunningStatistics inputStats; // 创建统计信息以查看原始测试信号 inputStats.setWindowSecs( windowLength );而(真){ ACS_Value =模拟读取(ACS_Pin); // 读取模拟值: inputStats.input(ACS_Value); // 记录到 Stats 函数 if((unsigned long)(millis() - previousMillis)>=printPeriod) { // 我们每一秒都做一次计算 previousMillis =millis(); // 更新时间 Amps_TRMS =截距 + 斜率 * inputStats.sigma(); //校准值 lcd.clear(); //清除lcd并在某个位置打印lcd.setCursor(2,0); lcd.print(Amps_TRMS); lcd.print("A"); } }}/* 关于斜率和截距 * 首先你需要知道所有的 TRMS 计算都是由库中的函数完成的,它是“inputStats.sigma()”值 * 首先你可以显示“inputStats.sigma ()" 作为您的 TRMS 值,然后尝试在输入为 0.00A 时使用它进行测量 * 如果测量值为 0,就像我得到的一样,您可以将截距保持为 0,否则您需要添加或减去以使其成为值等于 0 * 换句话说“去除偏移” * 然后打开电源到一个已知值,例如使用灯泡或 LED,你知道它的功率并且你已经知道你的电压,所以稍微算一下你将得到理论安培数 * 你将该理论值除以测量值,然后得到斜率,现在放置它们或修改它们 */
Code_ACS712_OLED.inoArduino
此代码使用 TRMS 计算方法并在 OLED 上显示该值。
/* 此代码适用于 ACS712 和 OLED ic * 它测量交流电的 TRMS 并在屏幕上显示该值 * 访问 www.SurtrTech。 com 了解更多详情 */#include  //这个库做了大量工作检查它的 .cpp 文件#include  //OLED 库#include #define ACS_Pin A0#define SCREEN_WIDTH 128 // OLED 显示宽度,以像素为单位#define SCREEN_HEIGHT 32 // OLED 显示高度,以像素为单位#define OLED_RESET -1 // 重置引脚 #(如果共享 Arduino 重置引脚,则为 -1)float testFrequency =50; // 测试信号频率 (Hz)float windowLength =40.0/testFrequency; // 平均信号需要多长时间,对于 statististfloatintercept =0; // 根据校准测试进行调整浮动斜率 =0.0752; // 根据校准测试进行调整 //请查看 SurtrTech 的 ACS712 教程视频以了解如何获取它们,因为这取决于您的传感器,或查看以下 float Amps_TRMS;浮点 ACS_Value;无符号长打印周期 =1000; unsigned long previousMillis =0; Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //声明显示名称(display)void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //启动OLED显示屏 display.clearDisplay(); display.display();}void loop() { RunningStatistics inputStats; // 创建统计信息以查看原始测试信号 inputStats.setWindowSecs( windowLength );而(真){ ACS_Value =模拟读取(ACS_Pin); // 读取模拟值: inputStats.input(ACS_Value); // 记录到统计函数 if((unsigned long)(millis() - previousMillis)>=printPeriod) { //每 1 秒计算一次 previousMillis =millis(); // 更新时间 Amps_TRMS =截距 + 斜率 * inputStats.sigma(); display.clearDisplay(); display.setTextSize(3); display.setTextColor(WHITE); display.setCursor(15,10); display.print(Amps_TRMS); display.println(" A");显示。显示(); } }}/* 关于斜率和截距 * 首先你需要知道所有的 TRMS 计算都是由库中的函数完成的,它是“inputStats.sigma()”值 * 首先你可以显示“inputStats.sigma ()" 作为您的 TRMS 值,然后尝试在输入为 0.00A 时使用它进行测量 * 如果测量值为 0,就像我得到的一样,您可以将截距保持为 0,否则您需要添加或减去以使其成为值等于 0 * 换句话说“去除偏移” * 然后打开电源到一个已知值,例如使用灯泡或 LED,你知道它的功率并且你已经知道你的电压,所以稍微算一下你将得到理论安培数 * 你将该理论值除以测量值,然后得到斜率,现在放置它们或修改它们 */

示意图

测试 1,2 和 3 使用的接线 使用LCD i²c 使用OLED 128x32

制造工艺

  1. 如何在 OpenSensors 上测量空气质量
  2. 使用 K30 传感器监测二氧化碳
  3. 聋盲通信与 1Sheeld/Arduino
  4. 使用 Arduino 控制硬币接收器
  5. Arduino 带蓝牙控制 LED!
  6. 带有 Arduino 或 ESP8266 的电容式指纹传感器
  7. 玩 Nextion Display
  8. Nunchuk 控制机械臂(使用 Arduino)
  9. 使用任何音频源制作比利巴斯嘴的动画
  10. 使用 Arduino 测量太阳辐射
  11. 带 Arduino 的迷你雷达
  12. 如何用 Arduino 制作音乐