在里面上一个教程,我们讨论了使用Arduino时的数字输入流程。我们还解释了按钮(瞬时类型的按钮)和如何使用它们通过数字输入数据或命令输入。
任何控制器都可以通过五种方式与其他电子设备进行接口和交互:数字输出、数字输入、模拟输出、模拟输入和串行通信。
在本教程中,我们将讨论模拟输出Arduino并使用它使LED褪色。
模拟信号
电子学涉及处理电子信号。电子信号有两种形式:模拟信号和数字信号。
数字信号有离散的电压水平,而模拟信号是随时间变化的连续波。你可以把模拟信号看作是电压随时间的连续变化。
数字信号用矩形波表示,模拟信号(如果是周期性的)通常用正弦波表示。然而,这些变化可能以连续的形式发生,可能遵循也可能不遵循数学公式。因为它们在本质上是连续的,所以这些信号的值没有固定的范围。
模拟信号(正弦波)的周期形式被用来在模拟通信系统中携带信息——在模拟通信系统中,信号的幅度、频率或相位被调制以携带电子信息。非周期形式的模拟信号被传感器(和仪器设备)用来将物理量(如光强、温度、湿度、压力等)的信息传递给计算设备(控制器或处理器)。
模拟传感器被设计成输出一个随物理量变化而变化的模拟电压范围。从传感器输出的模拟(电压)可以按照测量物理量的线性或非线性曲线。
然后,通过针对一系列值采样模拟电压来测量物理量。实际上,即使是数字传感器也首先测量物理量作为模拟电压的变化,然后通过内置处理器将其转换为数字输出的数字化信号。
类似地,执行器感知来自控制设备(可以是控制器或处理器)的模拟电压,并根据模拟电压水平移动或定位目标机电系统。即使是数字执行器,输入的数字信号也被解释为模拟值,以控制各自的机电系统。
虽然周期性模拟信号在数据通信中是有用的,但是非周期性模拟信号对于通过传感器和执行器的方式设置电子和现实世界之间的相互作用。任何嵌入式控制器都必须输出模拟电压(模拟输出)以驱动致动器并感测模拟电压(模拟输入),以便与(模拟)传感器接口。
要输出真正的模拟信号,控制器或处理器必须有内置的数模转换器(DAC)或与外部DAC接口。大多数Arduino板没有内置的DAC,无法提供真正的模拟输出。
然而,大多数Arduino板可以输出近似或接近模拟电压水平的脉宽调制(PWM)信号。基于所有Arduino板,只有MKR和Zero板各有一个DAC (A0引脚处的DAC0), Due板有两个DAC (DAC0和DAC1)。
脉宽调制(PWM)
传感器和执行器使用的非周期模拟信号是连续的,但在电压水平范围内受到限制。这些信号还根据定义的数学值范围进行采样。由于这些信号的电压水平是有限的,所以只有模拟信号的近似,而不是真正的模拟信号。但这对于计算或控制的目的是很有效的。
产生信号的最常见的方式,近似模拟电压水平在一个定义的范围是PWM。
与数字信号类似,PWM信号是矩形的。不同的是,PWM信号是固定(或设定)频率的周期性矩形信号,其占空比可以改变。通过改变固定频率周期矩形波的占空比,信号可以在一个确定的范围内接近模拟电压水平。这种信号所能近似的最大模拟电压就是矩形波的振幅。
可以用PWM信号近似的其他电压电平取决于占空比的允许变化。
例如,我们说PWM信号的振幅是5V。如果占空比由8位寄存器控制,在0到5V之间可以实现256(2^8)电压水平。如果我们假设这些电压等级以相等的间隔精确间隔,每个电压等级与相邻电压等级将相差19.6 mV (5V/255)。
如果占空比由一个10位的振幅相同的寄存器控制,那么在0到5V之间可以达到1024(2^10)个电压等级。在这种情况下,每个电压水平将相差4.9 mV的相邻电压水平。
PWM信号的频率对信号所能达到的电压电平的数量没有任何影响。PWM信号的频率越高,电压电平的精度越高。当PWM信号用于电路中的高速开关操作或当PWM信号用于音频应用时,其频率也起着重要作用。
对于执行器(或类似的输出设备),唯一需要关注的是允许的占空比变化。占空比分辨率越大,PWM信号与模拟电压曲线的近似越精确。PWM信号必须以线性和可预测的方式近似于非周期模拟电压。
Arduino董事会和脉宽调制
在使用Arduino板时,可以通过调用analogWrite()函数生成PWM信号。
PWM输出可在下列引脚,取决于板。
除了上述引脚的PWM功能,MKR和Zero板在引脚A0有一个真模拟输出(DAC0), Due板有两个真模拟输出(DAC0和DAC1)。除了这些PWM源外,在使用Arduino时还可以通过敲击位元和使用机载AVR控制器的定时器/计数器来产生不同频率的PWM信号。
已编写了analogWrite()函数来生成指定引脚上上述指定频率的PWM信号。然而,如何使用板载控制器的定时器/计数器来产生固定频率的PWM信号的细节是抽象的。
下面是来自wiiring_analogue .c文件的analogWrite()函数的源代码。
analogWrite()函数使用定时器/计数器编程和位敲(在占空比为0%和100%的情况下,以及非定时器的默认情况下)的组合来产生PWM信号。
pinMode()函数也会在analogWrite()函数体中被调用。因此,在调用analogWrite()函数之前,不需要使用pinMode()函数来设置引脚作为输出。引脚5和6上的PWM信号可能有比预期更高的占空比。这是因为这些引脚使用相同的内部定时器,由delay()和Milliis()函数使用。
analogWrite()函数
analogWrite()函数的语法如下:
analogWrite(销值)
它需要两个参数:
1。应该产生PWM信号的pin号
2。占空比的分辨率价值。
PIN码必须是有效的引脚,因此可以生成PWM。PWM引脚由Arduino Board上的Tilde标志(〜)标记。分辨率值可以是0到255之间的任何正整数。值0表示0%占空比,值255表示100%占空比。
通过使用中间值可以获得其他占空比,例如64对于25%占空比,127,用于50%占空比,191为75%占空比,等等。
Arduino UNO&PWM.
Arduino UNO有6个PWM引脚:3、5、6、9、10和11。这些引脚通过以下方式连接到机载AVR ATmega328P单片机:
- PB3(港口B,第3位)
- PB2 (B口,2位)
- PB1 (B口,1位)
- PD6(端口D位6)
- PD5(端口D位5)
- PD3(端口D位3)
对于PB3,PB2,PB1,PD6,PD5和PD3处的PWM生成,这些是使用的定时器/计数器和相关寄存器:
对于PWM产生,定时器/计数器和控制寄存器是首先配置的。在输出比较寄存器中存储一个值,它本质上决定了PWM信号的占空比。然后,这个值与定时器/计数器寄存器匹配,以设置或清除输出位。
在本教程中,我们不使用位敲打或定时器/计数器来生成PWM信号,但将使用analogWrite()函数生成PWM输出。
使用analogWrite()的LED褪色配方
在这个配方中,我们将使用Arduino的PWM信号淡化一个LED。PWM信号将使用analogWrite()函数生成。
组件的要求
1。Arduino UNO x1
2。LED X1
3.330欧姆电阻
4.案板x1
5。公对公跳线或连接线
电路的连接
将Arduino UNO的数字I/O引脚5与LED的阳极连接。然后将LED的阴极与330欧姆串联电阻连接,另一端与电阻接地。直流电源电压和接地可以从Arduino UNO的5V电源引脚和一个接地引脚给电路。
线路图
arduino素描
int i = 0;
无效的设置(){
pinMode(5、输出);
}
无效循环(){
(我= 0;我< 255;我+ +)
{
analogWrite(我);
延迟(20);
}
(i = 255;我> 0;我)
{
analogWrite(我);
延迟(20);
}
}
项目如何运作
这发光二极管是电流控制的显示设备。它们类似于信号二极管。这意味着电流流过LED时,它是通过一个适当的电压施加的正向偏置。
在前向偏置的情况下,LED开始发光。当正向电压从LED上移除时,电流停止流过它,灯停止发光。LED发出的光的强度取决于它发出的电流。LED通常需要12毫安到30毫安的电流才能达到最大照明。大多数led在正常照明下的亮度为5ma。
LED的电压-电流特性与信号二极管类似。在正向偏置条件下,通过LED的电流根据施加的正向电压增加。
通过增加或减少施加的正向电压,可以分别增加或减少通过LED的电流,也可以增加或减少从LED发出的光的强度。
Arduino Uno在销3,5,6,9,10和电路板的引脚有6个PWM通道。这些信道可用于输出PWM信号,这是模拟电压的近似值。可以使用模拟网()函数,比特敲击或使用定时器/计数器在其中一个引脚上生成PWM信号。
使用AnalmwWrite()函数时,在Arduino的PWM引脚上生成固定频率的PWM信号。对于Arduino UNO,在引脚5和6处产生980Hz的PWM信号,并且在调用模拟程序()函数时在剩余的PWM引脚处生成490-Hz频率的PWM信号。
通过改变PWM信号的占空比,可以改变PWM引脚的模拟输出。Arduino上产生的PWM信号的幅度是5V。
- 当占空比设置为100%时,PWM信号接近于5V
- 当占空比设置为50%时,PWM信号约为2.5V
- 当占空比设定为0%时,PWM信号近似于0V等。
当LED的光强增加并以连续的方式交替褪色时,这种效果称为LED褪色。这是通过不断增加和降低正向电压,以交替的方式对LED实现的。也可以通过不断改变PWM信号的占空比来产生交流电压。这种PWM信号在LED上的效果就像一个整流的正弦波信号被应用到LED上一样。
当产生一个近似的整流正弦波时,固定频率的PWM信号被应用到LED上。此外,PWM信号的占空比首先由0增加整数步长到最大值(255),然后由最大值(255)减少整数步长,然后回到0。对于占空比的每一个增加或减少,PWM波必须在相同的时间段里保持活跃。
例如,假设PWM波具有1000 Hz的频率。因此,一秒钟内从通道产生一定占空比的1000pwm脉冲。如果PWM脉冲序列为给定占空比保持有20毫秒的动力,则为每个占空比将20个PWM脉冲(20毫秒* 1000Hz / 1000)应用于LED。
如果工作周期增加然后减少每20毫秒的时间间隔,生成PWM信号接近纠正正弦波时间为10.2秒(20毫秒x 255 x 2)。这是提供了工作周期不断增加和减少由一个8位(2 ^ 8)决议。
因此,当应用这种PWM信号时,LED必须在5.1秒内发光到全亮,然后在接下来的5.1秒内衰减到无亮。这将产生LED以10.2秒的间隔衰落的效果。
在创建这样的效果时,LED可以以两种方式与Arduino通道接口 - 通道可以用作电流源或电流宿。在任何一种情况下,正向电压都需要改变。如果LED与信道(使得信道用作电流源),则当通过整数步骤增加所施加的PWM信号的占空比时,LED将逐渐亮起。然后,LED将逐渐消失,当通过整数步骤减小所施加的PWM信号的占空比时。
相反,当LED与通道连接时,通道就充当了电流接收器。然而,以通道作为当前接收器的方式接口LED有一个缺点。在这种情况下,LED将开始照明,只有当PWM信号接近一个电压,大于LED的正向电压。
这意味着当LED与通道接口时,可以最好地观察到LED的衰落效果,即PWM通道作为LED的电流源。在这种情况下,LED将始终保持在VI曲线的前偏区域。
编程指南
为了产生LED衰落的效果,需要产生近似整流正弦波的PWM信号。
的计数器变量一世的int类型被定义为全局变量。在里面设置()功能,销5通常设置为输出。但是,这是不必要的,因为使用AmplwWrite()函数将使用频道作为PWM源。来自Arduino UNO的引脚5产生980 Hz频率的PWM信号。
在loop()函数中,会运行一个for循环,其中变量i被用作计数器,以便一世初始化为0,并在每一步中增加1,直到小于256。analogWrite()函数用于在引脚5处产生占空比为的PWM信号一世。
delay()函数以20毫秒作为参数在每个循环中使用,这样PWM脉冲序列在每个占空比周期中保持活跃的时间间隔为20毫秒。由于引脚5产生频率为980hz的PWM信号,每个占空比约有19 ~ 20个PWM脉冲被应用到LED上。当占空比以20毫秒的间隔增加时,LED在5.1秒内逐渐发光,达到充分照明,需要255个步骤。
在退出第一个循环之后,立即运行另一个循环,其中计数器值被初始化为255并在每个步骤中减少一个 - 直到它大于0.在引脚5上产生PWM信号,如上所述对于循环,但随着20毫秒的间隔减小每个步骤中的占空比。因此,LED逐渐消失至5.1秒和255步的照明。
函数的作用是:进行无限次的迭代。因此,LED持续照明和衰落交替,就像一个整流正弦波被应用到它。
在里面下一个教程,我们将在使用Arduino时讨论模拟输入。
演示视频:
Arduino素描:
了下:Arduino那特色的贡献