Меню Закрыть

Таймеры — STM32

Что такое таймер ?

Таймер — это аппаратный блок микроконтроллера, который позволяет измерять время, создавать задержки и управлять различными процессами. Он работает как счетчик, который увеличивает или уменьшает свое значение с заданной частотой, определяемой тактовым сигналом. Таймеры используются для точного отсчета времени, генерации сигналов (например, ШИМ), измерения частоты и много чего другого полезного, редкая программа обходится без хотя бы одного таймера. Конкретно в нашем случае будем рассматривать для микроконтроллера STM32F407VGT6 но всё что написано в статье актуально и для любых других микроконтроллеров семейства.

Виды таймеров.

У каждого микроконтроллера на борту есть несколько встроенных таймеров. В нашем случае их 14 и они поделены на типы. Всего бывает три типа таймеров — базовые (Basic Timers), общего назначения (General-Purpose Timers) и продвинутые (Advanced Timers).

  • Basic purpose (базовые) —  самые простые, используются для создания задержек и запуска событий с заданным интервалом. Они не имеют выходных каналов и не поддерживают ШИМ.
  • General purpose —  более универсальны. Они могут не только отсчитывать время, но и генерировать сигналы, измерять их длительность, а также работать в режиме ШИМ
  • Advanced — продвинутые таймеры. Обладает расширенными возможностями, такими как управление моторами, синхронизация с другими периферийными устройствами и т.д. Являются самыми сложными из всех таймеров.

Таблицу с таймерами для вашего микроконтроллера можно посмотреть в даташит. Таблица для STM32F407VGT6:

Из таблицы видно что у нас два продвинутый таймера (Tim1, Tim8), два базовых (Tim6,Tim7), остальные общего назначения.

Настройки таймера, расчёт

Давайте на конкретном примере попробуем рассчитать наш таймер, чтобы он срабатывал через определённое время. Но для начала разберёмся что такое счётчик таймера.

Счётчик таймера— это основной регистр, который увеличивается или уменьшается при каждом такте таймера. В зависимости от разрядности таймера ( в таблице это колонка Counter resolution) счетчик может считать от 0 до 65535 (2^16 — 1) если таймер 16 разрядный или от 0 до 4 294 967 295 (2^32 — 1) если таймер 32 разрядный. Если включить таймер без предделителя например на частоте 16 МГц то он досчитает до своего максимума примерно за 4 мс, что очень быстро. Чтобы этого не произошло придумали предделитель. 

Предделитель делит частоту нашего таймера на себя. Допустим частота у нас 16 МГц и предделитель равен 8.

Рассчитаем частоту таймера 

Теперь найдём время до переполнения 16-битного таймера (значение 65536 это максимальное значение, но вы можете установить то что вам необходимо, в диапазоне от 0 до 65535, ниже рассказано как это сделать):

Наш таймер переполнится за 32,768 мс и вызовет событие прерывания таймера. 

Теперь познакомимся с настройками таймера в CubeIDE и некоторыми особенностями которые необходимо учитывать.

Открываем вкладку Timers ( файл .ioc )  и выбираем наш таймер. Например таймер 4 

Переходим во вкладку Parameter Settings. Здесь вы увидите настройки вашего таймера.

Prescaler — это наш предделитель. Здесь выставлено значение 0, но фактически он будет равен 1, потому что деление идет на PSC + 1. То есть, если вам нужен предделитель 8 то нужно выставлять 7, всегда на минус 1. Об этом нужно обязательно помнить когда выставляете значение регистров.

Counter mode — это режим счёта. Он определяет, как будет изменяться значение счётчика (CNT) от 0 до ARR (или наоборот). Всего существует три режима

  • Up — стандартный режим. Таймер считает от 0 до ARR.После достижения ARR таймер сбрасывается в 0 и продолжает заново.
  • Down — Таймер начинает с ARR и считает вниз до 0.
  • Center-Aligned — Центрированный счёт. Таймер сначала считает вверх до ARR, потом вниз до 0. В зависимости от режима Mode 1, 2, 3, генерация событий совпадает с разными моментами.

Наиболее распространённым и часто используемым является режим Up, так как он подходит для большинства задач, включая измерение времени и генерацию ШИМ-сигналов.Counter Period(Auto-Reload Register или сокращённо ARR) —  регистр счёта таймера. Он задаёт значение, до которого считает таймер, после чего он сбрасывается и начинает заново (если используется счет вверх). Обязательно нужно помнить про минус единицу(аналогично как в Prescaler). По умолчанию стоит 65535(если регистр 16 разрядный). Вы можете выставить своё значение исходя из ваших расчётов в диапазоне счётчика.

Это три основные настройки таймера, с остальными познакомимся позже, для начала работы этих будет вполне достаточно. Ещё один важный момент, не забыть включить прерывания таймера. Делается это во вкладке NVIC Setiings.

Каналы таймера.

В STM32 большинство таймеров имеют от 1 до 4 каналов, которые позволяют одновременно выполнять разные функции. Каналы работают независимо и могут использоваться в различных режимах, таких как ШИМ, захват входного сигнала, сравнение выходного сигнала и другие. Каналы привязаны к ножкам микроконтроллера. Если вы выберете определенный канал ( например канал 1 TIM4 ) в режиме Input Capture direct mode то CubeIDE автоматически подсветит вам ножку PD12 так как она привязана к этому каналу. 

Режимы работы каналов таймеров

Таймеры в STM32 обладают несколькими ключевыми режимами работы, позволяющими решать широкий спектр задач. К основным относятся захват входных сигналов (Input Capture), сравнение значений (Output Compare), генерация ШИМ (PWM Mode).Эти режимы являются основой для более сложных сценариев использования таймеров в микроконтроллерах.

Режим захвата (Input Capture Mode)  —  используется для измерения времени прихода сигнала или его длительности. Таймер фиксирует момент изменения уровня на входе (фронт или спад) и сохраняет значение счетчика в регистре CCR. Этот режим часто используется в обработке сигналов от энкодеров, ультразвуковых датчиков и в протоколах связи.

Режим сравнения значений (Output Compare Mode) используется для генерации событий или изменения состояния вывода микроконтроллера при достижении таймером заданного значения. Когда счётчик достигает значения в регистре сравнения, происходит срабатывание события.

Генерация ШИМ (PWM Mode) используется для формирования широтно-импульсной модуляции, где изменяется скважность сигнала (длительность активного уровня при фиксированном периоде). Позволяет регулировать “мощность” нагрузки на выходе.

На этом пожалуй всё. Коротко прошлись по таймерам, рассмотрели зачем они нужны и как ими пользоваться, познакомились с понятиями предделителя, счёта и режимами работы. 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *