Внутренние таймеры Arduino
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Об этом проекте
Обзор
Если вам нужно считать точное время, вам нужно использовать таймер, но обычно не так просто использовать внутренние таймеры Arduino, поэтому в этом уроке я попытаюсь объяснить, как их использовать простым способом.
Так важно использовать таймеры, потому что во время функции delay () вы ничего не можете сделать, но с таймером вы можете делать все, потому что, когда момент действительно наступает, он активирует прерывание.
Я использую TIMER0, потому что это самый простой таймер, возможно, в будущем я смогу объяснить другие таймеры.
Как это работает
Первое, что вам нужно увидеть, это техническое описание ATmega328P.
Это блок-схема счетчика, и глядя на нее, вы можете понять, как она работает.
Предварительный делитель принимает импульс от тактового цикла и затем передает его в логику управления, поэтому логика управления увеличивает регистр TCNTn на 1.
Теперь мы можем сравнить значение TCNTn с конкретным значением. Когда регистр TCNTn достигает этого значения, вы знаете, что прошло определенное время.
Этот метод называется режимом CTC для «Сброс таймера при сравнении». Значение регистра TCNTn сравнивается с регистром OCRn, когда происходит совпадение сравнения, TOVn генерирует прерывание.
Еще одна важная вещь - это предварительный делитель, с его помощью вы можете создавать разные деления тактовой частоты, на самом деле 16 МГц - это слишком много, но, благодаря предварительному делителю, вы можете создать несколько его долей. Это зависит от конфигурации регистра TCCR0B.
Еще одна важная вещь - определить значение регистра OCRn для подсчета определенного времени, вам понадобится немного математики.
Я знаю, что все это может показаться слишком сложным, но я уверен, что приведенный ниже код проясняет каждый вопрос.
В этом случае мы активируем запрос прерывания каждые 0,001 секунды.
TCCR0A | =(1 <
Важно установить предварительный делитель в конце, потому что после этой инструкции таймер начинает отсчет, если вам нужно его остановить, вы должны сбросить все биты TCCR0B.
Ниже приведен пример.
Код
- Внутренний таймер
Внутренний таймер Arduino
/ * Эта программа включает и выключает светодиод на выводе 13 каждую 1 секунду с использованием внутреннего таймера * / int timer =0; bool state =0; void setup () {pinMode (13, OUTPUT); TCCR0A =(1 <=1000) {state =! state; таймер =0; } digitalWrite (13, состояние); } ISR (TIMER0_COMPA_vect) {// Это таймер запроса прерывания ++;}
Схема
Производственный процесс