Расчет значений таймера и задержки во встроенных микроконтроллерах: шаг за шагом

Понимание того, как вычислять значения таймера и задержки, имеет важное значение для программирования встроенных микроконтроллеров. Эти вычисления обеспечивают точное время для таких задач, как мигающие светодиоды, генерация сигналов PWM, создание точных задержек и внедрение систем управления в реальном времени. Это всеобъемлющее руководство обеспечивает пошаговый подход к определению правильных значений для таймеров и задержек в приложениях микроконтроллеров, охватывающий фундаментальные концепции, практические примеры и передовые методы.

Понимание основ таймера в микроконтроллерах

Микроконтроллеры используют таймеры как неотъемлемые компоненты, при этом большинство современных контроллеров имеют в себе хотя бы один таймерный модуль. Таймер — периферийный в микроконтроллере, который подсчитывает вверх или вниз на определенной частоте, полезен для создания задержек, измерения временных интервалов и запуска периодических задач. Разрешение таймера и максимальный счёт определяют, насколько точно он может измерять или генерировать задержки.

Устойчивый поток импульсов, который подсчитывает таймер, обычно называется таймером «часы», в то время как сигналы стабильного времени, которые таймер может быть сконфигурирован для производства, обычно называются «тикс». Понимание этого различия имеет решающее значение для правильной конфигурации и реализации таймера.

Таймерная архитектура и компоненты

Типичный таймерный модуль состоит из нескольких ключевых компонентов, которые работают вместе, чтобы обеспечить функциональность таймера:

Модуль таймера/счетчика может вывести свой источник часов из системных часов и выполнять операции подсчета на основе этого тактового импульса. В этом случае говорят, что он работает как таймер и выполняет операции измерения времени. Поскольку системная тактовая частота определяется пользователем и часто довольно стабильна, программист способен достигать точных интервалов времени путем соответствующей настройки модуля таймера.

Роль прескалеров в расчетах таймеров

Предкаслёр — аппаратный делитель, который уменьшает системную тактовую частоту до того, как она достигнет таймера. Например, при частоте системы 16 МГц и предкабелеру 2, входная частота таймера будет 8 МГц. Предкаслёр является одним из важнейших элементов конфигурации таймера, поскольку позволяет сбалансировать разрешение тайминга с максимальной продолжительностью тайминга.

Понимание ограничений Prescaler

Некоторые прекалибры ограничены только 2-мя подразделениями системных часов, поэтому вы можете получить F / 2 или F / 4 или F / 8 или F / 16. Некоторые прекалибры даже более ограничены, чем это, в том, что доступны только определенные подразделения мощности 2, а не все из них. Прекалибры AVR такие. Для большинства AVR единственные прекалиберные подразделения, которые вы получаете, это 1, 8, 64, 256 и 1024.

Изменяя число, по которому прекалибр делит входящие часы, мы можем изменить частоту часов таймера, даже если системная тактовая частота остается прежней. Возможность изменить тактовую частоту таймера позволяет нам выбрать наиболее подходящую частоту для работы (работ) синхронизации. Более быстрые часы таймера дают более высокое разрешение времени, но более короткое максимальное время, в то время как более медленные часы таймера дают более низкое разрешение времени, но более длительное максимальное время.

Прескалерские компромиссы

Предкаслёр позволяет настроить соотношение между разрешением и максимальным периодом для достижения желаемого эффекта.При выборе значения прекаслер учитывают следующие факторы:

Фундаментальные формулы расчета таймера

Основная формула для расчета количества таймеров:

График таймера = Желаемая задержка × Частота таймера

Где:

Timer Frequency = CPU Clock frequency / Prescaler. Это самая базовая и важная формула для всех вычислений таймера.

Расчет времени за клеща

Частота — это в основном количество раз, когда что-то происходит за одну секунду. Так что тактовая частота 20 МГц на самом деле составляет 20 × 106 тактовых циклов за одну секунду. Чтобы получить время, затраченное на один тактовый цикл, вам придется взять обратную частоту. В этом случае это 1/20 МГц, что даст 0,05 × 10−6 секунд.

Формула времени на клеща после прескалирования:

Время на тик = 1 / Таймерная частота = Прескалер / Частота часов процессора

Это значение представляет, сколько времени проходит для каждого приращения счетчика таймера.

Расчет требуемых таймеров

Расчет параметров прекалибра и таймера (счетчика) требует трех частей информации: тактовой частоты микроконтроллера (Fclk), желаемой частоты или периода выходного события (Fout или Tout), разрешения таймера (бит-ширина) и режима работы.

Как только вы узнаете время на клеща, вы можете рассчитать, сколько клещей необходимо для желаемой задержки:

Требуемые галочки = Желаемая задержка / Время за тик

Или комбинирование формул:

Требуемые галочки = (желаемая задержка × частота часов процессора) / Prescaler

Пример пошагового расчета

Давайте проработаем подробный пример, чтобы проиллюстрировать процесс расчета. Предположим, микроконтроллер работает на частоте 16 МГц и использует прекальдер 64. Для генерации задержки 1 миллисекунда:

Шаг 1: Вычислите частоту таймера

Частота таймера = CPU Clock / Prescaler

Частота таймера = 16 000 000 Гц / 64 = 250 000 Гц

Это означает, что счетчик таймера увеличивается 250 000 раз в секунду.

Шаг 2: Расчет времени за клеща

Время на тик = 1 / Таймерная частота

Время на тик = 1 / 250 000 Гц = 4 микросекунды

Каждое приращение счетчика таймера представляет собой 4 микросекунды прошедшего времени.

Шаг 3: Расчет требуемых таймеров

График таймера = Желаемая задержка / Время за тик

График таймера = 1 миллисекунда / 4 микросекунды = 1000 мкс / 4 мкс = 250 графов

В качестве альтернативы, используя прямую формулу:

График таймера = 0,001 s × 250 000 Гц = 250 графов

Шаг 4: Проверка на ограничение по времени

Для 8-битного таймера максимальное количество составляет 255. Так как наше требуемое количество 250 меньше 255, эта конфигурация будет работать. Если требуемое количество превышает максимальное значение таймера, вам нужно будет либо:

Работа с различными режимами таймера

Микроконтроллеры обычно поддерживают несколько режимов работы таймера, каждый из которых подходит для различных приложений. Понимание этих режимов имеет решающее значение для эффективного использования таймера.

Обычный режим (Overflow Mode)

В нормальном режиме направление подсчета повышается (повышается) без очистки. Он просто запускается до максимального 8-битного значения (0xFF) и перезапускается внизу (0x00). Когда он переходит в 0xFF и переворачивается в 0x00, он устанавливает флаг переполнения таймера / счетчика (TOV1). В этот момент генерируется прерывание, которое очистит TOV1 и процесс повторяется.

Счетчик таймера подсчитывает каждый тактовый импульс. Когда он достигает своего максимального значения (например, 255 для 8-бит), он переполняет и сбрасывает до 0. После сброса он устанавливает флаг переполнения и запускает прерывание, если включен.

В нормальном режиме часто для достижения желаемой задержки требуется предварительно загрузить регистр счетчика таймера с конкретным значением.Так как таймер отсчитывает до переполнения, то приходится перезагружать таймер с 65536 минус желаемое количество для 16-битных таймеров, или 256 минус желаемое количество для 8-битных таймеров.

CTC Mode (Clear Timer on Compare Match) (Ясный таймер на сравнительных матчах)

В режиме CTC таймер отсчитывает от начального значения 0 до его значения регистра сравнительных совпадений, когда происходит сравнительный матч, на следующем таймере часов таймер сбрасывается до 0. Этот режим особенно полезен для генерации точных частот и периодических прерываний без необходимости перезагрузки счетчика вручную.

Режим CTC упрощает вычисления, поскольку вы напрямую устанавливаете значение сравнения с количеством нужных вам клещей, а не рассчитываете значение предварительной нагрузки. Таймер автоматически сбрасывается, когда достигает значения сравнения, что делает его идеальным для генерации квадратных волн и периодических сигналов.

Режимы PWM

Режимы модуляции широты импульса (PWM) используют таймеры для генерации сигналов с переменными рабочими циклами. Если TIM Pulse = 500 и период равен 1000, канал будет выводить частоту 1 КГц с рабочим циклом 50/50. PWM необходим для управления двигателем, светодиодного затемнения и генерации аналогового сигнала.

В режиме PWM вы настраиваете как период (значение автоматической перегрузки), так и ширину импульса (значение сравнительной величины). Рабочий цикл рассчитывается как:

Обязательный цикл (%) = (Сравнение значения / Период) × 100

Расширенные методы расчета таймера

Обработка длительных задержек с переполнением таймера

Есть некоторые случаи, когда значение счета слишком велико, чтобы быть размещенным в доступном пространстве регистра (прескалер, постшкалер и регистр таймера). Это означает, что требуемый интервал времени слишком велик для того, чтобы таймер мог произвести. В этом случае вам приходится прибегать к некоторым другим методам, таким как наличие счетчика в ISR, чтобы прерывание таймера происходило определенное количество раз до того, как будет выполнена фактическая ISR.

Например, чтобы создать 1-секундную задержку, когда ваш таймер может генерировать только 10 мс прерывания, вы должны посчитать 100 таймерных прерываний в программном обеспечении:

Использование счетчиков повторов

Если значение счетчика повторений равно N, процессор будет вызывать прерывание обновления при каждом переполнении таймера N + 1. Эта функция, доступная на некоторых продвинутых микроконтроллерах, таких как STM32, обеспечивает аппаратное подсчет переполнения без вмешательства программного обеспечения.

Формулой для таймера частоты прерываний с счетчиком повторений становится:

Частота прерывания = Часы таймера / [(Prescaler + 1) × (Period + 1) × (Repetition Counter + 1)]

Postscaler Размышления

Посткальбер не замедляет счетчик, а только то, как часто он генерирует прерывания. Если он установлен на 2:1, счетчик должен достигать нуля дважды для того, чтобы был установлен бит флага прерывания таймера. Посткальеры обеспечивают дополнительную гибкость в частоте генерации прерываний, не влияя на скорость подсчета таймера.

Примеры практического осуществления

Пример 1: СИД-мигает с переполнением таймера

Давайте реализуем светодиодное мигание 500 мс с использованием микроконтроллера AVR, работающего на частоте 16 МГц с 8-битным таймером:

Требования:

Процесс расчета:

Сначала выберите подходящий прекаслер. С прекалибром 1024:

Таймерная частота = 16 000 000 / 1024 = 15 625 Гц
Время на клещ = 1 / 15 625 = 64 мкс

Для 500 мс задержка:
Требуемые клещи = 500 000 мкс / 64 мкс = 7812,5 клещей

Поскольку 7812 превышает наш 8-битный таймер (255), нам нужно использовать несколько переливов.

Количество переливов = 7 812 / 256 ≈ 30,5 переливов

Можно использовать 30 полных переливов плюс частичное подсчёт. Для 30 переливов: 30 × 256 = 7680 клещей. Оставшиеся клещи: 7812 — 7680 = 132 клещей. Значение предварительной нагрузки для последнего перелива: 256 — 132 = 124.

Пример 2: Создание точной частоты в режиме CTC

Для генерации квадратной волны 250 Гц с Timer 1, сконфигурированным в режиме CTC, таймер отсчитывает от начального значения 0 до его регистрового значения Compare match. Timer 1 представляет собой 16-битный таймер с 16 МГц и 1 прескалером. Time per tick = 1/16 МГц = 62,5 наносекунд. Для генерации квадратной волны 250 Гц переключайте штифт каждые 2 мс, так как каждый цикл составляет 4 мс (2 мс высоко, 2 мс низко). Клещи необходимы = 2 миллисекунды / 62,5 наносекунды = 32000.

Установите регистр сравнения совпадений (OCR1A) на 32000 и настройте таймер для переключения выходного штифта на сопоставимом совпадении. Аппаратное обеспечение автоматически генерирует квадратную волну без вмешательства программного обеспечения.

Пример 3: конфигурация таймера STM32

При тактовой частоте, равной 80 МГц, прекалере 79, автоперезагрузке (период таймера) 9999 и счетчике повторения нуля частота прерывания таймера составляет 100 Гц.

Верификация:
Часы таймера после Prescaler = 80 000 000 / (79 + 1) = 1 000 000 Гц
Частота прерывания = 1 000 000 / (9999 + 1) = 100 Гц
Период прерывания = 1 / 100 = 10 мс

Для таймеров STM32 TIM Prescaler = N - 1 делит часы Bus/TIM на N, а TIM Period = N - 1 делит эти часы на N. Вот почему мы добавляем 1 к обоим значениям в наших расчетах.

Внедрение таймерных задержек в код

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

Шаги конфигурации

  1. Выберите таймер и режим: Выберите подходящий таймер (8-битный или 16-битный) и режим работы (Normal, CTC, PWM)
  2. Настройте Prescaler: Установите значение прескалера в регистре управления таймером
  3. Загрузка счетчик/сравнительные значения: Инициировать регистр счетчика таймера или сравнить регистр соответствия с вычисленными значениями
  4. Выполнить прерывания (при необходимости): Настроить прерывание, включить биты и реализовать ISR
  5. Старт таймера: Включить таймер, установив соответствующие биты управления

Загрузите рассчитанное значение в регистр подсчета таймера. Запустите таймер и ждите, пока он переполнится или достигнет заданного значения. Это создает точную задержку на основе вычисленных подсчетов таймера.

Опросы против подходов, основанных на прерывании

Существует два основных метода обнаружения событий таймера:

Метод опроса: Основная программа непрерывно проверяет флаг переполнения таймера в цикле. Этот подход прост, но тратит циклы процессора и может пропустить события, если флаг не проверяется достаточно часто.

Метод прерывания: Прерывания таймера в микроконтроллерах STM32 обеспечивают мощный способ выполнения конкретных задач с точными интервалами времени без непрерывного опроса процессора. Используя прерывания таймера, разработчики могут создавать эффективные и отзывчивые встроенные приложения для таких задач, как периодическая выборка данных, запуск событий на основе времени и планирование системы в реальном времени.

Написание эффективных таймерных ISR

Сохраняйте ISR короткими и быстрыми, избегая сложных операций. Выполняйте только основные действия и откладывайте более сложную обработку в основную программу. Избегайте блокировки вызовов, таких как задержки или циклы, поскольку они могут вызвать пропущенные прерывания и задержки. Переменные, разделяемые между ISR и основной программой, должны быть объявлены как неустойчивые, чтобы гарантировать, что компилятор не оптимизирует их.

К числу наиболее эффективных методов работы с временными СИО относятся:

Общие таймерные приложения во встроенных системах

Периодическое планирование задач

Прерывания таймера широко используются для создания периодических задач, которые поддерживают согласованные скорости выполнения независимо от других текущих процессов в микроконтроллере. Например, встроенное приложение может использовать прерывание таймера для отбора датчиков температуры каждые 100 миллисекунд, запускать преобразования ADC с фиксированной скоростью, переключать светодиоды состояния с точными длительностями включения / выключения или увеличивать программные таймеры и счетчики, требуемые системой. Эти задачи выполняются независимо от основного цикла программы, позволяя процессору сосредоточиться на операциях более высокого уровня, полагаясь на аппаратные таймеры для поддержания точности времени.

Операционная система реального времени Tick Generation

Таймерный клещ ISR является фундаментальным строительным блоком для многих, возможно, большинства встроенных систем.Тик таймера порядка 10 мс полезен для различных задач, поскольку он обеспечивает хорошую отзывчивость к человеческим действиям, при этом позволяя большинству циклов процессора идти на другую работу.

Таймеры часто используются в системах реального времени, где задачи должны выполняться точно в заданные интервалы. В таких системах точность времени имеет решающее значение, а таймеры обеспечивают основу для планирования задач. Таймер, генерирующий регулярные прерывания (тиксы) с фиксированным интервалом, может служить основой для планировщика операционной системы реального времени (RTOS) или временной базой для периодических задач.

Поколение сигналов PWM

Сроки необходимы для генерации сигналов PWM, используемых в управлении двигателем, светодиодном контроле яркости и преобразовании в цифровой аналог.Настраивая таймер в режиме PWM и регулируя значение сравнения, вы можете точно контролировать рабочий цикл выходного сигнала.

Для управления скоростью двигателя типичные частоты PWM варьируются от 1 кГц до 20 кГц. Вычислите требуемые настройки таймера на основе желаемой частоты и разрешения. Например, с часами 16 МГц и 8-битным разрешением (256 шагов) можно достичь примерно 62,5 кГц частоты PWM без прескалера или 15,6 кГц с прескалером 4.

Реализация Watchdog Timer

Таймер сторожевого пса — это специальный таймер, который сбрасывает систему, если она не периодически сбрасывается программой. Эта функция помогает предотвратить системные отключения, автоматически перезагружая MCU, если она становится не реагирующей. Правильная конфигурация таймера сторожевого пса требует расчета периодов тайм-аута, которые достаточно велики для нормальной работы, но достаточно коротки, чтобы быстро улавливать сбои системы.

Устранение неполадок в расчетах таймеров и их реализации

Общие ошибки расчета

Несколько распространенных ошибок могут привести к неправильному поведению таймера:

Методы проверки

Всегда проверяйте расчеты и реализацию таймера:

Работа с точностью часов

Точность в реальном мире зависит от источника времени. Внутренние RC-осцилляторы обычно имеют точность 1-5%, в то время как внешние кристаллы обеспечивают точность 20-50 ppm. Для точного определения времени всегда используйте внешний кристаллический осциллятор и учитывайте колебания температуры в вашей конструкции.

Конкретные соображения платформы

AVR микроконтроллеры

Микроконтроллеры AVR от Microchip (ранее Atmel) имеют специфические характеристики таймера. Для примеров AVR таймер 1 представляет собой 16-битный таймер. Для примеров STM32 таймер 1 представляет собой 16-битный таймер с 16-битным прекалибром. Таймеры AVR обычно поддерживают значения прекалибров 1, 8, 64, 256 и 1024.

Регистры таймеров AVR включают TCCR (реестр таймера / контр-контроля), TCNT (реестр таймера / счетчика), OCR (реестр сравнения результатов) и TIMSK (реестр прерывания маски таймера). Понимание этих регистров имеет важное значение для правильной конфигурации таймера.

Микроконтроллеры STM32

Микроконтроллеры STM32 имеют 16-битные прескалеры, поэтому системные часы можно разделить на любое значение между 1 и 65536. Такие прескалеры намного приятнее в работе из-за их большей гибкости. Эта гибкость позволяет более точно определять временные конфигурации по сравнению с фиксированными вариантами прескалеров.

Для таймеров STM32 выберите прекалибр, чтобы масштабировать часы до управляемой частоты, установите значение автоматической перезагрузки для достижения желаемого периода, затем запрограммировайте значения PSC и ARR в регистры таймера. STM32CubeMX предоставляет инструменты графической конфигурации, которые автоматически вычисляют эти значения.

PIC микроконтроллеры

Микроконтроллеры PIC от Microchip имеют как прекалибры, так и посткалибры на некоторых таймерах, обеспечивая дополнительную гибкость.Модуль Timer0 обычно используется для базовых операций синхронизации, в то время как Timer1 и Timer2 предлагают более продвинутые функции, включая внешние тактовые входы и регистры периодов.

Таймеры PIC часто используют разделитель часов с инструкцией 4:1, то есть часы таймера работают на одной четвертой частоте осциллятора. Всегда консультируйтесь с таблицей данных, чтобы определить фактическую тактовую частоту таймера для вашего конкретного устройства PIC.

Платформа Arduino

Timer0 — 8-битный таймер, используемый Arduino функциями delay(), millis() и micros(). Timer1 — 16-битный таймер, используемый библиотекой Servo(), а Timer2 — 8-битный таймер, используемый библиотекой Tone(). При использовании таймеров Arduino напрямую следует знать о конфликтах со встроенными библиотечными функциями.

Продвинутые темы и оптимизация

Атомные операции и критические разделы

При доступе к многобайтным регистрам таймеров как из основного кода, так и из ISR используют атомные операции или временно отключают прерывания для предотвращения условий гонки.Для 16-битных таймеров на 8-битных микроконтроллерах чтение или запись встречного значения требует доступа к двум 8-битным регистрам, что необходимо делать атомарно, чтобы избежать чтения непоследовательных значений.

Синхронизация таймера

Некоторые приложения требуют многократных таймеров для работы в синхронизации. Расширенные микроконтроллеры обеспечивают связывание таймера или конфигурации мастер-раб, где один таймер может запускать или сбрасывать другой. Это полезно для сложных моделей PWM, многофазного управления двигателем и скоординированной выборки датчиков.

Оптимизация энергопотребления

Тимеры продолжают работать в большинстве режимов с низким энергопотреблением, что делает их идеальными для пробуждения микроконтроллера через определенные интервалы времени. Настройте таймеры для использования минимально приемлемой частоты для минимизации энергопотребления. Некоторые микроконтроллеры предлагают маломощные таймерные периферийные устройства, специально предназначенные для приложений с ультранизким энергопотреблением.

Jitter и точность определения времени

Задержка прерывания вносит джиттер в операции на основе таймера. Типичная задержка прерывания колеблется от нескольких микросекунд до десятков микросекунд в зависимости от архитектуры микроконтроллера и состояния выполнения тока. Для приложений, требующих точности субмикросекунд, используют выходы аппаратного таймера, а не программно-зависимые штифты.

Практические рекомендации по дизайну

Выбираем правильный таймер

При выборе таймера для вашего приложения рассмотрите:

Документация и поддержание кода

Всегда документируйте свои вычисления таймера четко в комментариях к коду. Включите тактовую частоту, значение прекалибровки, желаемое время и фактически достигнутые сроки. Это облегчает изменение параметров времени позже или порт-код на разные тактовые частоты.

Подумайте о создании препроцессорных макросов или встроенных функций, которые инкапсулируют вычисления таймера, делая код более читаемым и поддерживаемым:

#define TIMER FREQ (F CPU/PRESCALER)
#define MS TO TICKS(ms)((ms * TIMER FREQ)/1000)
#define US TO TICKS(us)((us * TIMER FREQ)/1000000)

Тестирование и валидация

Разработать систематический подход к тестированию на основе таймера:

  1. Проверка расчетов с помощью нескольких независимых методов
  2. Испытание в граничных условиях (минимальные и максимальные временные значения)
  3. Измерение фактического времени с помощью внешних инструментов
  4. Испытание в различных условиях нагрузки для проверки согласованности синхронизации
  5. Проверка сроков прерывания и продолжительности выполнения ISR
  6. Проверьте дрейф во времени в течение длительных периодов

Онлайн инструменты и ресурсы

Несколько онлайн-инструментов могут помочь с вычислениями и верификацией таймеров. Эти калькуляторы автоматизируют процесс определения предкальферных и периодических значений для конкретных требований к времени.Популярные варианты включают калькуляторы таймеров STM32, калькуляторы таймеров AVR и встраиваемые калькуляторы таймеров общего назначения.

При использовании онлайн-калькуляторов всегда проверяйте результаты вручную для критически важных приложений. Понимайте лежащие в основе вычисления, а не слепо доверяя автоматизированным инструментам. Эти калькуляторы отлично подходят для быстрой проверки и изучения различных вариантов конфигурации.

Для получения дополнительной информации о программировании встроенных систем и периферийных устройствах микроконтроллера посетите такие ресурсы, как Embedded.com, EmbeddedRelated.com и документацию для конкретного производителя от Microchip, STMicroelectronics и других поставщиков полупроводников.

Заключение

Освоение таймера и расчетов задержки имеет основополагающее значение для программирования встроенных систем. Понимая взаимосвязь между тактовыми частотами, прекалибрами, режимами таймера и значениями счетчиков, вы можете реализовать точное время для любого приложения. Начните с основных формул, проверьте свои расчеты и постепенно изучите расширенные функции, такие как прерывания сравнения матчей, генерация PWM и синхронизация таймера.

Помните, что конфигурация таймера включает в себя компромиссы между разрешением, максимальной продолжительностью времени и использованием ресурсов. Выберите значения прекалиберов и режимы таймера, которые наилучшим образом соответствуют требованиям вашего приложения. Всегда проверяйте реализацию таймера с помощью фактических аппаратных измерений для обеспечения точности.

Благодаря практике и опыту, вычисления таймеров становятся интуитивно понятными, позволяя быстро настраивать таймеры для любого встроенного приложения. Независимо от того, моргаете ли вы светодиодом, генерируете сигналы PWM, реализуете планировщик в реальном времени или измеряете ширину импульсов, принципы, описанные в этом руководстве, обеспечивают основу для успешного проектирования встраиваемых систем на основе таймера.