簡 介: 本文給出了 MicroPython內核開發筆記:書內嵌入實驗任務 中的關於單片機端口軟件用例部分內容。
關鍵詞
:輸入輸出,MicroPython,Pin,MM32F3277
軟件用例: PIN模塊提供的基本端口輸入輸出功能。
這部分書稿內容包括有:
- 輸出實驗:
- 輸入實驗:
- 書稿內比特置:
利用模塊 Pin 可以將單片機的 IO 端口配置成輸入、輸出、附加功能等模式。基本使用語法為:
led = Pin('PB2', mode=Pin.OUT_PUSHPULL)
上面語句將單片機 PB2 管腳配置成推挽輸出管腳,並定義為變量 led 。其中 Pin 的第一個參數為單片機管腳命名字符串,第二個參數為管腳模式。可以使用的管腳輸出模式包括:
【錶1-1 管腳模式一欄錶格】設置輸出管腳高低電平有以下幾種方法,以 led 端口為例。
讀取端口邏輯電平的方法有以下幾種,以 led 端口為例。
key = Pin("PC1", Pin.IN_PULLUP)
print(key.value())
print(key())
單片機的 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。 管腳輸出包括兩種模式:
采用輸出電流驅動LED,只能選擇 PUSHPULL模式;采用輸入電流驅動LED,則上述兩種模式都是可以使用的。
請注意,在這個軟件例子中,編寫了 delay 實現軟件延時。在本書後面,將會介紹內部定時器模塊 time,將來 delay 子程序可以使用 time 模塊中的 sleep 相關函數替代。
▲ 圖1.1.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分別點亮
選取單片機 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的狀態
單片機 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 直接修改,可以提高程序的執行效率。
■ 相關文獻鏈接:
● 相關圖錶鏈接: