程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

MicroPython內核開發筆記書內軟件用例 :第五章-基本PIN輸入輸出功能

編輯:Python

簡 介: 本文給出了 MicroPython內核開發筆記:書內嵌入實驗任務 中的關於單片機端口軟件用例部分內容。

關鍵詞輸入輸出MicroPythonPinMM32F3277

書稿內容 目 錄
Contents
PIN輸出實驗 PIN輸入實驗 總 結 改進建議

 

  • 本書稿內容隸屬於 MicroPython內核開發筆記:書內嵌入實驗任務 中的內容。

軟件用例: PIN模塊提供的基本端口輸入輸出功能。
這部分書稿內容包括有:

  1. 輸出實驗:
  2. 輸入實驗:
  • 書稿內比特置:

 

§01書稿內容


利用模塊 Pin 可以將單片機的 IO 端口配置成輸入、輸出、附加功能等模式。基本使用語法為:

led = Pin('PB2', mode=Pin.OUT_PUSHPULL)

上面語句將單片機 PB2 管腳配置成推挽輸出管腳,並定義為變量 led 。其中 Pin 的第一個參數為單片機管腳命名字符串,第二個參數為管腳模式。可以使用的管腳輸出模式包括:

【錶1-1 管腳模式一欄錶格】

序號模式名稱功能描述1IN_ANALOG作為 AD 模擬量輸入端口2IN_FLOATING高阻輸入端口3IN_PULLDOWN帶有下拉電阻輸入端口4IN_PULLUP帶有上拉電阻輸入端口5OUT_OPENDRAIN漏極開路輸出端口6OUT_PUSHPULL推挽輸出端口7AF_OPENDRAIN漏極開路附加功能端口8AF_PUSHPULL推挽輸出附加功能端口

設置輸出管腳高低電平有以下幾種方法,以 led 端口為例。

  • 設置高電平:led(1),led.on(),led.value(1)
  • 設置低電平:led(0),led.off(),led.value(1)

讀取端口邏輯電平的方法有以下幾種,以 led 端口為例。

key = Pin("PC1", Pin.IN_PULLUP)
print(key.value())
print(key())

一、PIN輸出實驗

1、LED閃爍實驗

單片機的 IO 端口驅動外部 LED 有兩種模式:

  • 輸出電流驅動模式;
  • 輸入電流驅動模式;

在下面實驗中使用的是輸出電流驅動模式完成對外部LED驅動。

▲ 圖1.1.1 單片機驅動LED兩種模式
左:輸出電流驅動模式;右:輸入電流驅動模式

利用 Pin 控制單片機管腳高低電平,驅動外部 LED 閃爍。實驗硬件平臺是簡易實驗板,其中 PB2 連接外部 LED。 高電平點亮,低電平熄滅。

實驗軟件代碼如下:

from machine import Pin
def delay(loop=10000):
for _ in range(loop):
pass
led = Pin('PB2', mode=Pin.OUT_PUSHPULL)
print('Test LED.')
while True:
led(1)
delay(50000)
led(0)
delay(50000)

軟件中,首先將 PB2 定義成 輸出管腳,模式為推挽輸出。當它為高電平時,可以輸出電流點亮LED。 管腳輸出包括兩種模式:

  • OUT_PUSHPULL:推挽模式;
  • OUT_OPENDRAIN:漏極開路模式;

采用輸出電流驅動LED,只能選擇 PUSHPULL模式;采用輸入電流驅動LED,則上述兩種模式都是可以使用的。

請注意,在這個軟件例子中,編寫了 delay 實現軟件延時。在本書後面,將會介紹內部定時器模塊 time,將來 delay 子程序可以使用 time 模塊中的 sleep 相關函數替代。

▲ 圖1.1.2 LED閃爍運行情況

2、單個管腳控制兩個LED

這個實驗的目的是展示單片機輸出管腳配置成兩種不同的輸出模式(推挽模式和漏極開路模式)的區別。單片機輸出管腳為低電平時,兩種模式都可以從外部吸收電流;單片機輸出管腳為高電平是,推挽模式可以輸出電流,但漏極開路模式則相當於高阻狀態。

在特殊情況下,需要單片機 一個 IO 口可以同時獨立控制兩個 LED 的狀態。下面實驗就是利用 LED 的單向導電特性以及導通電壓閾值特性來實現單個 IO 口獨立控制兩個 LED 狀態。實驗電路原理圖如下:

▲ 圖1.1.3 單個IO口控制兩個LED實驗電路

電路中采用的兩個 LED 是白色或者藍色LED,它們點亮電壓都超過2.5V,所以單片機電壓 VCC=3.3V 不足以直接驅動兩個串聯的 LED 。當單片機輸出為高阻時,兩個 LED db 熄滅;當單片機管腳輸出為低電平時,LED1點亮;當單片機管腳輸出為高電平是,LED2點亮;當單片機管腳以較高頻率交替輸出高、低電平時,LED1、LED2 將會同時被點亮。

from machine import Pin
import time
led = Pin("PC0", mode=Pin.OUT_OPENDRAIN)
led(1)
ledstatus = 0
def ledout(status):
global led
if status == 0:
led = Pin("PC0", mode=Pin.OUT_OPENDRAIN)
led(1)
else:
led = Pin("PC0", mode=Pin.OUT_PUSHPULL)
if status == 1:
led(1)
elif status == 2:
led(0)
else:
led(1-led())
print("Test two LEDs.")
count = 0
while True:
ledout(ledstatus)
count += 1
if count >= 200:
count = 0
ledstatus += 1
if ledstatus >= 4: ledstatus = 0
time.sleep_ms(5)

在上述程序中,主循環程序使用了 time.sleep_ms 函數進行延遲,每隔 5ms 通過函數 ledout 改動 LED 控制端口 led 的設置和狀態。 在 ledout 函數中, 根據輸入 status 取值 0,1,2,3, 分別設置 led 為 高阻輸出、高電平、低電平以及狀態切換。

主循環內,每隔 1 秒鐘對 led 狀態在 0、1、2、3 之間進行切換,對於外部的兩個 LED 則分別處在 全滅、LED1 亮、LED2 亮、全點亮。

▲ 圖1.1.4 單個IO口控制兩個LED分別點亮

二、PIN輸入實驗

1、按鈕控制LED

選取單片機 PC1 設置為按鍵輸入端口,使用其狀態控制 LED 的點亮。

▲ 圖1.2.1 利用輸入端口控制LED狀態

實驗代碼如下:

from machine import Pin
led = Pin("PC0", Pin.OUT_PUSHPULL)
key = Pin("PC1", Pin.IN_PULLUP)
while True:
led(key())

直接使用輸入端口 key() 獲得輸入端口狀態, 將其取值改變 led 輸出的電平。由於輸入端口通過按鍵接地線,所以在初始化 key 的時候,使用的是帶有上拉電阻的輸入模式。

▲ 圖1.2.2 通過按鍵改變LED的狀態

2、輸入端口的電壓特性

單片機 MM32F3277 管腳作為 IO 輸入端口,輸入特性相當於一個比較器,比較器閾值為工作電壓的一半(3.3/2 = 1.65V)。當輸入電壓大於閾值時,輸入邏輯電平為1,當輸入電壓小於閾值時,輸入邏輯為 0 。

使用可編程數字直流電壓施加在單片機輸入端口 PC1, 仍舊運行上面按鍵程序,將 PC1 輸入邏輯電平通過 PC0 輸出。測量輸入端口電壓特性電路圖如下圖所示。

▲ 圖1.2.3 測試輸入端口電壓特性

使用萬用錶測量輸入電壓與輸出電平之間的關系,如下圖所示。 可以看到當輸入端口電壓大於1.65V時,輸出為高電平;小於1.65V時,輸出為低電平。

▲ 圖1.2.4 輸入電壓IN與輸出電壓

在本章實驗中安排輸入端口特性,是為在下一章 utime 實驗中,使用 Pin 的輸入特性來測量一些物理量做准備。

 

※ 總 結 ※


本文給出了 MicroPython內核開發筆記:書內嵌入實驗任務 中的關於單片機端口軟件用例部分內容。

一、改進建議

現在這個版本, 無法允許直接通過 Pin.mode 對 Pin的屬性進行修改。 比如:

led = Pin("PC0", mode=Pin.OUT_OPENDRAIN)

使用 led.mode = Pin.OUT_OPENDRAIN 則是非法的。

建議增加通過 led.mode 直接修改,可以提高程序的執行效率。


■ 相關文獻鏈接:

  • MicroPython內核開發筆記:書內嵌入實驗任務

● 相關圖錶鏈接:

  • 錶1-1 管腳模式一欄錶格
  • 圖1.1.1 單片機驅動LED兩種模式
    左:輸出電流驅動模式;右:輸入電流驅動模式
  • 圖1.1.2 LED閃爍運行情況
  • 圖1.1.3 單個IO口控制兩個LED實驗電路
  • 圖1.1.4 單個IO口控制兩個LED分別點亮
  • 圖1.2.1 利用輸入端口控制LED狀態
  • 圖1.2.2 通過按鍵改變LED的狀態
  • 圖1.2.3 測試輸入端口電壓特性
  • 圖1.2.4 輸入電壓IN與輸出電壓

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved