- Что такое ТАЙМЕР во встроенной электронике?
- Регистры таймера Arduino
- Прерывания от таймера Arduino
- Необходимые компоненты
- Принципиальная электрическая схема
- Программирование таймеров Arduino UNO
Платформа разработки Arduino была первоначально разработана в 2005 году как простое в использовании программируемое устройство для проектов художественного дизайна. Его цель заключалась в том, чтобы помочь не инженерам работать с базовой электроникой и микроконтроллерами без особых знаний в области программирования. Но затем, из-за своей простой в использовании природы, он был вскоре адаптирован новичками и любителями электроники по всему миру, и сегодня он даже предпочтителен для разработки прототипов и разработки POC.
Хотя начинать с Arduino можно, важно постепенно переходить к основным микроконтроллерам, таким как AVR, ARM, PIC, STM и т. Д., И программировать их с помощью собственных приложений. Это связано с тем, что язык программирования Arduino очень прост для понимания, поскольку большая часть работы выполняется встроенными функциями, такими как digitalWrite (), AnalogWrite (), Delay () и т. Д., В то время как машинный язык низкого уровня скрыт за ними. Программы Arduino не похожи на другие программы кодирования Embedded C, где мы имеем дело с битами регистров и делаем их высокими или низкими в зависимости от логики нашей программы.
Таймеры Arduino без задержки:
Следовательно, чтобы понять, что происходит внутри встроенных функций, нам нужно изучить эти термины. Например, когда используется функция delay (), она фактически устанавливает биты регистра таймера и счетчика микроконтроллера ATmega.
В этом руководстве по таймеру Arduino мы собираемся избежать использования этой функции delay () и вместо этого будем иметь дело с самими регистрами. Хорошо, что для этого можно использовать ту же среду разработки Arduino. Мы установим биты нашего регистра таймера и будем использовать прерывание при переполнении таймера для переключения светодиода при каждом возникновении прерывания. Значение предварительной загрузки бита таймера также можно настроить с помощью кнопок для управления продолжительностью, в течение которой происходит прерывание.
Что такое ТАЙМЕР во встроенной электронике?
Таймер - это своего рода прерывание. Это как простые часы, которые могут измерять временной интервал события. У каждого микроконтроллера есть часы (осциллятор), скажем, в Arduino Uno это 16 МГц. Это отвечает за скорость. Чем выше тактовая частота, тем выше скорость обработки. Таймер использует счетчик, который считает с определенной скоростью в зависимости от тактовой частоты. В Arduino Uno для одного подсчета требуется 1/16000000 секунд или 62 нано секунды. Это означает, что Arduino переходит от одной инструкции к другой каждые 62 наносекунды.
Таймеры в Arduino UNO:
В Arduino UNO есть три таймера, которые используются для разных функций.
Timer0:
Это 8-битный таймер, который используется в таких функциях таймера, как delay (), millis ().
Таймер1:
Это 16-битный таймер, используемый в серво-библиотеке.
Таймер2:
Это 8-битный таймер, используемый в функции tone ().
Регистры таймера Arduino
Для изменения конфигурации таймеров используются регистры таймера.
1. Регистры управления таймером / счетчиком (TCCRnA / B):
Этот регистр содержит основные управляющие биты таймера и используется для управления предварительными делителями таймера. Это также позволяет управлять режимом таймера с помощью битов WGM.
Формат кадра:
TCCR1A | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
COM1A1 | COM1A0 | COM1B1 | COM1B0 | COM1C1 | COM1C0 | WGM11 | WGM10 |
TCCR1B | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ICNC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 |
Предделитель:
Биты CS12, CS11, CS10 в TCCR1B задают значение предварительного делителя. Предварительный делитель используется для установки тактовой частоты таймера. Arduino Uno имеет предделители 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | ИСПОЛЬЗОВАТЬ |
0 | 0 | 0 | Нет часов Таймер STOP |
0 | 0 | 1 | CLCK i / o / 1 без предварительного масштабирования |
0 | 1 | 0 | CLK i / o / 8 (от предделителя) |
0 | 1 | 1 | CLK i / o / 64 (от предделителя) |
1 | 0 | 0 | CLK i / o / 256 (от предделителя) |
1 | 0 | 1 | CLK i / o / 1024 (от предделителя) |
1 | 1 | 0 | Внешний источник синхронизации на выводе T1. Часы на заднем крае |
1 | 1 | 1 | Источник внешнего тактового сигнала на выводе T1. Часы на переднем крае. |
2. Регистр таймера / счетчика (TCNTn)
Этот регистр используется для управления значением счетчика и для установки значения предварительного загрузчика.
Формула значения прелоадера для требуемого времени в секундах:
TCNTn = 65535 - (16x10 10 xTime в секундах / значение предделителя)
Чтобы вычислить значение предзагрузчика для timer1 за время 2 секунды:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Прерывания от таймера Arduino
Ранее мы узнали о прерываниях Arduino и увидели, что прерывания от таймера - это своего рода программные прерывания. В Arduino есть различные таймерные прерывания, которые описаны ниже.Прерывание переполнения таймера:
Когда таймер достигает своего максимального значения, скажем, например (16 бит-65535), происходит прерывание переполнения таймера . Таким образом, процедура обслуживания прерывания ISR вызывается, когда в регистре маски прерывания таймера TIMSKx включен бит прерывания по переполнению таймера, включенный в TOIEx.
Формат ISR:
ISR (TIMERx_OVF_vect) { }
Регистр сравнения выходных данных (OCRnA / B):
Здесь, когда происходит прерывание совпадения выходного сравнения, вызывается ISR службы прерывания (TIMERx_COMPy_vect), а также бит флага OCFxy будет установлен в регистре TIFRx. Этот ISR включается установкой бита включения в OCIExy, присутствующем в регистре TIMSKx. Где TIMSKx - это регистр маски прерывания от таймера.
Захват ввода таймера:
Затем, когда происходит прерывание захвата входа таймера, вызывается ISR службы прерывания (TIMERx_CAPT_vect), а также бит флага ICFx будет установлен в TIFRx (регистр флага прерывания таймера). Этот ISR включается установкой бита включения в ICIEx, присутствующем в регистре TIMSKx.
Необходимые компоненты
- Arduino UNO
- Кнопки (2)
- LED (любой цвет)
- Резистор 10 кОм (2), 2,2 кОм (1)
- ЖК-дисплей 16x2
Принципиальная электрическая схема
Схема соединений между Arduino UNO и ЖК-дисплеем 16x2:
ЖК-дисплей 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5В |
V0 |
К центральному штырю потенциометра для контроля контрастности ЖК-дисплея |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
А |
+ 5В |
K |
GND |
Две кнопки с понижающим резистором 10 кОм подключены к контактам 2 и 4 Arduino, а светодиод подключен к контакту 7 Arduino через резистор 2,2 кОм.
Настройка будет выглядеть как на изображении ниже.
Программирование таймеров Arduino UNO
В этом руководстве мы будем использовать ТАЙМЕР ПРЕРЫВАНИЕ ПЕРЕПОЛНЕНИЯ и будем использовать его для включения и выключения светодиода в течение определенного времени, регулируя значение предварительного загрузчика (TCNT1) с помощью кнопок. Полный код для таймера Arduino приведен в конце. Здесь мы объясняем код построчно:
Поскольку в проекте используется ЖК-дисплей 16x2 для отображения значения предварительной загрузки, используется жидкокристаллическая библиотека.
#включают
Вывод анода светодиода, который подключен к выводу 7 Arduino, определяется как ledPin .
#define ledPin 7
Затем объявляется объект для доступа к классу Liquid Crystal с выводами ЖК-дисплея (RS, E, D4, D5, D6, D7), которые подключены к Arduino UNO.
ЖК-дисплей LiquidCrystal (8,9,10,11,12,13);
Затем установите значение прелоадера 3035 на 4 секунды. Проверьте формулу выше, чтобы рассчитать значение предварительного загрузчика.
значение с плавающей запятой = 3035;
Затем в void setup () сначала установите ЖК-дисплей в режим 16x2 и отобразите приветственное сообщение в течение нескольких секунд.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print («ТАЙМЕРЫ ARDUINO»); задержка (2000); lcd.clear ();
Затем установите вывод светодиода как вывод OUTPUT, а кнопки установите как выводы INPUT.
pinMode (ledPin, ВЫХОД); pinMode (2, ВХОД); pinMode (4, ВХОД);
Затем отключите все прерывания:
noInterrupts ();
Затем инициализируется Timer1.
TCCR1A = 0; TCCR1B = 0;
Установлено значение таймера предварительной загрузки (изначально 3035).
TCNT1 = значение;
Затем в регистре TCCR1B устанавливается значение 1024 устройства предварительного масштабирования.
TCCR1B - = (1 << CS10) - (1 << CS12);
Прерывание переполнения таймера разрешено в регистре маски прерывания таймера, так что можно использовать ISR.
TIMSK1 - = (1 << TOIE1);
Наконец-то разрешены все прерывания.
прерывания ();
Теперь напишите ISR для прерывания переполнения таймера, которое отвечает за включение и выключение светодиода с помощью digitalWrite . Состояние изменяется всякий раз, когда происходит прерывание переполнения таймера.
ISR (TIMER1_OVF_vect) { TCNT1 = значение; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
В цикле void () значение preloader увеличивается или уменьшается с помощью кнопок ввода, а также значение отображается на ЖК-дисплее 16x2.
if (digitalRead (2) == HIGH) { значение = значение + 10; // Значение предварительной нагрузки цемента } if (digitalRead (4) == HIGH) { value = value-10; // Уменьшаем значение предварительной загрузки } lcd.setCursor (0,0); lcd.print (значение); }
Вот как можно использовать таймер для создания задержки в программе Arduino. Посмотрите видео ниже, где мы продемонстрировали изменение задержки путем увеличения и уменьшения значения предварительного загрузчика с помощью кнопок.