风筝
发表于: 2017-8-24 11:20:02 | 显示全部楼层

AC-voltmeter-using-Arduino.jpg


在本文中,我们将使用Arduino开发板制作一个交流电压测量装置,测量我们家中交流电源的电压。我们将在Arduino IDE的串行监视器上打印输出该电压,并在万用表上显示出来。


制作数字电压表比模拟电压更容易一些,因为在制作模拟电压表时,您必须具备一些物理参数的知识,如扭矩、摩擦损耗等。然而在制作数字电压表时,您只需使用LCD或LED矩阵或甚至你的笔记本电脑打印输出电压值即可。


所需的元件

●  一个220-12变压器

●   1N4007二极管

●   1uf电容

●   10k和4.7K电阻器

●   齐纳二极管(5v)

●   Arduino UNO开发板

●   连接导线


Arduino电压表电路连接示意图

AC-voltmeter-using-Arduino-circuit-diagram.png

该Arduino电压表的电路图如上所示。


连接方式:

1.    将变压器的高压侧(220V)连接到主电源,将低压(12V)连接到分压器电路。

2.    将10k电阻与4.7k电阻串联,但确保以4.7k电阻为输入电压。

3.    如图所示连接二极管。

4.    将电容和齐纳二极管连接至4.7K电阻。

5.    将二极管N端连接到Arduino的模拟引脚A0。

AC-voltmeter-using-Arduino-1.jpg

**注意:请将Arduino的接地引脚连接到图中所示的位置,否则电路将无法工作。


需要分压电路?

当我们使用220/12 V变压器时,我们在lv端可以得到12V的电压。由于该电压不适合作为Arduino的输入,因此我们需要一个分压电路,输出适合的电压值作为Arduino的输入。


为什么要连接二极管和电容?

由于Arduino不使用负电压值作为输入信号,我们首先需要消除降压AC的负循环,从而Arduino采集到的只有正电压值。因此,二极管被连接以整流降压。

这种半波整流电压不平滑,因为它包含不能给出任何精确模拟值的大波纹。因此,连接电容器可以平滑交流信号。


齐纳二极管的用途?

如果电压大于5v,Arduino开发板可能会损坏。因此,连接一个5v齐纳二极管以确保Arduino的安全性,如果该电压超过5v,则会击穿。


Arduino交流电压表的工作原理

1.     在变压器的一端可获得降压电压,适用于正常额定电阻。

2.    然后我们得到4.7k电阻上的合适的电压值

3.   可以通过在proteus上模拟仿真该电路来找到可测量的最大电压。

4.   Arduino以0至1023之间的模拟值的形式将该电压作为引脚A0的输入。0为0伏,1023为5v。

5.   然后Arduino将该模拟值转换成相应的电源交流电压,由公式计算。


模拟仿真

AC-voltmeter-using-Arduino-simulation-285V.png

在proteus中制作精确的电路,然后模拟仿真。要找到该电路可以测量的最大电压,并使用试验方法。

在交流发电机的峰值电压440(311 r.m.s)时,引脚A0上的电压为5伏,即最大值。因此,该电路可以测量最大的311 r.m.s电压。

对于220 r.m.s至440v之间的各种电压进行仿真。

AC-voltmeter-using-Arduino-simulation-311V.png


代码说明

在本文末尾给出了完整的Arduino电压表代码,并进行了详细注释。这里我们介绍一下部分代码。

m是在引脚A0上接收的输入模拟值,即,

  1. m=    pinMode (A0,INPUT) ;  // set pin a0 as input pin
复制代码

要将变量n分配给该公式,n =(m * .304177),首先使用模拟部分获得的数据进行某种计算:

如仿真照片所示,当输入a.c电压为311伏特时,在引脚A0处获得5v或1023的模拟值。因此:

1023模拟量对应于311伏电源

所以任何随机模拟值对应于(311/1023)* m,其中m是模拟值。

所以我们得到这个公式:

n=(311/1023)*m volts 或者 n=(m*.304177)

现在这个电压值通过串行命令打印在串行监视器上,如下所述。并在万用表中显示,如下面的视频所示。


在屏幕上打印输出的值是:

代码中指定的模拟输入值:

  1. Serial.print("   analog input  ") ; // this gives name which is “analog input”  to the printed analog value
  2. Serial.print(m);// this simply prints the input analog value
复制代码

代码中指定的所需的a.c电压:

  1. Serial.print("   ac voltage  ") ; // this gives name  “ac voltage”  to the printed analog value
  2. Serial.print(n) ;  // this simply prints the ac voltage value
复制代码

代码

  1. int m;// initialise variable m
  2. float n;//initialise variable n
  3. void setup()
  4. {
  5.   pinMode(A0,INPUT); // set pin a0 as input pin
  6.   Serial.begin(9600);// begin serial communication between arduino and pc
  7. }
  8. void loop()
  9. {
  10.   m=analogRead(A0);// read analog values from pin A0 across capacitor
  11.    n=(m* .304177);// converts analog value(x) into input ac supply value using this formula ( explained in woeking section)
  12.   
  13.    Serial.print("   analaog input  " ) ; // specify name to the corresponding value to be printed
  14.    Serial.print(m) ; // print input analog value on serial monitor
  15.    Serial.print("   ac voltage  ") ; // specify name to the corresponding value to be printed
  16.    Serial.print(n) ; // prints the ac value on Serial monitor
  17.    Serial.println();
  18. }
复制代码

译者注:本文翻译自https://circuitdigest.com/microcontroller-projects/arduino-ac-voltmeter,感谢Ankit Negi做出的贡献,如有错漏,敬请指正。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 705 | 回复: 1492



手机版|

GMT+8, 2024-11-22 00:39 , Processed in 0.124619 second(s), 11 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表