Таймер Arduino: играйте со временем в своих проектах

Таймер Arduino UNO

Некоторое время назад мы публиковали дополнительную информацию о функция миллис() de ArduinoТеперь мы углубимся в Ардуино Таймер, чтобы начать работу с этой функцией, узнайте, как эта плата управляет временем с MCU, а также с другими функциями, помимо millis().

Что такое таймер Arduino?

ардуино таймер

El Таймер Arduino или таймер, это аппаратно реализованная функция (в микроконтроллере, с помощью кварцевого кристалла, который генерирует тактовые импульсы и задает «ритм», без необходимости использования внешнего оборудования или ИС 555), которая позволяет управлять временными событиями благодаря часам внутренний. Например, выполнение задачи через определенные промежутки времени, точное измерение времени и т. д. независимо от кода скетча.

Кomo Arduino UNO У него есть микросхема MCU, работающая на частоте 16 МГц, каждую секунду может выполняться 16.000.000 16 XNUMX операций. Для выполнения инструкций требуется X циклов, не все они выполняются за одни и те же тактовые циклы, например, XNUMX-битным требуется больше циклов в этой архитектуре AVR.

Представьте, что вы используете функция задержки(), это заблокирует выполнение на микроконтроллере Arduino до истечения указанного времени, а затем продолжит выполнение программы, но таймер не заблокируется. Это будет синхронизация, поскольку MCU продолжает выполнять другие инструкции одновременно. Это большое преимущество.

Таймер связан с перерывы Arduino, так как они будут выполняться через них для выполнения какой-то конкретной задачи. Другими словами, таймер Arduino — это функция, которая срабатывает в определенное время, выполняя функцию прерывания. Вот почему также важно знать об этих прерываниях.

Режимы

Таймер Arduino имеет 2 режима работы, возможность использовать его в:

  • ШИМ-сигнал: Вы можете контролировать Контакты Arduino (~).
  • CTC (сброс таймера при сравнении совпадений): подсчитывает время внутри счетчика, и когда оно достигает значения, указанного в регистре таймеров, выполняется прерывание.

Сколько у него таймеров? Типы таймеров

Arduino UNO Миллис функции

Там 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 кГц и так далее. Помните, что будет компаратор состояния счетчика таймера для сравнения значения счетчика и предварительного делителя до тех пор, пока они не сравняются, а затем выполнить действие. Так, частота прерывания дается по формуле:

+1 потому, что регистр счетчика проиндексирован с 0, т.е. он начинает считать не с 1, а с 0.

Частота прерывания (Гц) = Частота тактовой частоты Arduino/предделителя (значение регистра компаратора + 1)

К счастью, мы не должны изменять записи таймеров Arduino, так как об этом позаботятся библиотеки, которые мы используем в коде. Но если они не используются, их следует настроить.

Примеры в Arduino IDE

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

Содержание статьи соответствует нашим принципам редакционная этика. Чтобы сообщить об ошибке, нажмите здесь.

Будьте первым, чтобы комментировать

Оставьте свой комментарий

Ваш электронный адрес не будет опубликован. Обязательные для заполнения поля помечены *

*

*

  1. Ответственный за данные: Мигель Анхель Гатон
  2. Назначение данных: контроль спама, управление комментариями.
  3. Легитимация: ваше согласие
  4. Передача данных: данные не будут переданы третьим лицам, кроме как по закону.
  5. Хранение данных: база данных, размещенная в Occentus Networks (ЕС)
  6. Права: в любое время вы можете ограничить, восстановить и удалить свою информацию.

Английский тестКаталонский тестиспанский тест