MicroPython:Библиотеки/pyb/Класс Timer
Класс Timer – управление внутренними таймерами[1]
Таймеры используются для самых разных задач, но в данный момент для них реализован только один простой сценарий: периодический вызов функции.
Каждый таймер состоит из счетчика, ведущего отсчет при помощи заданной частоты. Частота отсчитывания – это тактовая частота таймера (в Гц), поделенная на значение в делителе частоты. Когда значение в счетчике достигает заданного порога (периода), это запускает событие, после чего счетчик сбрасывается до нуля. При помощи метода callback() можно задать Python-функцию, которая будет запускаться при срабатывании таймера.
Пример использования класса Timer для переключения светодиода с фиксированной частотой:
tim = pyb.Timer(4) # создаем объект Timer при помощи таймера 4
tim.init(freq=2) # переключаем светодиод с частотой 2 Гц
tim.callback(lambda t:pyb.LED(1).toggle())
Пример использования именованной функции в методе callback():
def tick(timer): # создаем функцию tick()
print(timer.counter()) # показываем текущее значение
# счетчика таймера
tim = pyb.Timer(4, freq=1) # создаем объект «tim»
# при помощи таймера 4;
# он будет срабатывать с частотой 1 Гц
tim.callback(tick) # задаем нашу функцию tick()
# как функцию обратного вызова
Другие примеры:
tim = pyb.Timer(4, freq=100) # частота в герцах
tim = pyb.Timer(4, prescaler=0, period=99)
tim.counter() # читаем значение счетчика
# (с помощью этого метода
# его также можно задать)
tim.prescaler(2) # задаем делитель частоты
# (с помощью этого метода
# его также можно прочесть)
tim.period(199) # задаем период
# (с помощью этого метода
# его также можно прочесть)
tim.callback(lambda t: ...) # задаем функцию обратного вызова
# для обновления прерываний
# («t» - это экземпляр «tim»)
tim.callback(None) # очищаем функцию обратного вызова
Примечание: Таймеры 2 и 3 используются, чтобы при помощи ШИМ задавать яркость светодиодов 3 и 4 соответственно. Но эти таймеры будут использоваться для ШИМ, только если яркость соответствующего светодиода задается в диапазоне между «1» и «254». Если функция яркости светодиодов не используется, то эти таймеры можно использовать для любых других целей. Аналогичным образом таймер 5 используется для управления сервоприводом, а таймер 6 – для синхронизированных чтения/записи АЦП/ЦАП. Поэтому рекомендуем использовать в своих программах другие таймеры.
Примечание: Во время работы функции обратного вызова (прерывания) память выделять нельзя, и в результате исключения, вызываемые внутри функций обратного вызова, будут малоинформативны. О том, как обойти это ограничение, читайте в описании функции micropython.alloc_emergency_exception_buf().
Конструкторы
Методы
- Timer.init(*, freq, prescaler, period, mode=Timer.UP, div=1, callback=None, deadtime=0)
- Timer.deinit()
- Timer.callback(fun)
- Timer.channel(channel, mode, ...)
- Timer.counter([value])
- Timer.freq([value])
- Timer.period([value])
- Timer.prescaler([value])
- Timer.source_freq()
• Timer.counter([value]) – задает или считывает значение счетчика таймера. • Timer.freq([value]) – задает или считывает частоту таймера (меняет значения в prescaler и period, если они заданы). • Timer.period([value]) – задает или считывает период таймера (period). • Timer.prescaler([value]) – задает или считывает предварительный делитель частоты таймера (prescaler). • Timer.source_freq() – задает исходную частоту таймера.
Класс TimerChannel – настройка канала для таймера
Таймерные каналы используются для генерирования/захвата сигнала при помощи таймера.
Объекты TimerChannel создаются при помощи метода Timer.channel().
Методы
- timerchannel.callback(fun)
- timerchannel.capture([value])
- timerchannel.compare([value])
- timerchannel.pulse_width([value])
- timerchannel.pulse_width_percent([value])
• timerchannel.callback(fun) – задает функцию обратного вызова, запускаемую при срабатывании канала таймера. Функции fun передается один аргумент – объект Timer. Если в аргументе fun задать None, это отключит функцию обратного вызова.
• timerchannel.capture([value]) – задает или считывает значение захвата, связанное с каналом. Функции capture(), compare() и pulse_width() – это всё псевдонимы для одной и той же функции. Просто когда канал находится в режиме захвата (input capture), логичнее использовать псевдоним capture().
• timerchannel.compare([value]) – задает или считывает значение сравнения, связанное с каналом. Функции capture(), compare() и pulse_width() – это всё псевдонимы для одной и той же функции. Просто когда канал находится в режиме сравнения (output compare), логичнее использовать псевдоним compare().
• timerchannel.pulse_width([value]) – задает или считывает ШИМ-значение, связанное с каналом. Функции capture(), compare() и pulse_width() – это всё псевдонимы для одной и той же функции. Просто когда канал находится в режиме ШИМ, логичнее использовать псевдоним pulse_width().
В режиме выравнивания по границе (edge-aligned) ШИМ-значение в количестве period + 1 будет соответствовать коэффициенту заполнения 100%. В режиме выравнивания по центру (center-aligned) ШИМ-значение в количестве period будет соответствовать коэффициенту заполнения 100%.
• timerchannel.pulse_width_percent([value]) – задает или считывает процентное ШИМ-значение, связанное с каналом. В аргументе value должно быть значение в диапазоне между «0» и «100», и оно задает процент времени, в течение которого импульс находится в активном состоянии (это также называется коэффициентом заполнения). Значением в value может быть целое число или число с плавающей точкой (для большей точности). Например, если задать в value значение «25», это даст коэффициент заполнения 25%.
<syntaxhighlight lang="python" enclose="div">