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

MicroPython內核開發筆記書內軟件用例 :Timer相關實驗

編輯:Python

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

關鍵詞TimerMM32F3277MicroPython

書稿內容 目 錄
Contents
基礎實驗 初始化Timer ONE_SHOT功能 周期信號采集 總 結

 

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

 

§01書稿內容


在嵌入式應用開發需要考慮到軟件執行的時間精確性,比如按照精確的周期執行某種操作,或者在確定的時間點完成某項任務。雖然可以借助於 time 的延遲功能完成相應的工作,但軟件在延時過程中處在休眠狀態,無法執行其他任務,所以軟件運行效率大大降低了。 使用 定時器 Timer 的時間中斷功能,既能保證時間的精確性,同時也不會降低軟件的執行效率。

在 MM32F3277 的 MicroPython 中存在兩個 Timer 可以被使用。下面通過代碼展示 Timer 的基本應用方法。

一、基礎實驗

1、初始化Timer

下面代碼給出了 Timer 的初始化過程。 軟件中定義了一個函數 to_callback(self) ,它是 Timer 定時中斷服務函數,示例程序的中斷服務函數功能比較簡單,就是改變 LED 管腳的狀態。

初始化 Timer 需要四個參數:

  • Timer 通道:可以去0,1;
  • 工作模式:PERIODIC 或者 ONE_SHOT;
  • 中斷程序:預先定義好的中斷程序;
  • 定時周期:定時器周期時間長度,單位 ms;
from machine import Pin,Timer
import time
led = Pin('PA1', Pin.OUT_PUSHPULL)
def t0_callback(self):
led(1-led())
t0 = Timer(1, mode=Timer.PERIODIC, callback=t0_callback, period=200)
print(t0)
dir(t0)
while True:
pass

上述程序執行後,在 NANO_F3270 核心板上的 LED 以周期為 200 ms 改變其自身狀態。

▲ 圖1.1.1 實驗核心板上紅色LED改變自身狀態

通過 print, dir 兩個指令顯示了定時器屬性以及可以使用的函數。下面是程序輸出的信息:

Timer(channel=1, mode=PERIODIC, period=200ms)
['__del__', 'ONE_SHOT', 'PERIODIC', 'deinit', 'init']

2、ONE_SHOT功能

當 Timer 的模式設置為 ONE_SHOT後, Timer 只完成一次定時中斷,之後並停止運行。如果重新啟動定時器,可以使用 init 函數來完成。

下面代碼是在前面實驗代碼的基礎上,將 Timer 的工作模式修改成 ONE_SHOT。 在主循環中, 設置 LED 狀態為點亮,然後啟動定時器。 定時器在 100 ms之後進入中斷程序,將 LED 關閉。因此程序執行效果是 LED 以500ms 為周期進行閃爍, 點亮時間為 100ms。

from machine import Pin,Timer
import time
led = Pin('PA1', Pin.OUT_PUSHPULL)
def t0_callback(self):
led(1-led())
t0 = Timer(1, mode=Timer.ONE_SHOT, callback=t0_callback, period=100)
while True:
time.sleep_ms(500)
led.low()
t0.init(mode=Timer.ONE_SHOT, callback=t0_callback, period=100)
pass

二、周期信號采集

如果需要周期完成某項操作,相比於利用 time 軟件延遲,利用定時器可以保證周期更加精確。 下面利用定時器中斷完成模擬信號的采集與輸出。 使用 ADC 0 通道(對應PA0)采集信號,使用DAC 0 通道(對應 PA4)輸出采集到的模擬信號。采集的周期為 1ms 。

from machine import Pin,Timer,DAC,ADC
import time
led = Pin('PB2', Pin.OUT_PUSHPULL)
adc = ADC(0, init=True)
dac = DAC(0)
dac.write_u16(0x8000)
def t0_callback(self):
dac.write_u16(adc.read_u16())
led(1-led())
t0 = Timer(1, mode=Timer.PERIODIC, callback=t0_callback, period=1)
while True:
pass

在 PA0 輸入幅值為 1V,零點為1.5V, 100Hz 的正弦波。 程序執行後,在PA4(DAC0)管腳可以測量到 DAC的輸出信號。 相比 第十章 通過 軟件延時進行信號采集的效果,利用定時器中斷采集信號可以精確實現 1 ms 進行信號采集一次。

▲ 圖1.2.1 Timer中完成信號的采集與輸出

 

※ 總 結 ※


本文給出了 MicroPython內核開發筆記:書內嵌入實驗任務 中的 Timer 軟件用例部分內容。


■ 相關文獻鏈接:

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

● 相關圖表鏈接:

  • 圖1.1.1 實驗核心板上紅色LED改變自身狀態
  • 圖1.2.1 Timer中完成信號的采集與輸出

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