Библиотека на TimerOne
Когато програмирате за Arduino, понякога трябва периодично да извършвате някакво действие на определени интервали - да речем, 100 пъти в секунда; или искате да имате ШИМ с по-висока разделителна способност или различна честота, отколкото позволява стандартната функцияanalogWrite(), или изведнъж искате да вършите някаква работа паралелно и вездесъщиятdelay()разваля всичко. Тук може да бъде полезна библиотекатаTimerOne, която ще ви опиша накратко.
Тази библиотека ви позволява да използвате един от таймерите в AVR MK, инсталиран на платки Arduino, за ваши собствени цели. Има 3 хардуерни таймера в ATmega168 и ATmega328 (има 6 в ATmega1280 и ATmega2560) и те се наричат Timer0, Timer1 и Timer2. Всички те се използват за PWM във функциятаanalogWrite(), но ширината на такъв PWM е ограничена от най-малката ширина на бита на таймерите, а Timer0 и Timer2 са 8-битови, така че максималната стойност, коятоanalogWrite()приема е 255. Но Timer1 е 16-bit! За да използва силата на този таймер, един мил човек написа библиотеката TimerOne. Нека изтеглим библиотеката от тук, инсталираме я и видим какви методи са налични в библиотеката:
Този метод трябва да бъде извикан за инициализиране на таймера, преди да бъдат извикани други. По подразбиране интервалът за отговор е зададен на 1 секунда, но можете да посочите свой собствен в микросекунди. Минималният наличен интервал е 1 микросекунда. След инициализация, щифтове 9 и 10 на Arduino (11 и 12 на Arduino Mega) могат да се използват от библиотеката PWM, но PWM наanalogWrite()на тези щифтове ще спре, ако е бил разрешен преди извикването наinitialize(). Докато работите с библиотеката TimerOne, не извиквайтеanalogWrite() за пинове, изброени по-горе, и обратно.
Задава интервала на таймера в микросекунди. Минималният интервал е 1 µs (съответно максималната честота е 1 MHz), максималният интервал е 8388480 µs (около 8,4 s).
Задава PWM запълването за посочения пин, ако PWM вече е активиран на него.
Изключва ШИМ на избрания пин.
Задава функция (манипулатор на прекъсвания), която да бъде извикана, когато посоченият интервал на таймера изтече. Такава функция трябва да изглежда така:
Параметърътperiod, както обикновено, задава интервала на задействане (и, както винаги, за целия таймер). Трябва да внимавате да не изпълнявате твърде много код в манипулатора, в противен случай главният цикъл (цикъл) може изобщо да не получи контрол. Ако зададете периода на 1 µs, тогава такъв резултат е практически гарантиран, т.к през това време AVR с 16 MHz кварц (както на Arduino) ще има време да изпълни инструкции за около дузина цикъла - тоест, добавете няколко числа и дори за единdigitalWrite () това време не е достатъчно. По принцип не съветвам да инсталирате манипулатор за периоди по-малки от 100 μs (0,1 ms), ако не сте изчислили времето за изпълнение на манипулатора по цикли и не сте 100% сигурни, че ще има достатъчно време (:
Деактивира манипулатора на прекъсвания.
Стартира таймера, ако е бил спрян.
Лесно е да се измисли приложение за всичко това: първото нещо, което ми дойде на ум, беше мигач с два светодиода, не само безdelay(), но и без нашето участие изобщо. Светодиодите ще бъдат на щифтове 9 и 10:
Е, какво друго може да се направи с помощта на TimerOne зависи от вашето въображение.