Внутренние таймеры Arduino: точное тайминг без delay()
Компоненты и материалы
| Компонент | Количество |
|---|---|
| Arduino UNO | 1 |
| Светодиод (любой) | 1 |
| Резистор 220 Ом | 1 |
О проекте
Обзор
Для точного отсчёта времени нужно использовать таймеры. Функция delay() блокирует выполнение, а таймер работает на прерываниях — основной код продолжает работать.
В этом уроке разбираем TIMER0 (8-битный) — самый простой. В будущем можно рассмотреть TIMER1 и TIMER2.
Как это работает
Смотрим даташит ATmega328P. Схема таймера:
Тактирующий сигнал (16 МГц) проходит через предделитель (prescaler), затем инкрементирует регистр TCNT0. В режиме CTC (Clear Timer on Compare) значение TCNT0 сравнивается с OCR0A. При совпадении генерируется прерывание TIMER0_COMPA_vect.
Предделитель настраивается регистром TCCR0B:
Формула расчёта OCR0A для нужного периода:
Пример: прерывание каждые 1 мс (1 кГц) при 16 МГц и предделителе 64:
TCCR0A |= (1 << WGM01); // CTC режим
OCR0A = 0xF9; // 249 -> 1 мс
TIMSK0 |= (1 << OCIE0A); // разрешить прерывание
sei(); // глобальное разрешение прерываний
TCCR0B |= (1 << CS01) | (1 << CS00); // предделитель 64
Важно: предделитель включать последним — после этого таймер стартует. Чтобы остановить — обнулить TCCR0B.
Пример: мигание встроенным LED раз в секунду
int timer = 0;
bool state = 0;
void setup() {
pinMode(13, OUTPUT);
TCCR0A = (1 << WGM01); // CTC
OCR0A = 0xF9; // 1 мс
TIMSK0 |= (1 << OCIE0A); // прерывание по совпадению
sei(); // разрешить прерывания
TCCR0B |= (1 << CS01) | (1 << CS00); // предделитель 64
}
void loop() {
if (timer >= 1000) { // 1000 мс = 1 с
state = !state;
timer = 0;
}
digitalWrite(13, state);
}
ISR(TIMER0_COMPA_vect) {
timer++; // инкремент каждые 1 мс
}
Схема
Производственный процесс
- Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
- FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
- DIY Arduino TV-B-Gone: универсальный пульт для выключения любого телевизора
- Создание пользовательских LED-часов с будильником — видно с 12 метров
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Оптимизированные решения питания для проектов на Arduino
- Крестики-нолики на Arduino с матрицей MAX7219 и картонным корпусом
- Пошаговое руководство: сборка умного четырёхногого робота на Arduino
- Своё рулевое управление (джойстик) для игр на Arduino
- Построение полнофункционального станка с ЧПУ на базе Arduino Nano R3