第十九章 machine.PWM類實驗
1)實驗平臺:正點原子DNK210開發板
2)章節摘自【正點原子】DNK210使用指南 - CanMV版 V1.0
3)購買連結:https://detail.tmall.com/item.htm?&id=782801398750
4)全套實驗原始碼+手冊+影片下載地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html
5)正點原子官方B站:https://space.bilibili.com/394620890
6)正點原子K210技術交流企鵝群:605557868
本章將介紹machine模組中的PWM類。透過本章的學習,讀者將學習到machine模組中PWM類的使用。
本章分為如下幾個小節:
19.1 machine.PWM類介紹
19.2 硬體設計
19.3 程式設計
19.4 執行驗證
19.1 machine.PWM類介紹
machine.PWM類是machine模組內提供的類,該類主要用於產生PWM(Pulse-width modulation,脈衝寬度調製),且能夠任意透過Kendryte K210上的47個自由IO進行輸出。每個PWM都依賴於一個Timer物件,且當Timer物件於PWM物件繫結後,Timer物件便不能再做為普通的定時器使用。因為Kendryte K210擁有3個硬體定時器,且每個硬體定時器有4個通道,因此使用machine.PWM類最大可以同時產生12路PWM。
machine.PWM提供了PWM建構函式,用於建立一個PWM物件,PWM建構函式如下所示:
class PWM(tim, freq=None, duty=None, pin=-1, enable=True)
透過PWM建構函式可以透過指定引數建立並初始化一個PWM物件。
tim指的是Timer物件,Timer物件可以透過machine.Timer類中的Timer建構函式進行構造。
freq指的是PWM的頻率。
duty指的是PWM佔空比,即一個PWM週期中高電平所佔時間的百分比。
pin指的是PWM的輸出引腳,也可以不設定,而是使用FPIOA管理器進行分配。
enable指的是是否在PWM物件構造成功後便開始產生並輸出PWM,當為True時,PWM物件會在被構造成功後便開始產生並輸出PWM,當為False時,PWM物件在被構造成功後並不會開始產生並輸出PWM。
PWM建構函式的使用示例如下所示:
from board import board_info
from machine import Timer
from machine import PWM
timer = Timer(Timer.TIMER0, Timer.CHANNEL0, MODE_PWM)
pwm = PWM(timer, freq=500000, duty=50, pin=board_info.LEDR, enable=True)
machine.PWM類為PWM物件提供了enable()方法,用於開啟PWM物件產生並輸出PWM,enable()方法如下所示:
PWM.enable()
enable()方法用於開啟PWM物件產生並輸出PWM,方法執行後,Kendryte K210上指定的IO引腳,並會輸出特定頻率和佔空比的PWM。
enable()方法的使用示例如下所示:
from board import board_info
from machine import Timer
from machine import PWM
timer = Timer(Timer.TIMER0, Timer.CHANNEL0, MODE_PWM)
pwm = PWM(timer, freq=500000, duty=50, pin=board_info.LEDR, enable=False)
pwm.enable()
machine.PWM類為PWM物件提供了disable()方法,用於輕質PWM物件產生並輸出PWM,disable()方法如下所示:
PWM.disable()
disable()方法用於停止PWM物件產生並輸出PWM,方法執行後,Kendryte K210的特定IO引腳便會停止輸出PWM。
disable()方法的使用示例如下所示:
from board import board_info
from machine import Timer
from machine import PWM
timer = Timer(Timer.TIMER0, Timer.CHANNEL0, MODE_PWM)
pwm = PWM(timer, freq=500000, duty=50, pin=board_info.LEDR, enable=True)
pwm.disable()
machine.PWM類為PWM物件提供了freq()方法,用於配置或獲取PWM物件產生的PWM的頻率,freq()方法如下所示:
PWM.freq(freq)
freq()方法用於配置或獲取PWM物件產生的PWM頻率。
freq指的是要配置的PWM頻率,PWM頻率的配置是即時生效的,或該引數為空,則freq()方法將返回當前PWM物件產生PWM的頻率。
freq()方法的使用示例如下所示:
from board import board_info
from machine import Timer
from machine import PWM
timer = Timer(Timer.TIMER0, Timer.CHANNEL0, MODE_PWM)
pwm = PWM(timer, freq=500000, duty=50, pin=board_info.LEDR, enable=True)
pwm.freq(100000)
machine.PWM類為PWM物件提供了duty()方法,用於配置或獲取PWM物件產生的PWM的佔空比,duty()方法如下所示:
PWM.duty(duty)
duty()方法用於配置或獲取PWM物件產生的PWM佔空比,這裡的佔空比指的是PWM高電平時間佔整個PWM週期的百分比。
duty指的是要配置的PWM佔空比,PWM佔空比的配置是即時生效的,或該引數為空,則duty()方法將返回當前PWM物件產生PWM的佔空比。
duty()方法的使用示例如下所示:
from board import board_info
from machine import Timer
from machine import PWM
timer = Timer(Timer.TIMER0, Timer.CHANNEL0, MODE_PWM)
pwm = PWM(timer, freq=500000, duty=50, pin=board_info.LEDR, enable=True)
pwm.duty(66)
19.2 硬體設計
19.2.1 例程功能
- 建立一個PWM物件,並建立一個PWM模式的Timer物件與之繫結
- 按下KEY0按鍵後增加PWM物件輸出PWM的佔空比
- 按下KEY1按鍵後減少PWM物件輸出PWM的佔空比
19.2.2 硬體資源
- 雙色LED
LEDR - IO24 - 獨立按鍵
KEY0按鍵 - IO18
KEY1按鍵 - IO19
19.2.3 原理圖
本章實驗內容,主要講解machine.PWM類的使用,無需關注原理圖。
19.3 程式設計
19.3.1 machine.PWM類
有關machine.PWM類的介紹,請見第19.1小節《machine.PWM類介紹》。
19.3.2 程式流程圖
圖19.3.2.1 machine.PWM類實驗流程圖
19.3.3 main.py程式碼
main.py中的指令碼程式碼如下所示:
from board import board_info
from fpioa_manager import fm
from maix import GPIO
import time
from machine import Timer
from machine import PWM
fm.register(board_info.KEY0, fm.fpioa.GPIOHS0)
fm.register(board_info.KEY1, fm.fpioa.GPIOHS1)
key0 = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_UP)
key1 = GPIO(GPIO.GPIOHS1, GPIO.IN, GPIO.PULL_UP)
timer0 = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
# 構造PWM物件
pwm0 = PWM(timer0, freq=500000, duty=50, pin=board_info.LEDR, enable=True)
duty = 50
while True:
if key0.value() == 0:
time.sleep_ms(20)
if key0.value() == 0:
duty = duty + 10
while key0.value() == 0:
pass
elif key1.value() == 0:
time.sleep_ms(20)
if key1.value() == 0:
duty = duty - 10
while key1.value() == 0:
pass
if duty == 0:
duty = 1
elif duty == 110:
duty = 100
# 修改PWM佔空比
if pwm0.duty() != duty:
pwm0.duty(duty)
time.sleep_ms(10)
可以看到,首先是初始化使用到獨立按鍵的IO,然後構造了一個PWM模式的Timer物件。
接下來構造了一個PWM物件,PWM物件的配置為從紅色LED連線的IO引腳輸出一個頻率為500KHz,佔空比為50%的PWM。
最後就是在一個迴圈中讀取按鍵的狀態,當讀取到KEY0按鍵被按下,則增加PWM輸出的佔空比,具體應表現為紅色LED的亮度減少,當讀取到KEY1按鍵被按下,則減少PWM輸出的佔空比,具體應表現為紅色LED的亮度增加。
19.4 執行驗證
將DNK210開發板連線CanMV IDE,並點選CanMV IDE上的“開始(執行指令碼)”按鈕後,此時,便可看到紅色LED處於半亮狀態,若按下KEY0按鍵,則可以看到紅色LED的亮度減小,這是因為PWM輸出的佔空比增加導致的,若按下KEY1按鍵,則可以看到紅色LED的亮度增加,這是因為PWM輸出的佔空比減小導致的。