一板网电子技术论坛

风筝
发表于: 2019-11-24 09:15:19 | 显示全部楼层

在各种家居设备中,大多数设备都是使用交流电源供电,例如电灯、电视和风扇等。如果需要,我们可以通过建立家庭自动化设备使用Arduino和继电器打开/关闭它们。但是,如果我们需要控制这些设备的电源实现一些较复杂的操作,例如使交流电灯变暗或控制风扇的速度,该怎么办?在这种情况下,我们必须使用相位控制技术和诸如双向晶闸管(TRIAC)的静态开关来控制交流电源电压的相位。


因此,在本篇文章中,我们将学习使用Arduino开发板和TRIAC制作交流电调光器。在这里,双向晶闸管(TRIAC)用于切换交流电灯,因为这是最适合这些应用的电力电子快速切换设备。让我们根据文章内容,了解该项目的硬件详细信息以及编程。


所需的组件

●   Arduino UNO开发板

●   MCT2E光耦

●   MOC3021光耦

●   BT136三端双向可控硅

●   (12-0)V,500mA降压变压器

●   1K、10K、330ohm电阻器

●   10K电位器

●   交流灯座

●   交流电线

●   跳线


过零检测技术(Zero Crossing)

要控制交流电压,我们要做的第一件事是检测交流信号的过零。在国内,交流信号的频率为50 HZ,并且实际上是交变的。因此,每次信号到达零点时,我们都必须检测到该点,然后根据功率要求触发TRIAC。交流信号的过零点如下所示:

Zero-Crossing-Point-of-AC-Signal.jpg


双向晶闸管的工作过程

TRIAC-Working.jpg

TRIAC是三端交流开关,可由其栅极端的低能量信号触发。在SCR(也称作可控硅)中,它仅在一个方向上传导,但是对于TRIAC,可以在两个方向上控制功率。在这里,我们将使用BT136 TRIAC用于交流灯调光。

Graphical-Representation-of-Triggered-TRIAC.jpg

如上图所示,可控硅通过向其施加较小的栅极脉冲信号而以90度的触发角触发。时间“ t1”是根据调光要求我们必须给出的延迟时间。例如,在这种情况下,当发射角为90%时,功率输出也将减半,因此灯也将以一半的强度发光。


我们知道交流信号的频率为50 Hz。因此时间段将是1 / f,即20ms。因此,对于半个周期,这将是10ms。因此,为了控制交流电灯的功率,“ t1”的范围可以在0-10ms之间变化。


光电耦合器

Optocoupler.jpg

光电耦合器也称为光电隔离器。它用于在两个电路(如DC和AC信号)之间实现隔离。基本上,它由发出红外光的LED和检测它的光电传感器组成。在这里,我们使用了MOC3021光耦合器来控制微控制器信号(即直流信号)中的交流灯。


电路原理图

交流调光器的电路图如下:

Circuit-Diagram-for-AC-Ligh-Dimmer.png

双向晶闸管和光电耦合器连接图:

Circuit-Diagram-of-TRIAC-and-Optocoupler-Connection.png

连接完整电路后,实物连接如下所示:

Arduino-Lamp-Dimmer-Circuit-Setup.jpg


为交流调光器编程Arduino

成功完成硬件设置后,现在该对Arduino进行编程了。在文章末尾给出了的完整程序。


第一步,声明所有全局变量,这些变量将在整个代码中使用。 双向晶闸管连接到Arduino的引脚4。然后声明dim_val以存储将在程序中使用的调光步骤的值。

  1. int LAMP = 4;
  2. int dim_val=0;
复制代码

接下来,在setup函数中将LAMP引脚声明为输出,然后配置一个中断以检测过零。这里我们使用了一个名为attachInterrupt的函数,该函数会将Arduino的数字引脚2配置为外部中断,并且在检测到其引脚上的任何中断时将调用名为zero_cross的函数。

  1. void setup()
  2. {
  3.   pinMode(LAMP, OUTPUT);
  4.   attachInterrupt(digitalPinToInterrupt(2), zero_cross, CHANGE);
  5. }
复制代码

loop()函数中,我们从连接到A0引脚的电位计读取模拟值。然后将其映射到(10-49)的值范围。为了找出这一点,我们必须做一些小的计算。前文说过,每个半周期等于10,000微秒。因此,让我们需要分50步控制调光。我将最小步长定为10,而不是零,因为0-9步给出了大致相同的功率输出,实际上不建议采用最大步数。因此,我将最大步数设为49。


然后,每个步长时间可以计算为10000/50 = 200微秒。这将在代码的下一部分中使用。

  1. void loop()
  2. {
  3.     int data=analogRead(A0);
  4.     int data1 = map(data, 0, 1023,10,49);
  5.     dim_val=data1;
  6. }
复制代码

在最后一步中,配置中断驱动的函数zero_cross。在这里,调光时间可以通过将单个步进时间乘以步数来计算。然后,在此延迟时间之后,可以使用一个10微秒的小高脉冲来触发TRIAC,该脉冲足以接通TRIAC。

  1. void zero_cross()
  2. {
  3.   int dimming_time = (200*dim_val);
  4.   delayMicroseconds(dimming_time);  
  5.   digitalWrite(LAMP, HIGH);
  6.   delayMicroseconds(10);
  7.   digitalWrite(LAMP, LOW);
  8. }
复制代码

Arduino灯调光器电路的工作过程

下面的图片显示了使用中间步数实现Arduino和双向晶闸管调节AC灯泡。

Medium-Dimming-Circuit-Setup.jpg


以上就是使用双向晶闸管和光电耦合器轻松构建交流调光器电路的方式。


代码

本文使用的完整代码如下所示: main.rar (349 Bytes, 下载次数: 25)

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

本版积分规则

主题 589 | 回复: 1206



手机版|

GMT+8, 2022-1-19 03:50 , Processed in 0.030352 second(s), 7 queries , Gzip On, MemCache On. Powered by Discuz! X3.4

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

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