小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

!!單片機(jī),arduino,輸入引腳的問題

 quasiceo 2015-09-13

!!單片機(jī),arduino,輸入引腳的問題?

想通過按鍵開關(guān)得到一個(gè)信號(hào),然后控制一些別的東西
用的一段代碼的片段:
    pinMode(8,INPUT);
    digitalWrite(8,HIGH);
問題1:我把8號(hào)引腳定義為輸入引腳了,然后再把他定義為高電平,
總覺得我不是讓它輸入了嗎,再digitalWrite不就輸出了又,總覺得有點(diǎn)奇怪啊,
這個(gè)digitalWrite電氣上是怎樣的一個(gè)過程?
問題2:開關(guān)一頭接地,一頭接8號(hào)引腳,開關(guān)一按,8號(hào)引腳成功讀出了低電平;
如果反過來,8號(hào)引腳digitalWrite為LOW,然后通過開關(guān)給8號(hào)接入個(gè)高電平,
8號(hào)又成功讀出了高電平。。。
為什么這個(gè)輸入引腳本來自己是有電壓的(或高或低),卻又被輸入信號(hào)所決定?
貌似和問題一類似。read和write是怎么個(gè)過程?
按投票排序 按時(shí)間排序

6 個(gè)回答

況琪別關(guān)注溫兆倫了,沒啥干貨

楊彬彬、知乎用戶、知乎用戶 等人贊同
實(shí)名反對@李赧郎 和某匿名用戶拿STM32來講解Arduino。STM32的IO口結(jié)構(gòu)跟Arduino的AVR還是有區(qū)別的。根據(jù)STM32的數(shù)據(jù)手冊來學(xué)習(xí)AVR會(huì)造成誤導(dǎo)。引用@李赧郎 自己的一句話:
玩arduino的還是要老老實(shí)實(shí)的看單片機(jī)手冊、學(xué)習(xí)硬件原理的,不看手冊、不看原理上來就用自然會(huì)有問題。

首先要明確IO口的幾種常見模式。對于數(shù)字IO而言,常見的模式有:推挽輸出、開漏輸出、浮空輸入(高阻輸入)、上拉輸入、下拉輸入。STM32支持上述的所有模式,但很多單片機(jī)并不是支持上述所有模式。比如Arduino采用的AVR單片機(jī)就不支持開漏輸出和下拉輸入。

第 二要明確“輸入阻抗”和“輸出阻抗”的概念。例如當(dāng)IO口輸出一個(gè)高電平時(shí),IO口內(nèi)部并非像機(jī)械開關(guān)那樣把一根線直接插到了電源正極上,IO引腳和電源 正極之間其實(shí)還有電阻的存在。當(dāng)這個(gè)電阻很小的時(shí)候,我們稱之為“強(qiáng)”,當(dāng)這個(gè)電阻較大時(shí),我們稱之為“弱”。這個(gè)電阻的一端當(dāng)然接的是IO引腳,另一端 如果接到電源正極,則成為上拉電阻,如果接地,則稱為下拉電阻。

先說輸出模式。對于Arduino,用pinMode將IO口設(shè)為 OUTPUT的時(shí)候,其實(shí)IO的狀態(tài)為“強(qiáng)推挽”,也就是說設(shè)為高電平時(shí),IO口對電源正極的電阻比較?。◤?qiáng)上拉),設(shè)為低電平時(shí)IO口對地的電阻也比較 ?。◤?qiáng)下拉),這樣IO口就具備了較強(qiáng)的驅(qū)動(dòng)能力。其實(shí)也沒有強(qiáng)到哪里去,大概幾十毫安,能點(diǎn)亮LED而已。這里順便提一下常見的51單片機(jī),它的IO口 總是接通了一個(gè)上拉電阻,這個(gè)上電阻比較大,所以稱為弱上拉,所以51單片機(jī)的拉電流驅(qū)動(dòng)能力(IO引腳高電平時(shí)電流從IO引腳流向外部電路的能力)比較弱,大概只有5mA左右,這通常只能讓LED發(fā)出很微弱的光,所以51單片機(jī)IO口點(diǎn)亮LED的方式通常為灌電流(電流從外部電路流入IO引腳)。

再 說輸入模式。對于Arduino,用pinMode將IO口設(shè)為INPUT的時(shí)候,其實(shí)IO的狀態(tài)為浮空輸入,浮空輸入也稱高阻輸入,也就是說輸入阻抗非 常高。理想狀態(tài)下,可以認(rèn)為輸入阻抗是無窮大的,大到就像這個(gè)引腳斷路了一樣。就像一個(gè)浮在空中的金屬絲一樣,沒有連上任何電路,你讓它的電壓是多少,它 的電壓就是多少。這樣做是有意義的,因?yàn)橹挥休斎胱杩棺銐虼螅拍芙邮盏轿⑷醯男盘?hào)。如果輸入阻抗不夠大,比如輸入端跟地之間有一個(gè)1kΩ的電阻,那微弱 的輸入信號(hào)很可能就被直接拉到0V,檢測不出來了。但是浮空輸入并非在任何情況下都是最好的選擇,比如題主在接開關(guān)時(shí)。開關(guān)一頭接IO口,一頭接地。按下 時(shí)把IO口拉到0V,讀取,低電平,完全符合預(yù)期,贊!但是如果開關(guān)沒有按下,讀取,IO這時(shí)實(shí)際上沒有接到任何地方,處于浮空狀態(tài),IO口上其實(shí)沒有電 壓,或者說可能是任何的電壓,這時(shí)讀取IO口就會(huì)發(fā)現(xiàn)讀到的值是不一定的。有時(shí)高有時(shí)低,用手摸一下那個(gè)引腳,都會(huì)使得讀到的值抖動(dòng),傻眼了,咋辦?

這 時(shí)就需要上拉電阻來救場了,準(zhǔn)確地說是弱上拉。Arduino的AVR單片機(jī)內(nèi)置了上拉電阻,只要通過程序打開就可以,開啟上拉電阻后,IO口會(huì)通過一個(gè) 比較大的電阻(比如100kΩ)接到電源正極,盡管是比較大的電阻,但這個(gè)電阻仍然遠(yuǎn)遠(yuǎn)小于IO口浮空的輸入阻抗,所以這個(gè)電阻就可以在IO口沒有外部輸 入時(shí)把IO口的電平可靠維持在一個(gè)比較高的水平,讀出的也都是高電平了。

這個(gè)時(shí)候就可以回答題主的問題了。

問題1問的是 為什么可以對一個(gè)輸入引腳執(zhí)行write操作。答案就是,當(dāng)對一個(gè)已經(jīng)設(shè)定為輸入狀態(tài)的IO口digitalWrite為HIGH時(shí),就會(huì)啟動(dòng)這個(gè)引腳的 上拉電阻。沒有為什么,Arduino在實(shí)現(xiàn)digitalWrite這個(gè)函數(shù)時(shí)就是這么寫的。很扯淡對吧?這其實(shí)是一個(gè)歷史遺留問題,Arduino在 早期的版本中并未封裝對上拉電阻的操作,在那個(gè)時(shí)候,你的這種開關(guān)電路只能在外部連接一個(gè)上拉電阻。在Arduino 1.0之后,才在其庫中支持了上拉電阻。其實(shí)更好的方法是修改pinMode函數(shù)的實(shí)現(xiàn),將INPUT分為INPUT_FLOATING和 INPUT_PULLUP。但這就意味著之前所有玩家們開發(fā)的代碼都需要修改后才能運(yùn)行,于是Arduino就想出了這么一個(gè)歪招,用 digitalWrite實(shí)現(xiàn)了上拉。需要注意的是,AVR不具備內(nèi)置的下拉電阻,所以對已經(jīng)設(shè)為INPUT的引腳digitalWrite為LOW,是 沒有任何效果的。

問題2是為什么可以對一個(gè)已經(jīng)有電壓的引腳再接入別的電壓,從而改變其電壓,而不會(huì)造成短路。答案就是4個(gè)字——“輸出阻抗”。剛 才說了在輸入引腳上的上拉電阻是個(gè)弱上拉,所以當(dāng)你把弱上拉到高電平的引腳接地時(shí),就相當(dāng)于把電源正極和地之間連接了一個(gè)很大的電阻(例如100kΩ), 假設(shè)弱上拉電阻是100kΩ,根據(jù)歐姆定律,只有50μA的電流從中通過,完全不會(huì)帶來傷害。但是如果你把設(shè)為輸出狀態(tài)的引腳設(shè)為高電平后再接地,情況就 很不一樣了。由于輸出高電平時(shí)是強(qiáng)上拉的,直接接地的電流可能在50mA以上,超過了輸入狀態(tài)接地電流的1000倍。這其實(shí)就是所謂的短路了,所以一定不 要這樣做,一個(gè)引腳長時(shí)間短路是可能造成這個(gè)引腳甚至整個(gè)單片機(jī)損壞的。

其實(shí)我認(rèn)為這個(gè)題目并不需要貼圖解釋,因?yàn)锳rduino本身的設(shè)計(jì)初衷就是避免用戶接觸IO口內(nèi)部結(jié)構(gòu)這種底層細(xì)節(jié)。但是為了糾正其他知友的錯(cuò)誤,我還是從真正的AVR數(shù)據(jù)手冊里截了一張簡化版的IO口等效電路圖,其中的Rpu就是那個(gè)傳說中的上拉電阻。


說完了,可以點(diǎn)贊了。

李赧郎,玩航模,做電路

木雷、知乎用戶、知乎用戶 等人贊同
我拿STM32的管腳結(jié)構(gòu)圖改改示意一下,都差不多的。
能看到輸入和輸出是2條線,我打紅圈的就是你模式控制的開光,上下開光是互斥的,一個(gè)打開另一個(gè)就關(guān)閉。
所以當(dāng)你選擇輸入時(shí),上面的線路就打開,外面的信號(hào)就可以通過TTL肖特基觸發(fā)器進(jìn)入單片機(jī)內(nèi)部的輸入數(shù)據(jù)寄存器,然后被你的程序判斷是高還是低。
此時(shí),你寫digitalWrite(8,HIGH);,只是把一個(gè)高電壓寫到了輸出數(shù)據(jù)寄存器,因?yàn)檩敵隹刂剖顷P(guān)閉的,信號(hào)沒有輸出出去,所以不會(huì)和輸入信號(hào)沖突。

另一種情況,如果管腳是輸出模式,圖中的P-mos或N-mos就要打開了,這時(shí)你如果強(qiáng)制管腳到一個(gè)不對的電壓上是會(huì)損壞管腳的。比如管腳輸出低,但被強(qiáng)行接到電源上。所以輸入腳都一般穿個(gè)電阻來限流。


玩arduino的還是要老老實(shí)實(shí)的看單片機(jī)手冊、學(xué)習(xí)硬件原理的,不看手冊、不看原理上來就用自然會(huì)有問題。

喻時(shí)耕宇,滿懷夢想的 嵌入式普及者

從效果角度
pinMode(8,INPUT);
digitalWrite(8,HIGH);
和 pinMode(8,INPUT_PULLUP);
效果完全一樣。
詳情可見 arduino安裝目錄下\arduino-1.0.5-r2\hardware\arduino\cores\arduino\wiring_digital.c
其他參考況琪的答案。

知乎用戶,澳洲 EE 互聯(lián)網(wǎng)freelancer

知乎用戶、知乎用戶 贊同
個(gè)人認(rèn)為多讀Arduino Language Reference很有幫助。

digitalWrite() /en/Reference

Description
Write a HIGH or a LOW value to a digital pin.

If the pin has been configured as an OUTPUT with pinMode(), its voltage will be set to the corresponding value: 5V (or 3.3V on 3.3V boards) for HIGH, 0V (ground) for LOW.

如果引腳被設(shè)置為INPUT,digitalWrite()會(huì)激活輸入引腳的上拉電阻。
If the pin is configured as an INPUT, digitalWrite() will enable (HIGH) or disable (LOW) the internal pullup on the input pin. It is recommended to set the pinMode() to INPUT_PULLUP to enable the internal pull-up resistor. See the digital pins tutorial for more information.
激活上拉電阻的重要應(yīng)用之一便是檢測開關(guān)是否按下。開關(guān)兩端接pin和GND。當(dāng)開關(guān)閉合時(shí),digitalRead()==LOW。當(dāng)開關(guān)斷開時(shí),無電流通過上拉電阻,無壓降,digitalRead()==HIGH。

原理圖如圖片下半部分所示,debouncing capacitor用于減少虛碰造成的波動(dòng)。因?yàn)锳Tmega芯片內(nèi)置上拉電阻,實(shí)際接線按照上半部分接即可,省時(shí)省力。

為什么要上拉呢?如果不上拉,開關(guān)斷開時(shí)pin處于懸空狀態(tài)(i.e. tristate)。digitalRead()無法準(zhǔn)確反映開關(guān)的狀態(tài)。

如 果沒有將pinMode() 設(shè)置為OUTPUT,然后將一個(gè)LED連接至pin。當(dāng)調(diào)用digitalWrite(HIGH)時(shí),LED會(huì)很暗淡。因?yàn)槿绻麤]有明確的設(shè)置 pinMode(),digitalWrite()將默認(rèn)啟用內(nèi)部上拉電阻,這個(gè)電阻有很強(qiáng)的限流作用。
NOTE: If you do not set the pinMode() to OUTPUT, and connect an LED to a pin, when calling digitalWrite(HIGH), the LED may appear dim. Without explicitly setting pinMode(), digitalWrite() will have enabled the internal pull-up resistor, which acts like a large current-limiting resistor.

ATmega General Digital I/O 原理圖


附上期末復(fù)習(xí)時(shí)整理的筆記,暫且不翻譯了。

PORTx
  • A register that stores data that is available at the physical pin. Stores data on WPx rising edge.
  • This register can be both written to and read from. Outputs to the data bus if RRx is enabled (you can use it to check what is already there)
  • The register (all 8bits) are referred to as PORTx if referring to a particular bit you refer to it as PORTxn where x is the register, n is the bit.
  • AVR uses the most significant bit as the highest bit (0x80 is the MSB, 0x01 is the LSB)
DDRx
  • Data Direction Register x
  • A register that stores whether the output register (PORTx) is available on the physical pin. Stored when there is a rising edge on WDx
  • Connected to the tri-state buffer at the output of PORTx.
  • This register can be written and readfrom (you can use it to check what is already there). Available on data bus when RDx is enabled
Metastability
  • If the clock edge and the data edge occurs at the same time then a race condition occurs.
  • It will remain in this state until noise knocks it out of that state.
  • The time it is in the metastable state varies but takes on a probabilistic curve.
PINx
  • Diodes ensure that voltage on the pin are not 1 diode drop higher than VCC or 1 diode drop lower than GND
  • Rpu is between 20k and 50k ohms

What is the main use of the 2 stage synchronizer connected to each I/O pin?

  • Two registers. If metastability occurs, it occurs at the first register.
  • By the time it arrives at the next register PINx, it should be stable.
  • There is a two I/O clock cycle delay before data arrives at the data bus.
  • When RPx is enabled the state at PINx is available on the bus.

夏宇航,求大四嵌入式硬件開發(fā)實(shí)習(xí)cortex-m arduino

arduino設(shè)置成input之后在設(shè)置成高相當(dāng)于上拉電阻

匿名用戶

Aero 贊同
手機(jī)黨,盜圖一下,你先設(shè)置為輸入模式,再寫write,等于圖 的上拉電阻的開關(guān)合上,使整個(gè)輸入變?yōu)? 上拉輸入。但他是一個(gè)弱上拉,即上拉電阻的阻抗很大,所以IO口外面接一個(gè)下拉電阻再接地后,是依然能檢測到低電平的。比如IO內(nèi)部的上拉電阻10M,外 接開關(guān)的下拉電阻10K,檢測到電平:3.3/(1000000+10000)*10000約=0V.
內(nèi)部設(shè)為下拉輸入(你所說的LOW),再接一個(gè)高電平,同理。

· 作者保留權(quán)利

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多