整体代码:
from machine import Timer,PWM
import time
tim_1 = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
tim_2 = Timer(Timer.TIMER0, Timer.CHANNEL1, mode=Timer.MODE_PWM)
tim_3 = Timer(Timer.TIMER0, Timer.CHANNEL2, mode=Timer.MODE_PWM)
ch_1 = PWM(tim_1, freq=500000, duty=50, pin=12)
ch_2 = PWM(tim_2, freq=500000, duty=50, pin=13)
ch_3 = PWM(tim_3, freq=500000, duty=50, pin=14)
duty_1=0
duty_2=50
duty_3=100
dir_1 = 1
dir_2 = 1
dir_3 = 1
while(True):
if(dir_1==1):
duty_1 += 10
if(duty_1>100):
duty_1 = 100
dir_1 = 0
else:
duty_1 -= 10
if(duty_1<0):
duty_1 = 0
dir_1 = 1
if(dir_2==1):
duty_2 += 10
if(duty_2>100):
duty_2 = 100
dir_2 = 0
else:
duty_2 -= 10
if(duty_2<0):
duty_2 = 0
dir_2 = 1
if(dir_3==1):
duty_3 += 10
if(duty_3>100):
duty_3 = 100
dir_3 = 0
else:
duty_3 -= 10
if(duty_3<0):
duty_3 = 0
dir_3 = 1
time.sleep(0.5)
ch_1.duty(duty_1)
ch_2.duty(duty_2)
ch_3.duty(duty_3)
效果展示:

逐句说明:
1.导入库函数
from machine import Timer,PWM
import time
2.创建定时器对象
tim_1 = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
tim_2 = Timer(Timer.TIMER0, Timer.CHANNEL1, mode=Timer.MODE_PWM)
tim_3 = Timer(Timer.TIMER0, Timer.CHANNEL2, mode=Timer.MODE_PWM)
tim = machine.Timer(id, channel, mode=Timer.MODE_ONE_SHOT, period=1000, unit=Timer.UNIT_MS, callback=None, arg=None, start=True, priority=1, div=0)
参数
id: Timer ID, [0~2] (Timer.TIMER0~TIMER2)channel: Timer 通道, [Timer.CHANNEL0~Timer.CHANNEL3]mode: Timer 模式,MODE_ONE_SHOT或者MODE_PERIODIC或者MODE_PWMperiod: Timer 周期, 在启动定时器后period时间, 回调函数将会被调用,(0,~)unit: 设置周期的单位,默认位毫秒(ms),Timer.UNIT_S或者Timer.UNIT_MS或者Timer.UNIT_US或者Timer.UNIT_NScallback: 定时器回调函数, 定义了两个参数, 一个是定时器对象Timer, 第二个是在定义对象是希望传的参数arg,更多请看arg参数解释
注意:回调函数是在中断中调用的,所以在回调函数中请不要占用太长时间以及做动态分配开关中断等动作
arg: 希望传给回调函数的参数,作为回调函数的第二个参数start: 是否在对象构建成功后立即开始定时器,True:立即开始,False:不立即开启,需要调用start()函数来启动定时器priority: 硬件定时器中断优先级, 与特定的CPU相关, 在K210中,取值范围是[1,7], 值越小优先级越高div: 硬件定时器分频器,取值范围[0,255], 默认为0, clk_timer(定时器时钟频率) = clk_pll0(锁相环0频率)/2^(div+1)
clk_timer*period(unit:s) 应该 < 2^32 并且 >=1
3.创建PWM对象
ch_1 = PWM(tim_1, freq=500000, duty=50, pin=12)
ch_2 = PWM(tim_2, freq=500000, duty=50, pin=13)
ch_3 = PWM(tim_3, freq=500000, duty=50, pin=14)
pwm = machine.PWM(tim, freq, duty, pin, enable=True)
参数
tim: 每个PWM依赖一个定时器来产生波形, 所以这里需要传一个定时器对象,这个定时器对象必须初始化时必须指定定时器 ID 和通道号freq: PWM 波形频率duty: PWM 占空比, 指高电平占整个周期的百分比,取值:[0,100][pin]: PWM 输出引脚。 可以不设置,而是使用 fm 统一管理引脚映射。enable: 是否立即开始产生波形,默认位True,及对象生成后立即开始在指定的引脚上产生 PWM 波形
4.设置对应通道PWM占空比
ch_1.duty(duty_1)
ch_2.duty(duty_2)
ch_3.duty(duty_3)
pwm.duty(duty)
参数
duty: PWM 占空比 可选, 如果不传参数则步设置只返回当前占空比值
返回值
当前设置的 PWM 占空比值
5.实现三个灯的顺序呼吸
duty_1=0
duty_2=50
duty_3=100
dir_1 = 1
dir_2 = 1
dir_3 = 1
while(True):
if(dir_1==1):
duty_1 += 10
if(duty_1>100):
duty_1 = 100
dir_1 = 0
else:
duty_1 -= 10
if(duty_1<0):
duty_1 = 0
dir_1 = 1
if(dir_2==1):
duty_2 += 10
if(duty_2>100):
duty_2 = 100
dir_2 = 0
else:
duty_2 -= 10
if(duty_2<0):
duty_2 = 0
dir_2 = 1
if(dir_3==1):
duty_3 += 10
if(duty_3>100):
duty_3 = 100
dir_3 = 0
else:
duty_3 -= 10
if(duty_3<0):
duty_3 = 0
dir_3 = 1
time.sleep(0.5)

1411

被折叠的 条评论
为什么被折叠?



