- Co to jest TIMER w elektronice wbudowanej?
- Rejestry czasowe Arduino
- Przerwania timera Arduino
- Wymagane składniki
- Schemat obwodu
- Programowanie timerów Arduino UNO
Platforma programistyczna Arduino została pierwotnie opracowana w 2005 roku jako łatwe w użyciu programowalne urządzenie do projektów artystycznych. Jego zamiarem była pomoc nieinżynierom w pracy z podstawową elektroniką i mikrokontrolerami bez dużej wiedzy programistycznej. Ale potem, ze względu na swój łatwy w użyciu charakter, wkrótce został zaadaptowany przez początkujących elektroników i hobbystów na całym świecie, a dziś jest nawet preferowany do rozwoju prototypów i rozwoju POC.
Chociaż można zacząć od Arduino, ważne jest, aby powoli przechodzić do podstawowych mikrokontrolerów, takich jak AVR, ARM, PIC, STM itp., I programować je przy użyciu ich natywnych aplikacji. Dzieje się tak, ponieważ język programowania Arduino jest bardzo łatwy do zrozumienia, ponieważ większość pracy jest wykonywana przez gotowe funkcje, takie jak digitalWrite (), AnalogWrite (), Delay () itp., Podczas gdy język maszynowy niskiego poziomu jest ukryty za nimi. Programy Arduino nie są podobne do innych kodowań Embedded C, w których mamy do czynienia z bitami rejestru i ustawiamy je jako wysokie lub niskie w oparciu o logikę naszego programu.
Timery Arduino bez opóźnienia:
Dlatego, aby zrozumieć, co dzieje się wewnątrz gotowych funkcji, musimy sięgnąć po te terminy. Na przykład, gdy używana jest funkcja delay (), ustawia ona bity rejestru timera i licznika mikrokontrolera ATmega.
W tym samouczku dotyczącym timera arduino zamierzamy unikać używania tej funkcji delay () i zamiast tego zajmować się samymi rejestrami. Dobrą rzeczą jest to, że możesz do tego użyć tego samego Arduino IDE. Ustawimy nasze bity rejestru timera i użyjemy przerwania przepełnienia timera do przełączania diody LED za każdym razem, gdy wystąpi przerwanie. Wartość bitu timera ładowania wstępnego można również regulować za pomocą przycisków do sterowania czasem trwania przerwania.
Co to jest TIMER w elektronice wbudowanej?
Timer jest rodzajem zakłócenia. To jest jak prosty zegar, który może mierzyć przedział czasu zdarzenia. Każdy mikrokontroler ma zegar (oscylator), powiedzmy w Arduino Uno jest to 16Mhz. To jest odpowiedzialne za szybkość. Im wyższa częstotliwość zegara, tym wyższa prędkość przetwarzania. Timer używa licznika, który zlicza z określoną prędkością w zależności od częstotliwości zegara. W Arduino Uno pojedyncze zliczenie zajmuje 1/16000000 sekund lub 62nano sekund. Oznacza to, że Arduino przechodzi od jednej instrukcji do drugiej co 62 nanosekundy.
Timery w Arduino UNO:
W Arduino UNO są trzy timery służące do różnych funkcji.
Timer0:
Jest to 8-bitowy zegar używany w funkcjach timera, takich jak delay (), millis ().
Timer1:
Jest to 16-bitowy zegar używany w bibliotece serw.
Timer2:
Jest to 8-bitowy zegar używany w funkcji tone ().
Rejestry czasowe Arduino
Do zmiany konfiguracji timerów używane są rejestry timera.
1. Rejestry kontrolne timera / licznika (TCCRnA / B):
Rejestr ten zawiera główne bity sterujące timera i jest używany do sterowania preskalatorami timera. Pozwala również na sterowanie trybem timera za pomocą bitów WGM.
Format ramki:
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 |
Prescaler:
Bity CS12, CS11, CS10 w TCCR1B ustawiają wartość preskalera. Do ustawienia szybkości zegara timera służy preskaler. Arduino Uno ma preskalery 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | POSŁUGIWAĆ SIĘ |
0 | 0 | 0 | Brak zegara STOP |
0 | 0 | 1 | CLCK i / o / 1 Bez przeskalowania |
0 | 1 | 0 | CLK i / o / 8 (z preskalera) |
0 | 1 | 1 | CLK i / o / 64 (z preskalera) |
1 | 0 | 0 | CLK i / o / 256 (z preskalera) |
1 | 0 | 1 | CLK i / o / 1024 (z preskalera) |
1 | 1 | 0 | Zewnętrzne źródło zegara na pinie T1. Zegar na opadającej krawędzi |
1 | 1 | 1 | Zewnętrzne źródło zegara na pinie T1. Zegar na zboczu narastającym. |
2. Rejestr czasowy / licznika (TCNTn)
Rejestr ten jest używany do sterowania wartością licznika i ustawiania wartości modułu wstępnego ładowania.
Wzór na wartość modułu wstępnego ładowania dla wymaganego czasu w sekundach:
TCNTn = 65535 - (16x10 10 xTime w sekundach / wartość preskalera)
Aby obliczyć wartość modułu ładowania wstępnego dla timera1 dla czasu 2 sek.:
TCNT1 = 65535 - (16x10 10 X2 / 1024) = 34285
Przerwania timera Arduino
Wcześniej dowiedzieliśmy się o przerwaniach Arduino i widzieliśmy, że przerwania timera są rodzajem przerwań programowych. W Arduino występują różne przerwania czasowe, które zostały wyjaśnione poniżej.Przerwanie przepełnienia timera:
Ilekroć licznik czasu osiągnie swoją maksymalną wartość, powiedzmy na przykład (16 bitów-65535), następuje przerwanie przepełnienia timera . Tak więc procedura obsługi przerwań ISR jest wywoływana, gdy bit przerwania przepełnienia timera włączony w TOIEx obecny w rejestrze maski przerwań timera TIMSKx.
Format ISR:
ISR (TIMERx_OVF_vect) { }
Rejestr porównania wyjść (OCRnA / B):
W tym przypadku, gdy wystąpi przerwanie dopasowania dopasowania wyjścia, wywoływana jest usługa przerwania ISR (TIMERx_COMPy_vect), a także bit flagi OCFxy zostanie ustawiony w rejestrze TIFRx. Ten ISR jest włączany przez ustawienie bitu włączania w OCIExy obecnego w rejestrze TIMSKx. Gdzie TIMSKx jest rejestrem maski przerwań timera.
Przechwytywanie wejścia timera:
Następnie, gdy wystąpi przerwanie przechwytywania wejścia zegara, wywoływana jest usługa przerwania ISR (TIMERx_CAPT_vect), a także bit flagi ICFx zostanie ustawiony w TIFRx (Rejestr znacznika przerwania timera). Ten ISR jest włączany przez ustawienie bitu włączającego w ICIEx obecnego w rejestrze TIMSKx.
Wymagane składniki
- Arduino UNO
- Przyciski (2)
- LED (dowolny kolor)
- Rezystor 10k (2), 2,2k (1)
- Wyświetlacz LCD 16x2
Schemat obwodu
Połączenia obwodów między Arduino UNO a wyświetlaczem LCD 16x2:
Wyświetlacz LCD 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Do środkowego kołka potencjometru do kontroli kontrastu wyświetlacza LCD |
RS |
8 |
RW |
GND |
mi |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
ZA |
+ 5V |
K. |
GND |
Dwa przyciski z rezystorami pull down 10K są połączone z pinami 2 i 4 Arduino, a dioda LED jest podłączona do PIN 7 Arduino poprzez rezystor 2,2K.
Konfiguracja będzie wyglądać jak na poniższym obrazku.
Programowanie timerów Arduino UNO
W tym samouczku użyjemy TIMER OVERFLOW INTERRUPT i użyjemy go do włączania i wyłączania diody LED przez określony czas, dostosowując wartość modułu wstępnego ładowania (TCNT1) za pomocą przycisków. Kompletny kod dla Arduino Timer podano na końcu. Tutaj wyjaśniamy kod linia po linii:
Ponieważ w projekcie używany jest wyświetlacz LCD 16x2 do wyświetlania wartości modułu wstępnego ładowania, wykorzystywana jest biblioteka ciekłokrystaliczna.
#zawierać
Pin anody LED, który jest połączony z pinem 7 Arduino, jest zdefiniowany jako ledPin .
# zdefiniować ledPin 7
Następnie zadeklarowany jest obiekt dostępu do klasy Liquid Crystal za pomocą pinów LCD (RS, E, D4, D5, D6, D7), które są połączone z Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Następnie ustaw wartość modułu wstępnego ładowania na 3035 na 4 sekundy. Sprawdź powyższy wzór, aby obliczyć wartość modułu wstępnego ładowania.
wartość zmiennoprzecinkowa = 3035;
Następnie w void setup (), najpierw ustaw LCD na tryb 16x2 i wyświetlaj wiadomość powitalną na kilka sekund.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); opóźnienie (2000); lcd.clear ();
Następnie ustaw pin LED jako pin OUTPUT, a przyciski ustaw jako pin INPUT
pinMode (ledPin, OUTPUT); pinMode (2, WEJŚCIE); pinMode (4, WEJŚCIE);
Następnie wyłącz wszystkie przerwania:
noInterrupts ();
Następnie inicjalizowany jest Timer1.
TCCR1A = 0; TCCR1B = 0;
Ustawiono wartość timera modułu wstępnego ładowania (początkowo 3035).
TCNT1 = wartość;
Następnie w rejestrze TCCR1B ustawiana jest wartość 1024 przed skalowaniem.
TCCR1B - = (1 << CS10) - (1 << CS12);
Przerwanie przepełnienia timera jest włączone w rejestrze maski przerwań timera, dzięki czemu można używać ISR.
TIMSK1 - = (1 << TOIE1);
W końcu wszystkie przerwania są włączone.
przerwania ();
Teraz napisz ISR dla przerwania przepełnienia timera, który jest odpowiedzialny za włączanie i wyłączanie diody LED za pomocą digitalWrite . Stan zmienia się za każdym razem, gdy wystąpi przerwanie przepełnienia timera.
ISR (TIMER1_OVF_vect) { TCNT1 = wartość; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
W pustej pętli () wartość preloadera jest zwiększana lub zmniejszana za pomocą wejść przycisków, a także wartość jest wyświetlana na wyświetlaczu LCD 16x2.
if (digitalRead (2) == HIGH) { wartość = wartość + 10; // Wartość wstępnego wczytywania } if (digitalRead (4) == HIGH) { wartość = wartość-10; // Zmniejsz wartość wstępnego ładowania } lcd.setCursor (0,0); lcd.print (wartość); }
Tak więc można użyć timera do wytworzenia opóźnienia w programie Arduino. Sprawdź poniższy film, w którym pokazaliśmy zmianę opóźnienia poprzez zwiększanie i zmniejszanie wartości modułu wstępnego ładowania za pomocą przycisków.