Arduino基础教程:模拟输出

时间:12-08-19 栏目:Arduino 作者:JH单片机 评论:1 点击: 10,703 次



既然都有了模拟输入了,当然少不了模拟输出。还是那个例子,你总吃饭不拉怎么行呢?!开个玩笑,禁止想象!

但也正如你想象的,现实生活中可能会遇到要输出0和1之外的数值。有时候除了开灯,关灯之外,可能还需要调光,而调光也就是模拟的一种输出方式。

由于Arduino的微控制器只能产生高电平(5V)或者低电平(0V),而不能产生变化的电压,因此必须采用脉宽度调制技术(PWM,Pulse Width Modulation)来模拟电压变化。

PWM(PWM,Pulse Width Modulation)
利用微处是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
简而言之,PWM是一种对模拟信号电平进行数字编码的方法,它通过对半导体开关器件的导通和关断进行控制,使输出端得到一系列幅值相等但宽度不相等的脉冲,而这些脉冲能够被用来代替正弦波或其它所需要的波形。

以下引用一下别人的思路。学习一下。

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

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

电路原理图:

程序示例:

/*********************
Arduino test program
范例:模拟输出
site:www.jhmcu.com
**********************/
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号管脚上的电位器来决定。通过调整电位器的位置,我们可以观察到发光二极管逐渐变亮后再逐渐变暗的效果。

以上仅供学习参考用。

 
关于本文作者

爱数电,爱模电;爱单片机,爱嵌入式;爱EDA,也爱DSP; 爱Altium Designer,也爱PCB;爱生活,同时也爱微博…… 一个自动化专业的学生,与志同道合者学习交流!!!

QQ 号码:594420349
腾讯微博:http://t.qq.com/kevin_753

项目合作