MicroPython:Платы/WiPy/Руководства и примеры для работы с WiPy/Аппаратные таймеры

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Аппаратные таймеры[1]

Таймеры можно использовать для самых разных задач. Самые распространенные – это периодический вызов функций, подсчитывание событий и генерирование ШИМ-сигнала. Каждый таймер состоит из двух 16-битных каналов, и эти каналы могут быть привязаны друг к другу, чтобы сформировать один 32-битный таймер. Режим работы задается для каждого таймера по отдельности, но период (или частоту) можно настроить для каждого канала по отдельности. Кроме того, задав нужное событие, вы также можете вызвать Python-функцию как функцию обратного вызова.

Пример переключения светодиода с фиксированной частотой:

from machine import Timer
from machine import Pin
led = Pin('GP16', mode=Pin.OUT)        # делаем контакт GP16
                                       # выходным контактом
                                       # для управления светодиодом
tim = Timer(3)                         # создаем объект «Timer»
                                       # на базе таймера 3
tim.init(mode=Timer.PERIODIC)          # инициализируем его
                                       # в режиме периода
tim_ch = tim.channel(Timer.A, freq=5)  # настраиваем канал A 
                                       # на частоту 5 Гц
# переключаем светодиод с каждым циклом таймера:
tim_ch.irq(handler=lambda t:led.toggle(), trigger=Timer.TIMEOUT)

Пример использования именованной функции в качестве функции обратного вызова:

from machine import Timer
from machine import Pin
tim = Timer(1, mode=Timer.PERIODIC, width=32)
# частоте 1 Гц требуется 32-битный таймер
tim_a = tim.channel(Timer.A | Timer.B, freq=1)

# делаем контакт GP16 выходным для управления светодиодом:
led = Pin('GP16', mode=Pin.OUT) 

def tick(timer):      # при вызове этой функции
                      # мы будем принимать объект «Timer»
    global led
    led.toggle()      # переключаем светодиод

# создаем прерывание:
tim_a.irq(handler=tick, trigger=Timer.TIMEOUT)

Другие примеры:

from machine import Timer
# инициализируем таймер в режиме однократного срабатывания: 
tim1 = Timer(1, mode=Timer.ONE_SHOT)
# инициализируем таймер в режиме ШИМ:
tim2 = Timer(2, mode=Timer.PWM)
# запускаем счетчик событий с частотой 10 Гц,
# он будет срабатывать на передних фронтах сигнала:
tim1_ch = tim1.channel(Timer.A, freq=10, polarity=Timer.POSITIVE)
# запускаем ШИМ на канале B с коэффициентом заполнения 50%:
tim2_ch = tim2.channel(Timer.B, freq=10000, duty_cycle=5000)
# задаем частоту (этим методом ее также можно прочесть):
tim2_ch.freq(20)
# задаем коэффициент заполнения 30.1%
# (этим методом его также можно прочесть):
tim2_ch.duty_cycle(3010)
# задаем коэффициент заполнения 30.2% 
# и меняем полярность на отрицательную: 
tim2_ch.duty_cycle(3020, Timer.NEGATIVE)
# меняем период на 2 секунды:
tim2_ch.period(2000000)

Дополнительные константы для класса «Timer»

  • Timer.PWMШИМ-режим работы таймера.
  • Timer.A, Timer.B – канал таймера. При использовании 32-битного таймера их нужно задать вместе при помощи логического ИЛИ (Timer.A | Timer.B).
  • Timer.POSITIVE, Timer.NEGATIVE – полярность канала таймера (релевантно только для ШИМ-режима).
  • Timer.TIMEOUT, Timer.MATCH – триггеры прерывания на канале таймера.

См.также

Внешние ссылки