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