- Какво е TIMER във вградената електроника?
- Регистри на Arduino Timer
- Прекъсвания на таймера Arduino
- Необходими компоненти
- Електрическа схема
- Програмиране на Arduino UNO таймери
Платформата за развитие на Arduino първоначално е разработена през 2005 г. като лесно за използване програмируемо устройство за проекти за арт дизайн. Целта му беше да помогне на неинженерите да работят с основна електроника и микроконтролери без много познания по програмиране. Но след това, поради лесния за използване характер, скоро беше адаптиран от начинаещи и любители на електрониката по целия свят и днес дори е предпочитан за разработване на прототипи и POC разработки.
Въпреки че е добре да започнете с Arduino, важно е бавно да преминете към основните микроконтролери като AVR, ARM, PIC, STM и т.н. и да го програмирате с помощта на техните собствени приложения. Това е така, защото езикът за програмиране Arduino е много лесен за разбиране, тъй като по-голямата част от работата се извършва от предварително изградени функции като digitalWrite (), AnalogWrite (), Delay () и др., Докато машинният език на ниско ниво е скрит зад тях. Програмите Arduino не са подобни на други Embedded C кодиране, където се справяме с регистрационни битове и ги правим високи или ниски въз основа на логиката на нашата програма.
Таймери Arduino без забавяне:
Следователно, за да разберем какво се случва в предварително изградените функции, трябва да се разровим зад тези термини. Например, когато се използва функция за забавяне (), тя действително задава битовете на таймера и брояча на микроконтролера ATmega.
В този урок за таймер на arduino ще избегнем използването на тази функция delay () и вместо това ще се справим със самите регистри. Хубавото е, че можете да използвате същата IDE на Arduino за това. Ще зададем нашите битове за регистрация на таймера и ще използваме прекъсването за препълване на таймера, за да превключваме светодиод всеки път, когато настъпи прекъсването. Стойността на предварително зареждащото устройство на бита на таймера може също да се регулира с помощта на бутони за управление на продължителността, в която настъпва прекъсването.
Какво е TIMER във вградената електроника?
Таймерът е нещо като прекъсване. Това е като обикновен часовник, който може да измерва интервала от време на дадено събитие. Всеки микроконтролер има часовник (осцилатор), да речем в Arduino Uno е 16Mhz. Това е отговорно за скоростта. По-висока тактова честота по-висока ще бъде скоростта на обработка. Таймерът използва брояч, който отчита с определена скорост в зависимост от тактовата честота. В Arduino Uno са необходими 1/16000000 секунди или 62 нано секунди, за да се направи едно броене. Значение Arduino преминава от една инструкция към друга инструкция на всеки 62 нано секунди.
Таймери в Arduino UNO:
В Arduino UNO има три таймера, използвани за различни функции.
Таймер0:
Това е 8-битов таймер и се използва във функцията на таймера като закъснение (), милис ().
Таймер1:
Това е 16-битов таймер и се използва в серво библиотека.
Таймер 2:
Това е 8-битов таймер и се използва в функция tone ().
Регистри на Arduino Timer
За да промените конфигурацията на таймерите, се използват регистри на таймери.
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 (от Prescaler) |
0 | 1 | 1 | CLK i / o / 64 (от Prescaler) |
1 | 0 | 0 | CLK i / o / 256 (от Prescaler) |
1 | 0 | 1 | CLK i / o / 1024 (от Prescaler) |
1 | 1 | 0 | Външен източник на часовник на T1 Pin. Часовник на падащия ръб |
1 | 1 | 1 | Външен източник на часовник на щифт T1. Часовник на нарастващ ръб. |
2. Регистър на таймера / брояча (TCNTn)
Този регистър се използва за контрол на стойността на брояча и за задаване на стойност за предварително зареждане.
Формула за стойността на предварително зареждане за необходимото време във секунда:
TCNTn = 65535 - (16x10 10 xTime in sec / Prescaler Value)
За да изчислите стойността на предварително зареждане за таймер1 за време от 2 секунди:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Прекъсвания на таймера Arduino
Преди това научихме за Arduino Interrupts и видяхме, че таймерните прекъсвания са вид софтуерни прекъсвания. В Arduino има различни прекъсвания на таймера, които са обяснени по-долу.Прекъсване на препълването на таймера:
Винаги, когато таймерът достигне максималната си стойност, да речем например (16 бита-65535), възниква прекъсването на препълването на таймера . И така, извиква се рутинна услуга за прекъсване на ISR, когато битът за прекъсване на прекъсване на таймера е активиран в TOIEx, присъстващ в регистъра на маската за прекъсване на таймера TIMSKx.
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 (всеки цвят)
- 10k резистор (2), 2.2k (1)
- 16x2 LCD дисплей
Електрическа схема
Верижни връзки между Arduino UNO и 16x2 LCD дисплей:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Към централния щифт на потенциометъра за контрол на контраста на LCD |
RS |
8 |
RW |
GND |
Е. |
9 |
D4 |
10 |
D5 |
11. |
D6 |
12 |
D7 |
13 |
A |
+ 5V |
К |
GND |
Два натискащи бутона с изтеглящи надолу резистори от 10K са свързани с Arduino щифтове 2 и 4 и LED е свързан към PIN 7 на Arduino чрез 2.2K резистор.
Настройката ще изглежда като изображението по-долу.
Програмиране на Arduino UNO таймери
В този урок ще използваме ПРЕКРАТЯВАНЕТО НА ТАЙМЕРА ЗА ПРЕОТЕЧАНЕ и ще го използваме, за да премигнем светодиода ВКЛЮЧЕН и ИЗКЛЮЧЕН за определено време, като коригираме стойността на предварително зареждащото устройство (TCNT1) с помощта на бутони. Пълният код за Arduino Timer е даден в края. Тук обясняваме кода ред по ред:
Тъй като 16x2 LCD се използва в проекта за показване на стойността на предварително зареждане, така се използва библиотека с течни кристали.
#include
Светодиодният аноден щифт, който е свързан с Arduino pin 7, се определя като ledPin .
#define ledPin 7
След това обектът за достъп до клас Liquid Crystal се декларира с LCD щифтовете (RS, E, D4, D5, D6, D7), които са свързани с Arduino UNO.
LCD LiquidCrystal (8,9,10,11,12,13);
След това задайте стойността на предварителното зареждане 3035 за 4 секунди. Проверете формулата по-горе, за да изчислите стойността на предварително зареждане.
плаваща стойност = 3035;
След това при настройка за празнота (), първо настройте LCD дисплея в режим 16x2 и покажете приветствено съобщение за няколко секунди.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); забавяне (2000); lcd.clear ();
След това задайте LED щифта като ИЗХОД, а бутоните са като ИЗХОДИ
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
След това деактивирайте всички прекъсвания:
noInterrupts ();
След това таймерът1 се инициализира.
TCCR1A = 0; TCCR1B = 0;
Стойността на таймера за предварително зареждане е зададена (първоначално като 3035).
TCNT1 = стойност;
След това в регистъра TCCR1B се задава стойност 1024 на предварително скалиране.
TCCR1B - = (1 << CS10) - (1 << CS12);
Прекъсването на препълването на таймера е разрешено в регистъра на маска за прекъсване на таймера, за да може да се използва ISR.
TIMSK1 - = (1 << TOIE1);
Най-накрая всички прекъсвания са разрешени.
прекъсва ();
Сега напишете ISR за прекъсване на препълването на таймера, което е отговорно за включване и изключване на LED с помощта на digitalWrite . Състоянието се променя всеки път, когато възникне прекъсване на препълването на таймера.
ISR (TIMER1_OVF_vect) { TCNT1 = стойност; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
В цикъла void () стойността на предварително зареждащия продукт се увеличава или намалява с помощта на входовете с бутон, а също така стойността се показва на 16x2 LCD.
if (digitalRead (2) == HIGH) { стойност = стойност + 10; // Стойност на предварително зареждане на стимулиране } if (digitalRead (4) == HIGH) { value = value-10; // Декрементиране на стойността за предварително зареждане } lcd.setCursor (0,0); lcd.print (стойност); }
Така че по този начин таймерът може да се използва за забавяне в програмата Arduino. Проверете видеото по-долу, където демонстрирахме промяната в закъснението чрез увеличаване и намаляване на стойността на предварително зареждане с помощта на бутони.