ESP32: Высокоточные измерения сигналов с помощью таймеров

ESP32 оснащён мощными аппаратными таймерами, которые позволяют не только управлять событиями, но и выполнять высокоточные измерения входных сигналов. Одним из распространённых применений является создание простого частотомера — устройства, измеряющего частоту поступающего сигнала.

Подсчёт частоты входного сигнала

Для измерения частоты сигнала можно использовать следующий принцип:

  • Один таймер запускается на фиксированный интервал времени (например, 1 секунда).
  • На входном GPIO (через прерывания) подсчитывается количество фронтов сигнала.
  • По завершении интервала таймера подсчитанное количество импульсов переводится в значение частоты.

Таким образом, мы получаем простейший частотомер, реализованный полностью в коде на ESP32.

Пример программы: простой частотомер


const int signalPin = 4;       // GPIO для входного сигнала
volatile unsigned long pulses = 0;
hw_timer_t *timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

void IRAM_ATTR handleSignal() {
  pulses++; // считаем каждый фронт
}

void IRAM_ATTR onTimer() {
  portENTER_CRITICAL_ISR(&timerMux);
  unsigned long freq = pulses; // сохраняем количество импульсов
  pulses = 0;                  // обнуляем для следующего цикла
  portEXIT_CRITICAL_ISR(&timerMux);

  Serial.print("Частота: ");
  Serial.print(freq);
  Serial.println(" Гц");
}

void setup() {
  Serial.begin(115200);
  pinMode(signalPin, INPUT);

  attachInterrupt(digitalPinToInterrupt(signalPin), handleSignal, RISING);

  // Настраиваем таймер на 1 сек (1 000 000 мкс)
  timer = timerBegin(0, 80, true); 
  timerAttachInterrupt(timer, &onTimer, true);
  timerAlarmWrite(timer, 1000000, true);
  timerAlarmEnable(timer);
}

void loop() {
  // основной цикл свободен
}

Как работает программа:

  • На пине GPIO4 ожидается прямоугольный сигнал.
  • Каждый фронт увеличивает счётчик pulses.
  • Каждую секунду таймер вызывает функцию onTimer(), где подсчитанное значение выводится в Serial Monitor.

Улучшения и расширения

  • Можно изменить интервал таймера (например, 100 мс для более быстрого обновления).
  • Для повышения точности следует использовать внешний опорный генератор или кварц.
  • Можно усреднять несколько измерений для снижения шума.

Заключение

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

<< Проекты << Все товары >> Статьи, уроки >>

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Режим сна SIM800L с Arduino Nano: энергосбережение и пробуждение по SMS

Режим сна SIM800L с Arduino Nano: энергосбережение и пробуждение по SMS

Режим сна SIM800L и пробуждение Arduino Привет, друзья! Тему этой статьи предложили подписчики. И..

Драйвер A4988. Как использовать ENABLE, SLEEP и RESET

Драйвер A4988. Как использовать ENABLE, SLEEP и RESET

Привет, друзья! Давайте обсудим такой важный вопрос при работе с драйвером A4988, как пины разрешени..

Кабель питания 220В 2х0,75мм2

Кабель питания 220В 2х0,75мм2

Сетевой кабель питания 220ВПлощадь сечения провода 0,75 мм2Длина провода 1,8 м..

35.63грн.

Уроки Arduino структура программы для начинающих

Уроки Arduino структура программы для начинающих

Здравствуйте друзья! Вы большие молодцы, что заинтересовались уроками Arduino! Структура програ..

Циклы 1 — Введение в циклы Arduino

Циклы 1 — Введение в циклы Arduino

Циклы 1 — Введение в циклы Arduino Введение Циклы — это важный инструмент в программиров..

Рекомендуемые товары

ESP32 Timer Groups: архитектура и использование

ESP32 Timer Groups: архитектура и использование

ESP32 Timer Groups: архитектура и использование Микроконтроллер ESP32 имеет мощную систему аппара..

0.00грн.

ESP32: Генерация ШИМ на основе таймера (без LEDC)

ESP32: Генерация ШИМ на основе таймера (без LEDC)

ESP32: Генерация ШИМ на основе таймера (без LEDC) В ESP32 есть несколько способов организовать ши..

0.00грн.