Таймер высокого разрешения на ESP32 с помощью ESP-IDF


В этой серии уроков по ESP-IDF мы познакомим вас с API таймеров ESP на примере (system/esp_timer), предоставленном ESP-IDF. Этот API для таймеров с высоким разрешением позволяет создавать несколько таймеров с помощью одного аппаратного таймера. Управление несколькими таймерами легко осуществляется с помощью функций обратного вызова, что снижает сложность при работе с несколькими таймерами. ESP-IDF предоставляет драйвер esp_timer, содержащий API для создания как периодических, так и однократных таймеров с разрешением по времени в микросекунды и 64-битным диапазоном для аппаратных таймеров.

Таймер высокого разрешения на ESP32 с помощью ESP-IDF

Пример использования esp_timer находится в примерах расширения ESP-IDF в разделе system. На этом примере мы покажем, как создать два разных типа таймеров: одноразовый и периодический, и управлять ими обоими с помощью API ESP Timer. Итак, начнём!

Более кратко работу с таймерами в ESP32 мы рассматривали в статье таймеры и задержки в FreeRTOS на ESP32 с помощью ESP-IDF. Также хороший обзор про данные таймеры можно прочитать в статье использование таймеров и прерываний от них в модуле ESP32, но в ней работа с таймерами рассматривается с помощью Arduino IDE.

Высокоточный таймер ESP32 с модулем ESP-IDF

В этом разделе мы рассмотрим пример скетча, предоставленный ESP-IDF, чтобы научиться настраивать таймеры с помощью API esp_timer.

Создание примера проекта

Откройте VS Code и перейдите в меню View > Command Palette («Вид» > «Палитра команд»). Введите в строке поиска ESP-IDF: New Project и нажмите Enter.

Укажите название проекта и каталог. Мы назвали наш проект «ESP_IDF_ESP_TIMER». Для платы ESP-IDF мы выбрали опцию custom board («пользовательская плата»). В качестве целевой платформы для ESP-IDF мы выбрали модуль ESP32.

Нажмите кнопку ‘Choose Template’ («Выбрать шаблон»), чтобы продолжить.

Создание примера проекта для работы с таймерами

В разделе Extension («Расширение») выберите опцию ESP-IDF:

Выбор опции ESP-IDF в разделе Extension («Расширение»)

На вкладке System («Система») мы щелкнем по пункту «esp_timer». Затем нажмем ‘Create project using template esp_timer’ («Создать проект, используя шаблон esp_timer»).

Создание проекта с использованием шаблона esp_timer

Вы получите уведомление о создании проекта. Чтобы открыть проект в новом окне, нажмите «Да».

Это открывает наш проект ESP_IDF_ESP_TIMER, который мы создали на вкладке EXPLORER. Внутри папки проекта находится несколько папок. Это одинаково для всех проектов, которые вы создадите с помощью ESP-IDF Explorer. В основной папке находится исходный код, то есть файл main.c будет находиться именно здесь.

Теперь перейдите в папку main > esp_timer_example_main.c и откройте её.

Откроется следующий код. В этом примере кода создаются два таймера: периодический и одноразовый. Периодический таймер будет вызываться каждые 0,5 секунды для вывода сообщения в терминал. Одноразовый таймер будет запускаться и перезапускать периодический таймер с периодом в 1 секунду.

Код таймера для ESP32

Как работает код?

API для таймера высокого разрешения определены в файле components/esp_timer/include/esp_timer.h. Поэтому мы включим этот драйвер в самом начале вместе с другими необходимыми библиотеками.

В наборе API esp_timer один таймер обозначается типом esp_timer_handle_t. Поскольку в этом примере создаются два таймера, будут использоваться два дескриптора таймеров esp: один для периодического таймера, а другой для однократного.

Функции обратного вызова

Каждый таймер имеет функцию обратного вызова, которая вызывается каждый раз, когда таймер продолжает отсчет. Она вызывается из задачи esp_timer.

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

Одноразовый таймер запустится и перезапустит периодический таймер с периодом в 1 секунду, тем самым изменив период периодического таймера. Ниже вы можете увидеть функцию обратного вызова для одноразового таймера. Сначала она выводит время с момента загрузки, когда запускается одноразовый таймер. Затем она останавливает периодический таймер и перезапускает его с другим периодом (1 секунда вместо 0,5 секунды). Наконец, она выводит сообщение о том, что периодический таймер перезапущен с периодом в 1 секунду, а также указывает время с момента загрузки.

Создание таймера

Функция esp_timer_create() используется для создания экземпляра esp_timer. Она принимает два параметра. Первый параметр — это указатель на структуру, содержащую аргументы для создания таймера. Второй параметр — это указатель на тип esp_timer_handle_t, содержащий ранее созданный дескриптор таймера.

Для создания периодического таймера используются следующие параметры.

Для создания однократного таймера используются следующие параметры.

Перед вызовом функции esp_timer_create() для конкретного таймера мы сначала определяем структуру, содержащую аргументы для создания таймера и дескриптор таймера esp.

Это конфигурация таймера и дескриптор, который будет передан функции esp_timer_create() для периодического таймера. Обратите внимание, что конфигурация таймера включает в себя функцию обратного вызова, которая вызывается по истечении времени таймера, и имя таймера.

Это конфигурация таймера и дескриптор, который будет передан функции esp_timer_create() для одноразового таймера.

Запуск таймера

После создания таймера он запускается. Для запуска периодического таймера используется функция esp_timer_start_periodic(). Этот вызов функции запускает периодический таймер, который будет срабатывать через каждый указанный период времени в микросекундах. Функция принимает два параметра. Первый параметр — это дескриптор таймера, а второй — период времени в микросекундах, через который вызывается функция обратного вызова. Таймер останавливается при вызове функции esp_timer_stop().

Для запуска одноразового таймера используется функция esp_timer_start_once(). Этот вызов функции запускает одноразовый таймер. Он принимает два параметра. Первый параметр — это дескриптор таймера, а второй — время ожидания таймера в микросекундах, по истечении которого вызывается функция обратного вызова. Этот таймер останавливается, когда вызывается его функция обратного вызова.

В этот момент в терминале отобразится сообщение о запуске таймеров, а также время с момента загрузки, которое можно получить с помощью функции esp_timer_get_time().

Примечание: при запуске периодического или одноразового таймера убедитесь, что он еще не запущен. Если вы хотите перезапустить работающий таймер, сначала необходимо остановить его с помощью функции esp_timer_stop(), а затем запустить с помощью функций esp_timer_start_periodic() или esp_timer_start_once().

Следующий цикл for выводит информацию о таймерах на терминал каждые 2 секунды. Функция esp_timer_dump() используется для вывода списка таймеров в поток, который в данном случае является стандартным выводом (stdout).

Включение режима легкого сна

Далее плата ESP32 переходит в режим легкого сна на 0,5 секунды. Это достигается вызовом функций esp_sleep_enable_timer_wakeup(500000) и esp_light_sleep_start(). В терминале отображается время с момента загрузки, когда плата переходит в режим легкого сна, и время после пробуждения.

Удаление таймеров

Наконец, мы удалим наши периодические и одноразовые таймеры. Для этого нам сначала нужно остановить таймеры. Если одноразовый таймер уже завершил свою работу, его останавливать не нужно. Следовательно, мы остановим только периодический таймер. Это делается путем вызова функции esp_timer_stop() и передачи в качестве параметра дескриптора времени.

Для удаления таймера вызовем функцию esp_timer_delete( ) и передадим в качестве параметра дескриптор таймера. На этом этапе оба таймера будут удалены, и в терминале отобразится сообщение о том, что таймеры остановлены и удалены.

Компиляция скетча

Для прошивки микросхемы введите следующую команду в последовательном терминале ESP-IDF. Не забудьте заменить COM-порт на тот, через который подключена ваша плата.

Ввод команды в терминале для компиляции скетча

После успешной прошивки кода вы сможете просмотреть сообщения в терминале ESP-IDF.

Сообщения в терминале, показывающие работу наших таймеров

Давайте разберем сообщения по одному, чтобы понять их.

Сначала создаются периодические и одноразовые таймеры.

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

Далее выводится первоначальный дамп таймера.

Вывод в терминале первоначального дампа таймера

Периодический таймер работает с периодом 500000 мкс (500 мс/0,5 с).

Вывод в терминал сообщений о работе периодического таймера

Однократный таймер срабатывает через 5 секунд и перезапускает периодический таймер с периодом в 1 секунду.

Вывод в терминал сообщений о срабатывании однократного таймера

После выхода из этого режима ESP32 переходит в режим легкого сна, и отслеживание времени остается неизменным.

Сообщения в терминале о переходе ESP32 в режим легкого сна

После остановки периодических таймеров оба таймера удаляются.

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

(Проголосуй первым!)
Загрузка...
5 просмотров

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

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