极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 52400|回复: 48

Arduino入门教程--第六课--电位器PWM控制LED亮度

  [复制链接]
发表于 2012-6-5 13:20:56 | 显示全部楼层 |阅读模式
线性电位器是一个模拟量的电子元器件,模拟量和数字量有什么区别呢?简单的说,数字量只有0和1两种状态,对应的就是开和关,高电平和低电平。而模拟量则不一样,他的数据状态呈现线性状态例如1到1000。
所以,本次试验我们采用电位器对LED调光,这样不会像上一次按钮实验那样,亮度的变化有层级的跳跃,用电位器调光的话能够比较连贯柔和。

元器件列表:


ocrobot mango控制板(Arduino兼容)  一块  
面包板  一块  
面包板专用跳线  一盒  
220欧姆电阻  一个  
100Ω-10kΩ线性电位器  一个  
任意颜色LED  一个  
USB数据线  一条  

下面我们来看电路连接图













arduino 电位器 PWM 电路图

arduino 电位器 PWM  电路图


我们看到我们将电位器接入了arduino控制板的A0模拟量检测口,arduino的模拟接口能够测量0-5V的电压,对应的返回值为0-1024,对电压变化的测量精度相对较高。

然后我们参照电路图来搭建实验电路


arduino 电位器 PWM

arduino 电位器 PWM


注意:本次试验我们使用的是精密线性电位器,电位器最好选用绕线的精密线性电位器,因为市面上的廉价的非线性电位器做这种实验时,数值漂移大,容易造成led闪烁,电阻成非线性变化,亮度变化不明显,容易产生和按钮调光实验那种层级感,影响试验效果。

然后我们将实验源代码编译下载到mango控制板中:
  1. /*
  2. 作者:极客工坊
  3. 时间:2012年6月7日
  4. IDE版本号:1.0.1
  5. 发布地址:[url]www.geek-workshop.com[/url]
  6. 作用:通过精密线性电位器PWM控制led亮度
  7. */

  8. void setup()
  9. {
  10.   pinMode(11,OUTPUT);          //数字口要选择带#号的具有pwm功能的输出口
  11. }

  12. void loop()
  13. {
  14.   int n = analogRead(A0);     //读取A0模拟口的数值(0-5V 对应 0-1204取值)
  15.   analogWrite(11,n/4);         //PWM最大取值255  所以将模拟口的取值n除以4
  16. }
复制代码
以下是我们的实验视频, 在视频中看到led微微闪烁是因为摄影机的帧率,恰好耦合了led的频闪速率造成的。。肉眼看是无闪烁的



==========分割线 下面为扩展阅读==========

本次实验所用到的语法请点击关键字进入极客工坊WIKI查看,词条内容在WIKI中不定期更新。
void
setup()
loop()
pinMode()
analogWrite()
analogRead()
int
回复

使用道具 举报

发表于 2016-6-19 17:06:38 | 显示全部楼层
<一一巛 发表于 2013-3-4 12:42
交作业
int n=0;
void setup() {   

PotBuffer = analogRead(Pot);                                 //读取AD值
  PotBuffer = map(PotBuffer, 0, 1023, 0, 255);        //把AD值0-1023 缩放为 0-255
直接用map映射
回复 支持 1 反对 0

使用道具 举报

发表于 2016-6-19 17:03:26 | 显示全部楼层
PotBuffer = analogRead(Pot);                                 //读取AD值
  PotBuffer = map(PotBuffer, 0, 1023, 0, 255);        //把AD值0-1023 缩放为 0-255
回复 支持 1 反对 0

使用道具 举报

发表于 2012-6-8 12:52:08 | 显示全部楼层
学习来了,程式真简洁
回复 支持 反对

使用道具 举报

发表于 2012-7-26 21:53:49 | 显示全部楼层
小白求教:

void setup()
{
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(A0,INPUT);
pinMode(A1,INPUT);

}
void loop()
{
int i = analogRead(A0);
analogWrite(9,i/4);  
int j = analogRead(A1);
analogWrite(10,j/4);
}
想控制两个灯,这样写为什么是两个等一起亮,我的本意是分别调的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-27 08:11:45 | 显示全部楼层
热火 发表于 2012-7-26 21:53
小白求教:

void setup()

电位器的红色线插5V 其他两根线一个插a0一个插a1这样就可以一个暗一个亮,不知道你的分别是什么意思,求详解
回复 支持 反对

使用道具 举报

发表于 2012-7-27 20:39:55 | 显示全部楼层
迷你强 发表于 2012-7-27 08:11
电位器的红色线插5V 其他两根线一个插a0一个插a1这样就可以一个暗一个亮,不知道你的分别是什么意思,求详 ...

你的意思是我的程序是没有问题的是吗。我是想用两个电位器来控制两个灯。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-27 21:13:03 | 显示全部楼层
热火 发表于 2012-7-27 20:39
你的意思是我的程序是没有问题的是吗。我是想用两个电位器来控制两个灯。


两个应该也没问题啊。。
回复 支持 反对

使用道具 举报

发表于 2012-9-7 09:40:47 | 显示全部楼层
请问迷你强老师,根据代码注解,这个A0模拟口(0-5V对应0-1204),那么是否表示除以4仍有可能超过PWM最大取值255?那么会损坏元器件么?
回复 支持 反对

使用道具 举报

发表于 2012-9-7 09:50:30 | 显示全部楼层
yuanlv77 发表于 2012-9-7 09:40
请问迷你强老师,根据代码注解,这个A0模拟口(0-5V对应0-1204),那么是否表示除以4仍有可能超过PWM最大取 ...

迷你强老师,貌似这A0模拟口1204和WIFI里写的有出入啊。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-7 20:57:55 | 显示全部楼层
yuanlv77 发表于 2012-9-7 09:50
迷你强老师,貌似这A0模拟口1204和WIFI里写的有出入啊。

应该是0-1023 这1024个值。。。这样就对了吧。。。我小白。。。。。
回复 支持 反对

使用道具 举报

发表于 2012-9-19 19:07:55 | 显示全部楼层
好东西,顶!
回复 支持 反对

使用道具 举报

高级模式  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2017-10-23 13:52 , Processed in 0.051824 second(s), 10 queries , File On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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