极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14393|回复: 10

关于内部上拉电阻的疑问

[复制链接]
发表于 2013-10-16 01:23:36 | 显示全部楼层 |阅读模式
本帖最后由 shenhaiyu 于 2013-10-16 01:26 编辑

之前看过坛子里有关芯片内部上垃电阻的教程:
http://www.geek-workshop.com/thread-2874-1-1.html

但是今天实验的时候,发现并不适用于UNO的模拟口。


如果把上面帖子中的开关从 Pin-2 改接到 Pin-A2,代码改写为如下:

  1. /*
  2. 作者:极客工坊
  3. 时间:2012年12月18日
  4. IDE版本号:1.0.1
  5. 发布地址:[url]www.geek-workshop.com[/url]
  6. 作用:使用单片机内部上拉实现按键功能
  7. */
  8. void setup ()
  9. {
  10.   pinMode(A2,INPUT_PULLUP);                 //将2号管脚设置为输入并且内部上拉模式
  11.   pinMode(12,OUTPUT);
  12. }

  13. void loop()
  14. {
  15.   int n =digitalRead(A2);                   //创建一个变量n,将4号数字口的状态采集出来赋值给他。
  16.   if (n==LOW)                             //判断n是否为低电平,如果是执行下面的语句,不是则跳过。
  17.   {

  18.     delay(1000);
  19.     digitalWrite(12,HIGH);
  20.     delay(5000);
  21.     digitalWrite(12,LOW);

  22. }
  23. }
复制代码



这样一点问题没有,可是如果把上面代码中的

  1. int n =digitalRead(A2);
复制代码



改为:

  1. int n =analogRead(A2);
  2. Serial.println(n);
复制代码



那么会发现串口中输出的n值始终在1017左右变化,根本无法达到LOW的电压要求,有高手知道这是怎么回事吗?
如何才能实现模拟口的内部上拉呢
回复

使用道具 举报

发表于 2013-10-16 09:35:22 | 显示全部楼层
开了上拉后,相当于把A2通过内部电阻连接到VCC了,当然读到的就是1024(或者1000左右的随机值)了
回复 支持 反对

使用道具 举报

发表于 2013-10-16 12:55:32 | 显示全部楼层
这是按钮没按下的值,说明 上拉起效果了
回复 支持 反对

使用道具 举报

发表于 2013-10-16 12:56:57 | 显示全部楼层
代码改为:

int n =analogRead(A2);
Serial.println(n);
if(n<50)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-17 15:51:09 | 显示全部楼层
飞翔的红猪 发表于 2013-10-16 09:35
开了上拉后,相当于把A2通过内部电阻连接到VCC了,当然读到的就是1024(或者1000左右的随机值)了

这么说的话就失去上拉的作用了,直接是5V高电位,还怎么通讯呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-17 15:52:00 | 显示全部楼层
yyy_zc 发表于 2013-10-16 12:56
代码改为:

int n =analogRead(A2);

什么意思?要延迟一下?还是要串口监视?
回复 支持 反对

使用道具 举报

发表于 2013-10-17 22:21:55 | 显示全部楼层
shenhaiyu 发表于 2013-10-17 15:52
什么意思?要延迟一下?还是要串口监视?

关键是模拟量了,需要 if(n<50) 而不是 if (n == low(0))
回复 支持 反对

使用道具 举报

发表于 2013-11-21 21:33:39 | 显示全部楼层
把A2当数字端口用,弄个上拉是没有问题的;但是把它当模拟端口用就不要弄上拉了,上拉会影响模拟量。尤其是进行AD转换的时候,千万不要在模拟量的端口加上拉!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-23 20:53:36 | 显示全部楼层
646097010 发表于 2013-11-21 21:33
把A2当数字端口用,弄个上拉是没有问题的;但是把它当模拟端口用就不要弄上拉了,上拉会影响模拟量。尤其是 ...

上拉是为了防止干扰,实际上就是把模拟口当数字口用,可是达不到效果啊
回复 支持 反对

使用道具 举报

发表于 2013-11-23 21:52:08 | 显示全部楼层

代码改为:

int n =analogRead(A2);
Serial.println(n);
if(n<50)

数字和模拟的转换而以
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-24 12:55:00 | 显示全部楼层
yyy_zc 发表于 2013-11-23 21:52
代码改为:

int n =analogRead(A2);

呃,好吧,只是还没有从根本上解决我的问题哦~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 08:54 , Processed in 0.035107 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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