Таймери 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 размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Символьний індикатор LCD 2004

Символьний індикатор LCD 2004

Чотирьохрядковий символьний рідкокристалічний індикатор з блакитною підсвіткою LCD2004.Напруга живле..

205.21грн.

Модуль 3 — Робота з цифровими сигналами: pull-up, pull-down і кнопка-перемикач

Модуль 3 — Робота з цифровими сигналами: pull-up, pull-down і кнопка-перемикач

Модуль 3 — Робота з цифровими сигналами (курс для початківців) Мета модуля: зрозуміти, як п..

Універсальна плата під мікросхеми SOP20, SSOP20

Універсальна плата під мікросхеми SOP20, SSOP20

Універсальна монтажна плата, дозволяє проводити монтаж різноманітних мікросхем з поверхневим монтаже..

17.36грн.

Гвинт М3х14мм оцинкований

Гвинт М3х14мм оцинкований

Гвинт оцинкований з різьбою М3 для кріплення елементів любительських проектівДовжина різьби 14 мм..

0.59грн.

Роз'ємний конектор під гвинт на плату 2 контакти

Роз'ємний конектор під гвинт на плату 2 контакти

Подвійний роз'ємний гвинтовий конектор без повороту для монтажу на друковану плату.Використовується ..

25.96грн.