Arduino中国 | Flamingo EDA

Sep/07

3

Arduino教程四: 模拟输出

就像模拟输入一样,在现实的物理世界中我们经常需要输出除了0和1之外的其他数值。例如,除了想用微控制器找开或者关闭电灯之外,我们还会想控制灯光的亮度,这时就需要用到模拟输出。由于Arduino的微控制器只能产生高电压(5V)或者低电压(0V),而不能产生变化的电压,因此必须采用脉宽度调制技术(PWM,Pulse Width Modulation)来模仿模拟电压。

PWM是一种开关式稳压电源应用,它是借助微处理器的数字输出来对模拟电路进行控制的一种非常用效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。简而言之,PWM是一种对模拟信号电平进行数字编码的方法,它通过对半导体开关器件的导通和关断进行控制,使输出端得到一系列幅值相等但宽度不相等的脉冲,而这些脉冲能够被用来代替正弦波或其它所需要的波形。

在Arduino数字I/O管脚9、10和11上,我们可以通过analogWrite()函数来产生模拟输出。该函数有两个参数,其中第一个参数是要产生模拟信号的引脚(9、10或者11);第二个参数是用于产生模拟信号的脉冲宽度,取值范围是0到255。脉冲宽度的值取0可以产生0V的模拟电压,取255则可以产生5V的模拟电压。不难看出,脉冲宽度的取值变化1,产生的模拟电压将变化0.0196V(5/255 = 0.0196)。

本实验中我们将用模拟输出来调暗发光二极管(LED),由于正常情况下LED对电压的变化非常敏感,因此当脉冲宽度变化时人眼会感觉到LED实际上是在不断地熄灭和点亮,而不是逐渐变暗。解决这一问题可以采用滤波电路,它能使有用频率信号通过而同时抑制(或大大衰减)无用频率信号。实验中我们采用的是低通滤波器,它的原理非常简单,只需要一个电阻和一个电容,能够很好地过滤掉电路中超过某一频率的信号。

low_pass_filter.png

此处给出的电路并不能校平所有脉冲,它之所以被称为“低通滤波”是因为它只允许频率低于某个限度的脉冲通过,对于高于这个限度的脉冲则被平衡为伪模拟电压,滤波的频率范围由电阻器和电容器的比值决定。

实验中采用的电路原理如下:

tutorial_4_schematic.png

相应的代码为:


int potPin = 0;
int ledPin = 11;

byte bright_table[] = {  30,  30,  30,  40,  50,  60,  70,  80,  90, 100,
                        110, 120, 130, 140, 150, 160, 170, 180, 190, 200,
                        210, 220, 230, 240, 250, 250, 240, 230, 220, 210,
                        200, 190, 180, 170, 160, 150, 140, 130, 120, 110,
                        100,  90,  80,  70,  60,  50,  40,  30,  30,  30 };
int MAX = 50;
int count = 0;
int val = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  analogWrite(ledPin, bright_table[count]);
  count ++;
  if (count > MAX) {
    count = 0;
  }

  val = analogRead(potPin);
  val = val /4;
  delay(val);
}

该工程调用analogWrite()函数在数字I/O端口的11号管脚上模仿模拟输出,每产生一次输出后都设置了相应的延时,而延时的长度由模拟输入端口0号管脚上的电位器来决定。通过调整电位器的位置,我们可以观察到发光二极管逐渐变亮后再逐渐变暗的效果。

tutorial_4_circuit.jpg

No tags

2 comments

Leave a Reply

<<

>>