《DNK210使用指南 -CanMV版 V1.0》第十九章 machine.PWM類實驗

正点原子發表於2024-08-14

第十九章 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 例程功能

  1. 建立一個PWM物件,並建立一個PWM模式的Timer物件與之繫結
  2. 按下KEY0按鍵後增加PWM物件輸出PWM的佔空比
  3. 按下KEY1按鍵後減少PWM物件輸出PWM的佔空比

19.2.2 硬體資源

  1. 雙色LED
    LEDR - IO24
  2. 獨立按鍵
    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輸出的佔空比減小導致的。

相關文章