Таймери Arduino UNO — Частина 5. Вимірювання тривалості імпульсів і частоти (Input Capture)

Теорія

Режим Input Capture (ICP1)

Режим Input Capture — це спеціальна функція Timer1 у мікроконтролері ATmega328P, яка дозволяє з високою точністю фіксувати моменти приходу фронтів сигналу (зростаючого або спадаючого) на піні ICP1 (Arduino UNO — пін D8).

Коли на вхід ICP1 надходить вибраний фронт сигналу, поточне значення лічильника TCNT1 автоматично копіюється в регістр ICR1. Це дозволяє точно зафіксувати момент події без затримок, які могли б виникнути під час опитування піна у звичайному коді.

Як виміряти частоту і тривалість

  • Частота розраховується за формулою: F = F_CPU / (Prescaler * ΔTCNT), де ΔTCNT — різниця між двома захватами, а Prescaler — вибраний дільник таймера.
  • Тривалість імпульсу можна визначити, вимірявши час між фронтами (зростаючим і спадаючим) одного імпульсу.

Input Capture корисний у завданнях, де потрібна висока точність вимірювань — наприклад, у тахометрах, аналізаторах сигналів, частотомірах.

Практика

Вимірювання частоти сигналу від датчика Холла

Приклад коду для вимірювання частоти обертання колеса з датчиком Холла:


volatile uint16_t lastCapture = 0;
volatile uint16_t period = 0;
float frequency = 0;

void setup() {
  Serial.begin(9600);
  pinMode(8, INPUT);

  TCCR1A = 0; // Звичайний режим
  TCCR1B = 0;
  TCCR1B |= (1 << ICES1); // Захоплення за зростаючим фронтом
  TCCR1B |= (1 << CS11);  // Дільник 8
  TIMSK1 |= (1 << ICIE1); // Дозвіл переривання захоплення
}

ISR(TIMER1_CAPT_vect) {
  uint16_t capture = ICR1;
  period = capture - lastCapture;
  lastCapture = capture;
}

void loop() {
  if (period > 0) {
    frequency = 16000000.0 / (8.0 * period);
    Serial.print("Частота: ");
    Serial.print(frequency);
    Serial.println(" Гц");
    delay(500);
  }
}
  

Проєкт: Тахометр на Arduino UNO

У цьому проєкті ми використовуємо Input Capture для створення тахометра, що вимірює оберти на хвилину (RPM) двигуна.


volatile uint16_t lastCapture = 0;
volatile uint16_t period = 0;
float rpm = 0;

void setup() {
  Serial.begin(9600);
  pinMode(8, INPUT);

  TCCR1A = 0;
  TCCR1B = 0;
  TCCR1B |= (1 << ICES1); // Захоплення за зростаючим фронтом
  TCCR1B |= (1 << CS11);  // Дільник 8
  TIMSK1 |= (1 << ICIE1); // Переривання захоплення
}

ISR(TIMER1_CAPT_vect) {
  uint16_t capture = ICR1;
  period = capture - lastCapture;
  lastCapture = capture;
}

void loop() {
  if (period > 0) {
    float frequency = 16000000.0 / (8.0 * period);
    rpm = frequency * 60.0; // 1 імпульс на оберт
    Serial.print("RPM: ");
    Serial.println(rpm);
    delay(500);
  }
}
  

Такий тахометр можна застосувати у моделях автомобілів, мотоциклів, вентиляторах та інших механізмах, де потрібно вимірювати швидкість обертання.

<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Модуль АЦП ADS1115 4-х канальний

Модуль АЦП ADS1115 4-х канальний

АЦП ADS1115 4-х канальний ADS1115 — це 4-х канальний 16-розрядний аналого-цифровий перетворювач (..

99.62грн.

Світлодіод ультраяскравий 5мм

Світлодіод ультраяскравий 5мм

Над-яскравий світлодіод діаметром 5 мм Корпус прозорий в світлодіодів різного кольору світіння. Тоб..

5.75грн.

ESP32 LED PWM: частоти та роздільна здатність ШІМ (LEDC)

ESP32 LED PWM: частоти та роздільна здатність ШІМ (LEDC)

ESP32 LED PWM Controller: керування яскравістю світлодіодів ESP32 має вбудований модуль LED PWM C..

Припой-паста для пайки SMD-компонентів

Припой-паста для пайки SMD-компонентів

Паста-припой у шприці XG-Z40Намазується на контактні ділянки плати, плавиться при температурі > 1..

196.14грн.

Драйвер крокового двигуна RAMPS 1.4 для CNC або 3D-принтера

Драйвер крокового двигуна RAMPS 1.4 для CNC або 3D-принтера

Драйвер A4988 під шилд RAMPS 1.4Є можливість налаштовувати робочий струм двигуна за допомогою з..

60.91грн.