arduino analogread_使用Arduino开发板和双向晶闸管制作交流灯泡亮度调节器

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

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

所需的组件

●   Arduino UNO开发板

●   MCT2E光耦

●   MOC3021光耦

●   BT136三端双向可控硅

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

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

●   10K电位器

●   交流灯座

●   交流电线

●   跳线

过零检测技术(Zero Crossing)

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

a606bcb66564d3cbb6891f15a9a675bd.png

双向晶闸管的工作过程

d786370e1b2b419bfcbc0b959a60057b.png

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

cf61ef5de04a8bde4b4d165c8e626e6a.png

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

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

光电耦合器

33da34a62983553b85eabfaa3475f71e.png

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

电路原理图

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

d06d71a5a60ee498d3796b2b30d45475.png

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

5cbf29fb685d3f5a3b816b65981b2906.png

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

a82f1978610d5891a486fb2726cd492b.png

为交流调光器编程Arduino

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

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

int LAMP = 4;int dim_val=0;

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

void setup(){  pinMode(LAMP, OUTPUT);  attachInterrupt(digitalPinToInterrupt(2), zero_cross, CHANGE);}

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

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

void loop() {    int data=analogRead(A0);    int data1 = map(data, 0, 1023,10,49);     dim_val=data1;}

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

void zero_cross(){  int dimming_time = (200*dim_val);  delayMicroseconds(dimming_time);    digitalWrite(LAMP, HIGH);  delayMicroseconds(10);  digitalWrite(LAMP, LOW);}

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

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

10a5bf9ba31a34f63675c9b18db43152.png

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

欢迎打赏+点赞+留言+转发!

更多内容请点击“” 》》

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我不太清楚 Arduino 是什么,但是我可以告诉你 analog read 是一种从模拟信号中读取数据的技术。Arduino是一款开源的电子开发板,可以通过编写代码控制各种电子设备。analogRead()是Arduino中的一个函数,用于读取模拟输入引脚的电压值。它的用法如下: ``` int sensorValue = analogRead(A0); ``` 其中A0是模拟输入引脚的编号,可以根据需要更改。函数返回的值是一个整数,表示输入引脚的电压值,范围从0到1023(10位精度)。例如,如果输入引脚上的电压为3.3V,则函数将返回约为675的值(因为$3.3V \times \frac{1023}{5V} \approx 675$)。 ### 回答2: Arduino是一款非常流行的开源电子平台,由一个硬件板和一个基于C语言的软件库组成。在Arduino中,有一个允许读取模拟值的函数,称为analogRead()。这个函数是用来读取从某个传感器的输出引脚上接收到的模拟信号的。 Arduino基于Atmel的AVR微控制器,并且这些微控制器具有ADC模块。ADC模块是一种用于将模拟信号转换为数字信号的电路。这个电路把输入的模拟信号量化为数字量,并通过串行方式将它们发送到微控制器的寄存器中,然后在程序使用analogRead()函数读取这些数字值。 在Arduino中,analogRead()函数的使用非常简单。它需要一个参数,就是引脚号。这个参数告诉Arduino,要从哪个引脚接收模拟信号。对于标准Arduino板,有6个引脚可以用于模拟输入。这6个引脚的数字编号分别为0到5,它们对应的模拟输入引脚是A0到A5。 analogRead()函数返回一个0到1023之间的整数值,表示读取到的模拟信号的电压值。返回值意味着读取的电压值所占电压范围(一般是0到5伏)的比例,因此我们可以通过一定的计算将其转换为实际的电压值。例如,如果我们把一个传感器输出引脚连接到Arduino的A0引脚,然后调用analogRead(A0)函数,返回值为512,这意味着传感器输出的模拟电压为(512/1023)*5 V = 2.49 V。 analogRead()函数是Arduino中非常基础、常用和重要的函数之一。它使得我们可以轻松地读取各种模拟传感器的输出值,并在程序中进行进一步的处理和控制。同时,需要注意的是,analogRead()函数并不是精度和速度最高的模拟转换方式,因此在一些高要求的应用中需要选择更高精度、更快速的模拟转换方式。 ### 回答3: Arduino是一种非常方便的开源硬件,它拥有强大的功能,可以用来实现各种各样的物联网应用。其中一个重要功能是analogread,这是用于读取模拟信号的函数。 模拟信号是指连续变化的信号,通常是在某个范围内的电压或电流。Arduino的一个重要特点就是它可以读取模拟信号。在Arduino Uno和其他类似的板子中,有一些引脚被标记为“模拟输入”,这些引脚是用于读取模拟信号的。 在使用analogread函数之前,你需要定义一个变量来存储读取到的数据值。这个变量可以是一个整数或一个浮点数,不过通常会用整数来存储,这会节省内存空间。 analogread函数有一个参数,即要读取的引脚号。引脚号可以是一个数字,也可以用一个常量来代替,比如A0、A1等。在读取模拟信号时,理论上来说它的值是0到1023之间的整数,其中0代表的是信号的最小值,1023代表的是信号的最大值。 需要注意的是,在Arduino使用analogread函数进行模拟信号读取时,可能会有一些误差。这些误差来自于实际电路中的噪声、时钟频率等因素,因此需要在实际应用中进行调试和测试。 总的来说,analogread函数是Arduino板子上非常有用的功能之一,它可以用于读取各种类型的模拟信号,并为基于Arduino的各种应用提供更多的功能和灵活性。因此,如果你正在开发物联网应用或想挖掘Arduino板子的更多潜力,现在就开始使用analogread函数吧!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值