定时器
定时器是嵌入式系统中最基本的功能之一,它除了可以实现定时器功能外,还能够实现延时、PWM输出、波形发生器、舵机控制、节拍器、周期唤醒、自动数据采集等功能。在MicroPython中,很多函数的功能也依赖定时器。
1.获取Timer类里面的方法:
>>> help(pyb.Timer) object <class 'Timer'> is of type type init -- <function> deinit -- <function> channel -- <function> counter -- <function> source_freq -- <function> freq -- <function> prescaler -- <function> period -- <function> callback -- <function> UP -- 0 DOWN -- 16 CENTER -- 32 PWM -- 0 PWM_INVERTED -- 1 OC_TIMING -- 2 OC_ACTIVE -- 3 OC_INACTIVE -- 4 OC_TOGGLE -- 5 OC_FORCED_ACTIVE -- 6 OC_FORCED_INACTIVE -- 7 IC -- 8 ENC_A -- 9 ENC_B -- 10 ENC_AB -- 11 HIGH -- 0 LOW -- 2 RISING -- 0 FALLING -- 2 BOTH -- 10 BRK_OFF -- 0 BRK_LOW -- 1 BRK_HIGH -- 2
定时器的使用方法是先导入Timer模块,然后定义定时器,设置定时器ID、频率、回调函数等参数。如:
>>> from pyb import Timer >>> tim = Timer(1,freq=100) #使用定时器1,频率100hz >>> tim = Timer(4,freq=200,callback=print('yes')) #使用定时器4,频率200hz,并设置回调函数 yes >>>
插入知识点:板载LED(3)和LED(4)分别是橙色的灯和蓝色的灯,它们两个都可以进行亮度调节,其它两个(LED(1)、LED(2))没有调节亮度功能,区别就在于LED(3)和LED(4)使用了定时器实现PWM调节亮度。LED(3)使用的是定时器2,LED(4)使用的是定时器3,所以在使用这两个灯的亮度调节功能时不可以再使用这两个定时器了,不然程序就会和预想的格格不入。
LED_YELLOW -- Pin(Pin.cpu.A15, mode=Pin.ALT, af=Pin.AF1_TIM2)
LED_BLUE -- Pin(Pin.cpu.B4, mode=Pin.ALT, af=Pin.AF2_TIM3)
Timer(n)
定义Timer,n=1~14。
class Timer - 控制内部定时器
定时器可用于各种任务。目前,只实现了最简单的情况:定期调用函数。
每个计时器都包含一个以特定速率计数的计数器。计数的速率是外设时钟频率(Hz)除以定时器预分频器。当计数器到达计时器周期时,它会触发一个事件,计数器将重置为零。通过使用回调方法,timer事件可以调用Python函数。
定时器的变化率 = 外设时钟频率(Hz) / 定时器预分频器
1.实例:使用固定频率(也就是定时时间)来翻转LED的状态
>>> time = pyb.Timer(4) #创建使用定时器4 >>> time.init(freq=2) #定时频率2Hz,也就是0.5秒计满 >>> time.callback(lambda t:pyb.LED(1).toggle())
freq参数就是用户自己想设定的时间,但是是以赫兹来表示:
>>> time = pyb.Timer(4) >>> time.init(freq=2) #定时2hz,也就是0.5s >>> time.callback(lambda t:pyb.LED(1).toggle()) >>> time.init(freq=10) #定时10hz,也就是0.1s >>> time.init(freq=0.1) #定时0.1hz,也就是10s
2.实例:定时器计满时,执行回调函数,回调函数的形参就是我们要实现功能的函数或者匿名函数。
>>> def tick(info): #该函数是用于定时器的回调函数的形参,所有用于回调函数的用户函数(def tick(info):)都必须要填一个定位参数 ... print('yes') ... ... ... >>> tim Timer(4, freq=0, prescaler=31249, period=26879, mode=UP, div=1) >>> tim.callback(tick) #回调函数的形参是用户函数或者匿名函数都必须有一个位置参数才可以正常工作(位置参数可能就是一个实例),而且调用时不用些括号 >>> yes yes yes yes
验证上面我们测试出来的又必须要的位置参数到底是什么个东西:
>>> def tick(t): ... print(t) ... ... ... >>> tim = pyb.Timer(4,freq=0.1) >>> tim.callback(tick) >>> Timer(4, freq=0, prescaler=31249, period=26879, mode=UP, div=1) Timer(4, freq=0, prescaler=31249, period=26879, mode=UP, div=1) Timer(4, freq=0, prescaler=31249, period=26879, mode=UP, div=1) Timer(4, freq=0, prescaler=31249, period=26879, mode=UP, div=1)
上面的代码中,我们建立了一个tick函数,该函数是用于定时器中的回调函数的功能函数,我们上面测试时发现回调函数里面的形参必须是带一个形参的函数而且赋给回调函数时还必须是直接是函数名不能带括号。而我们定义的tick函数里面的功能是打印tick(t)里面的t值,很明显t必须是被赋值才有打印值,实验得出是这个值为:Timer(4, freq=0, prescaler=31249, period=26879, mode=UP, div=1)。这个值正