Таймеры Arduino UNO — Часть 6. Оптимизация и нестандартные применения

Теория

Совмещение работы нескольких таймеров

В микроконтроллере ATmega328P (Arduino UNO) есть три аппаратных таймера: Timer0, Timer1 и Timer2. Каждый из них может работать в своём режиме, что позволяет одновременно выполнять несколько задач:

  • Timer0 — обычно используется функциями millis() и delay(), но его можно перенастроить.
  • Timer1 — 16-битный, подходит для точных замеров времени, генерации сигналов низкой частоты, работы с сервоприводами.
  • Timer2 — 8-битный, может работать на другой частоте (асинхронно), полезен для звука и ШИМ.

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

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

Таймеры могут быть источником лишнего потребления энергии в спящем режиме. Для снижения энергопотребления можно:

  • Отключать ненужные таймеры с помощью регистра PRR (Power Reduction Register).
  • Использовать режимы сна микроконтроллера (SLEEP_MODE_IDLE, SLEEP_MODE_PWR_DOWN).
  • Снижать частоту тактирования или увеличивать предделитель.

Подмена работы millis() и delay() своими таймерами

Функции millis() и delay() используют Timer0. Если этот таймер нужен для других задач, можно отключить стандартный обработчик и реализовать собственный счётчик времени на Timer1 или Timer2. Это позволяет полностью контролировать тайминг программы.

Практика

Секундомер с точностью 0.1 мс


volatile unsigned long ticks = 0;

ISR(TIMER1_COMPA_vect) {
  ticks++; // каждые 100 мкс
}

void setup() {
  Serial.begin(9600);

  TCCR1A = 0;
  TCCR1B = (1 << WGM12) | (1 << CS10); // CTC, делитель 1
  OCR1A = 1599; // 16 МГц / 1600 = 10 000 Гц (100 мкс)
  TIMSK1 = (1 << OCIE1A);
}

void loop() {
  Serial.print("Время: ");
  Serial.print(ticks / 10.0); // в миллисекундах с точностью 0.1 мс
  Serial.println(" мс");
  delay(500);
}
  

Звуковой генератор


void setup() {
  pinMode(3, OUTPUT); // OC2B

  TCCR2A = (1 << COM2B0) | (1 << WGM21); // Toggle OC2B, CTC
  TCCR2B = (1 << CS20); // Без делителя
  OCR2A = 113; // ~7 кГц
}

void loop() {
  // Генерация звука идёт автоматически
}
  

Проект: Музыкальный генератор на таймерах

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


struct Note {
  uint16_t ocr;
  uint16_t duration;
};

Note melody[] = {
  {113, 500}, // Ля
  {101, 500}, // Си
  {95,  500}, // До
  {85,  500}, // Ре
};

void setup() {
  pinMode(3, OUTPUT);
  TCCR2A = (1 << COM2B0) | (1 << WGM21); // Toggle OC2B, CTC
  TCCR2B = (1 << CS20);
}

void loop() {
  for (int i = 0; i < 4; i++) {
    OCR2A = melody[i].ocr;
    delay(melody[i].duration);
  }
  delay(1000);
}
  

Такой генератор можно использовать для создания простых звуковых сигналов, оповещений и даже музыкальных игрушек на Arduino UNO.

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

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

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Модуль блока питания 12В 250мА

Модуль блока питания 12В 250мА

Удобный модуль питания из 220В AC в 12В постоянного тока. Разработан для установки на печатную плату..

155.85грн.

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

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

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

35.63грн.

NRF24L01+PA+LNA модуль 2,4 ГГц SMD с разъёмом IPEX, 18×14 мм

NRF24L01+PA+LNA модуль 2,4 ГГц SMD с разъёмом IPEX, 18×14 мм

NRF24L01+PA+LNA модуль 2,4 ГГц (SMD) с разъёмом IPEX (u.FL), 18×14 мм ..

109.98грн.

Умный дом #9: Реализация сценариев («Уход из дома», «Ночь», «Экономия энергии»)

Умный дом #9: Реализация сценариев («Уход из дома», «Ночь», «Экономия энергии»)

Умный дом #9: Реализация сценариев («Уход из дома», «Ночь», «Экономия энергии») Сценари..

Разъемный штекер мама-папа 2,54мм на 2, 3, 4, 5 пинов

Разъемный штекер мама-папа 2,54мм на 2, 3, 4, 5 пинов

Пластмассовый корпус для разъема 2,54мм без металлической вставки..

1.01грн.