第十九章 machine.PWM類實驗 1)實驗平臺:正點原子DNK210開發板 2)章節摘自【正點原子】DNK210使用指南 - CanMV版 V1.0 3)購買鏈接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套實驗源碼+手冊+視頻 ...
第十九章 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輸出的占空比減小導致的。