Некоторое время назад мы публиковали дополнительную информацию о функция миллис() de ArduinoТеперь мы углубимся в Ардуино Таймер, чтобы начать работу с этой функцией, узнайте, как эта плата управляет временем с MCU, а также с другими функциями, помимо millis().
Что такое таймер Arduino?
El Таймер Arduino или таймер, это аппаратно реализованная функция (в микроконтроллере, с помощью кварцевого кристалла, который генерирует тактовые импульсы и задает «ритм», без необходимости использования внешнего оборудования или ИС 555), которая позволяет управлять временными событиями благодаря часам внутренний. Например, выполнение задачи через определенные промежутки времени, точное измерение времени и т. д. независимо от кода скетча.
Представьте, что вы используете функция задержки(), это заблокирует выполнение на микроконтроллере Arduino до истечения указанного времени, а затем продолжит выполнение программы, но таймер не заблокируется. Это будет синхронизация, поскольку MCU продолжает выполнять другие инструкции одновременно. Это большое преимущество.
Таймер связан с перерывы Arduino, так как они будут выполняться через них для выполнения какой-то конкретной задачи. Другими словами, таймер Arduino — это функция, которая срабатывает в определенное время, выполняя функцию прерывания. Вот почему также важно знать об этих прерываниях.
Режимы
Таймер Arduino имеет 2 режима работы, возможность использовать его в:
- ШИМ-сигнал: Вы можете контролировать Контакты Arduino (~).
- CTC (сброс таймера при сравнении совпадений): подсчитывает время внутри счетчика, и когда оно достигает значения, указанного в регистре таймеров, выполняется прерывание.
Сколько у него таймеров? Типы таймеров
Там 3 таймера на тарелках Arduino UNO, хотя на других верхних пластинах их может быть больше:
- Таймер 0: 8-битный, может считать от 0 до 255 (256 возможных значений). Используется такими функциями, как delay(), millis() и micros(). Его модифицировать не рекомендуется, чтобы не переделывать программы.
- Таймер 1: соответствует таймеру 0. Используется библиотекой сервоприводов в UNO (таймер 5 для MEGA).
- Таймер 2: 16-битный, может принимать значения от 0 до 65.525 65.536 (XNUMX XNUMX возможных значений). Используется для функции tone(), если не используется, его можно свободно использовать для вашего приложения.
- Таймер 3, 4, 5 (только на Arduino MEGA): все 16-битные.
Как работает таймер Arduino?
К работа с таймером Arduino, очень важно знать, как все это работает в электронном виде в MCU этой макетной платы:
- Тактовая частота: это количество циклов в секунду, которое он способен выработать, в случае Arduino это 16 МГц, или что то же самое, тактовый сигнал колеблется 16.000.000 XNUMX XNUMX раз в секунду (циклов).
- период: обозначается буквой T, измеряется в секундах и является обратным значением циклов. Например, T=1/C, что дает 1/16000000 = 0.0000000625, время, необходимое для завершения каждого цикла. А частота обратно пропорциональна периоду, поэтому f = 1/T.
- Цикл: каждое из повторений сигнала, которое происходит в единицу времени. На Arduino это будет 16M в секунду. Или что то же самое, в данном случае, когда прошло 16 миллионов циклов, прошла одна секунда. Следовательно, можно сказать, что один цикл занимает 625 нс.
- фронт сигнала: Тактовые сигналы прямоугольные, а фронты могут быть нарастающими или спадающими. Край — это прямая линия сигнала, когда он изменяется от:
- от 0 (низкий) до 1 (высокий): нарастающий фронт.
- от 1 (высокий) до 0 (низкий): спадающий фронт.
Фронты важны, потому что таймеры Arduino измеряют циклы от фронтов сигнала. А) Да Счетчик он увеличивается с каждым циклом, и когда он достигает значения регистра, выполняется прерывание.
Поэтому, как только вы это узнаете, если у вас есть 16 МГц на микроконтроллере Arduino, и используется 8-битный Таймер, можно сказать, что прерывания будут происходить каждые 16 мкс (256/16000000) или 4 мс для 16-битного (65536/16000000). Следовательно, если вы установите 16-битный регистр счетчика на максимум со значением 65535, то прерывание произойдет через 4 мс для выполнения какой бы то ни было задачи.
Когда счетчик достигает максимально возможного значения, он снова вернется к 0. То есть происходит переполнение и он будет отсчитывать с начала.
Для управления скоростью увеличения таймера вы также можете использовать предварительный делитель, который принимает значения 1, 8, 64, 256 и 1024 и изменяет тайминг следующим образом:
Скорость таймера (Гц) = тактовая частота Arduino/предделителя
Если это 1, прескалер контроллер увеличит до 16 МГц, если это 8 до 2 МГц, если это 64 до 250 кГц и так далее. Помните, что будет компаратор состояния счетчика таймера для сравнения значения счетчика и предварительного делителя до тех пор, пока они не сравняются, а затем выполнить действие. Так, частота прерывания дается по формуле:
Частота прерывания (Гц) = Частота тактовой частоты Arduino/предделителя (значение регистра компаратора + 1)
К счастью, мы не должны изменять записи таймеров Arduino, так как об этом позаботятся библиотеки, которые мы используем в коде. Но если они не используются, их следует настроить.
Примеры в Arduino IDE
Чтобы понять все это немного лучше, здесь я показываю два кода скетча для Arduino IDE, с помощью которых вы можете получить опыт использования таймеров. Первый — это код, который каждую секунду будет мигать светодиодом, подключенным к контакту 8 Arduino:
#define ledPin 8 void setup() { pinMode(ledPin, OUTPUT); // Configurar Timer1 TCCR1A = 0; //Registro control A a 0, pines OC1A y OC1B deshabilitados TCCR1B = 0; //Limpia el registrador TCCR1B |= (1<<CS10)|(1 << CS12); //Configura prescaler a 1024: CS12 = 1 y CS10 = 1 TCNT1 = 0xC2F8; //Iniciar timer para desbordamiento a 1 segundo //65536-(16MHz/1024/1Hz - 1) = 49912 = 0xC2F8 en hexadecimal TIMSK1 |= (1 << TOIE1); //Habilitar interrupción para Timer1 } void loop() { } ISR(TIMER1_OVF_vect) //Interrupción del TIMER1 { TCNT1 = 0xC2F7; // Reniciar Timer1 digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //Invierte el estado del LED }
Запрограммируйте мигание или мигание светодиода, как и в предыдущем случае каждую секунду, но на этот раз с помощью CTC т.е. сравнение:
#define ledPin 8 void setup() { pinMode(ledPin, OUTPUT); // Configuración Timer1 TCCR1A = 0; //Registro de control A a 0 TCCR1B = 0; //Limpiar registro TCNT1 = 0; //Inicializar el temporizador OCR1A = 0x3D08; //Carga el valor del registro de comparación: 16MHz/1024/1Hz -1 = 15624 = 0X3D08 TCCR1B |= (1 << WGM12)|(1<<CS10)|(1 << CS12); //Modo CTC, prescaler de 1024: CS12 = 1 y CS10 = 1 TIMSK1 |= (1 << OCIE1A); //Habilita interrupción por igualdad de comparación } void loop() { } ISR(TIMER1_COMPA_vect) //Interrupción por igualdad de comparación en TIMER1 { digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //Invierte el estado del LED }
Подробнее о программировании Arduino
купить тарелку Arduino UNO Ред.3