极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 35331|回复: 17

一个 digitalRead() 的问题,请问是不是板子坏了

[复制链接]
发表于 2013-5-15 23:43:20 | 显示全部楼层 |阅读模式
我读取 pin4 的值, 在 pin4 没有任何动作的情况下出现如下图的状况,
有时读取到的值是 1 , 不是应该一直都为 0 吗?
这是不是板子哪里出问题了?还是我出问题了?
确定 pin4 没有任何动作...

求解... 感恩谢

先贴代码, 再贴图
  1. int val;
  2. void setup(){
  3.   pinMode(4,INPUT);
  4.   Serial.begin(9600);
  5. }

  6. void loop(){
  7.   val = digitalRead(4);
  8.   Serial.println(val);
  9.   
  10. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-5-16 03:41:52 | 显示全部楼层
估计是电磁干扰
回复 支持 反对

使用道具 举报

发表于 2013-5-16 07:17:26 来自手机 | 显示全部楼层
估计是电源纹波干扰
回复 支持 反对

使用道具 举报

发表于 2013-5-16 07:41:04 | 显示全部楼层
你先赋一个值,再读试试,或接个10k的下拉电阻
回复 支持 反对

使用道具 举报

发表于 2013-5-16 08:25:13 | 显示全部楼层
pinMode(4,INPUT_PULLDOWN);或者INPUT_PULLUP
回复 支持 反对

使用道具 举报

发表于 2013-5-16 08:37:35 | 显示全部楼层
不懂电子的人或许经常会出现这样的问题。我说下 原因吧,这个芯片工艺决定的。AVR是CMOS芯片,CMOS芯片有个特点,作为输入口不能悬空,如果悬空内部就不知道你输入是高电平1,还是低电平0;
CMOSTTL多余输入端处理  
本文的讨论,可以使初学者能够清楚地了解在使用CMOS门电路和TTL门电路时多余输入时,应如何处理才能保证其电路的正常逻辑关系,从而保证电路的正常、稳定地工作。
一、COMS门电路  CMOS门电路一般是由MOS管构成,由于MOS管的栅极和其它各级间有绝缘层相隔,在直流状态下,栅极无电流,所以静态时栅极不取电流,输入电平与外接电阻无关。  MOS管在电路中是个压控元件,输入端信号易受外界干扰,不能悬空;
1、与门、与非门电路  多余输入端采用高电平,即可通过限流电阻接电源;
2、或门、或非门电路  多余输入端接低电平,即通过限流电阻接地;
二、TTL门电路  TTL门电路一般由晶体三极管电路构成,根据TTL电路的输入伏安特性可知,当输入电压小于阀值电压,即输入低电平时输入电流比较大,一般在几百微安左右;反之则小,一般在几十微安左右。由于输入电流的存在,如果TTL门电路数端串接有电阻,则会影响输入电压。  其输入阻抗特性为:当输入电阻较小时,输入电压很小,随外接电阻的增加,输入电平增大,当输入电阻大于1KΩ时,输入电平就变为阀值电压Uth即为高电平,这样及时输入端不接高电平,输入端电压也为高电平,影响了低电平的输入。 1、TTL与门、与非门电路(多种形式地接“高电平”)
a.将多余输入端接高电平,即通过限流电阻与电源相连接;
b.把多余的输入端悬空,相当于外接高电平(当外接电阻为大电阻时,其输入电压为高电平);
c.通过大电阻与地相接,相当于输入端外接高电平;  
d.与使用的输入端并联使用(TTL门电路的工作速度不高,信号源驱动能力较强);
2、TTL或门、或非门
a.接低电平;
b.接地;  
c.接小于1KΩ的电阻到地;  
总结:通过不同方式,与门、与非门接高电平,或门或非门接低电平。
回复 支持 反对

使用道具 举报

发表于 2013-5-16 08:43:43 | 显示全部楼层
正确的做法是
1、内部上拉  pinMode(4,INPUT_PULLUP);注意:5#有错误,Arduino没有内部下拉的。
2、外不上拉,就是接一个4.7K~100k的电阻到VCC(+);默认为高电平
3、外部下拉,就是接一个4.7K~100k的电阻到GND(-);默认为低电平

一般的实验用到这个的有:按键(类似开关的传感器)输入,外部中断
回复 支持 反对

使用道具 举报

发表于 2013-5-16 10:47:13 | 显示全部楼层
ATmega328P芯片内部有上拉功能
回复 支持 反对

使用道具 举报

发表于 2013-5-16 11:29:23 | 显示全部楼层
不好意思,我一直用maple的STM32
INPUT_PULLDOWN   INPUT_PULLUP都有
回复 支持 反对

使用道具 举报

发表于 2013-5-16 14:22:50 | 显示全部楼层
本帖最后由 TTTTTTT33 于 2013-5-16 14:28 编辑

是電磁干擾,改成這樣接就好了,讓它強制=0。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2013-5-16 17:09:18 | 显示全部楼层
电磁干扰, 比如微波, 还有就是板子的设计上,有些板子的设计比较符合电工学,有些板子改的ARDUINO的板子有问题,最后自身的电磁干扰导致管脚带电压, 你可以看看ARDUINO官方出的那个杂志(其实是书)里面提到了读取这些管脚的值(当然 这些空脚都是随机值) 书上是说 太空发进来的信号.哈哈
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-16 20:45:48 | 显示全部楼层
hdragon627 发表于 2013-5-16 07:41
你先赋一个值,再读试试,或接个10k的下拉电阻

感谢回答..  
加入外部下拉电阻 10k 後已经正常。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-16 20:47:03 | 显示全部楼层
xmdesign 发表于 2013-5-16 08:25
pinMode(4,INPUT_PULLDOWN);或者INPUT_PULLUP

感谢回答..
已经尝试使用 INPUT_PULLUP
也能解决问题, 只是加上之後变成 HIGH 了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-16 20:48:17 | 显示全部楼层
pgf017979 发表于 2013-5-16 08:43
正确的做法是
1、内部上拉  pinMode(4,INPUT_PULLUP);注意:5#有错误,Arduino没有内部下拉的。
2、外不上 ...

感谢回答得这麽详细
我会仔细拜读, 谢谢。

文内所提三种方式, 都已经测试过,都能解决问题, 谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-16 20:49:09 | 显示全部楼层
TTTTTTT33 发表于 2013-5-16 14:22
是電磁干擾,改成這樣接就好了,讓它強制=0。

谢谢 还带图说明
这个外部的下拉电阻已测试过,能解决问题, 谢谢。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 22:55 , Processed in 0.061519 second(s), 27 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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