第五十七章 machine.PWM类实验本章将介绍machine模块中的PWM类。通过本章的学习读者将学习到machine模块中PWM类的使用。本章分为如下几个小节19.1 machine.PWM类介绍19.2 硬件设计19.3 程序设计19.4 运行验证19.1 machine.PWM类介绍machine.PWM类是machine模块内提供的类该类主要用于产生PWMPulse-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, freqNone, dutyNone, pin-1, enableTrue)通过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 timerTimer(Timer.TIMER0,Timer.CHANNEL0,MODE_PWM)pwmPWM(timer,freq500000,duty50,pinboard_info.LEDR,enableTrue)machine.PWM类为PWM对象提供了enable()方法用于开启PWM对象产生并输出PWMenable()方法如下所示PWM.enable()enable()方法用于开启PWM对象产生并输出PWM方法执行后Kendryte K210上指定的IO引脚并会输出特定频率和占空比的PWM。enable()方法的使用示例如下所示from board import board_info from machine import Timer from machine import PWM timerTimer(Timer.TIMER0,Timer.CHANNEL0,MODE_PWM)pwmPWM(timer,freq500000,duty50,pinboard_info.LEDR,enableFalse)pwm.enable()machine.PWM类为PWM对象提供了disable()方法用于轻质PWM对象产生并输出PWMdisable()方法如下所示PWM.disable()disable()方法用于停止PWM对象产生并输出PWM方法执行后Kendryte K210的特定IO引脚便会停止输出PWM。disable()方法的使用示例如下所示from board import board_info from machine import Timer from machine import PWM timerTimer(Timer.TIMER0,Timer.CHANNEL0,MODE_PWM)pwmPWM(timer,freq500000,duty50,pinboard_info.LEDR,enableTrue)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 timerTimer(Timer.TIMER0,Timer.CHANNEL0,MODE_PWM)pwmPWM(timer,freq500000,duty50,pinboard_info.LEDR,enableTrue)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 timerTimer(Timer.TIMER0,Timer.CHANNEL0,MODE_PWM)pwmPWM(timer,freq500000,duty50,pinboard_info.LEDR,enableTrue)pwm.duty(66)19.2 硬件设计19.2.1 例程功能创建一个PWM对象并创建一个PWM模式的Timer对象与之绑定按下KEY0按键后增加PWM对象输出PWM的占空比按下KEY1按键后减少PWM对象输出PWM的占空比19.2.2 硬件资源双色LEDLEDR - IO24独立按键KEY0按键 - IO18KEY1按键 - IO1919.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)key0GPIO(GPIO.GPIOHS0,GPIO.IN,GPIO.PULL_UP)key1GPIO(GPIO.GPIOHS1,GPIO.IN,GPIO.PULL_UP)timer0Timer(Timer.TIMER0,Timer.CHANNEL0,modeTimer.MODE_PWM)# 构造PWM对象 pwm0PWM(timer0,freq500000,duty50,pinboard_info.LEDR,enableTrue)duty50whileTrue:ifkey0.value()0:time.sleep_ms(20)ifkey0.value()0:dutyduty10whilekey0.value()0:pass elif key1.value()0:time.sleep_ms(20)ifkey1.value()0:dutyduty-10whilekey1.value()0:passifduty0:duty10elif duty110:duty100# 修改PWM占空比ifpwm0.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输出的占空比减小导致的。