- Què és TIMER en electrònica integrada?
- Registres del temporitzador Arduino
- El temporitzador Arduino s’interromp
- Components necessaris
- Esquema de connexions
- Programació de temporitzadors Arduino UNO
La plataforma de desenvolupament Arduino es va desenvolupar originalment el 2005 com un dispositiu programable fàcil d’utilitzar per a projectes de disseny artístic. La seva intenció era ajudar els no enginyers a treballar amb electrònica bàsica i microcontroladors sense molt coneixement de la programació. Però després, a causa de la seva naturalesa fàcil d'utilitzar, aviat va ser adaptat per principiants i aficionats a l'electrònica de tot el món i, fins i tot, és fins i tot preferit per al desenvolupament de prototips i desenvolupaments de POC.
Tot i que està bé començar amb Arduino, és important passar lentament als microcontroladors bàsics com AVR, ARM, PIC, STM, etc. i programar-lo mitjançant les seves aplicacions natives. Això es deu al fet que el llenguatge de programació Arduino és molt fàcil d’entendre, ja que la major part del treball es realitza mitjançant funcions preconstruïdes com digitalWrite (), AnalogWrite (), Delay () etc. mentre el llenguatge de màquina de baix nivell s’amaga darrere d’ells. Els programes Arduino no són similars a altres codificacions Embedded C on tractem els bits de registre i els fem alts o baixos segons la lògica del nostre programa.
Temporitzadors Arduino sense demora:
Per tant, per entendre què està passant dins de les funcions preconstruïdes, hem d’excavar darrere d’aquests termes. Per exemple, quan s'utilitza una funció delay (), realment estableix els bits de registre de temporitzador i comptador del microcontrolador ATmega.
En aquest tutorial del temporitzador arduino, evitarem l'ús d'aquesta funció delay () i, en canvi, tractarem amb els registres mateixos. El millor és que podeu utilitzar el mateix IDE Arduino per a això. Establirem els bits de registre del temporitzador i utilitzarem la Interrupció de desbordament del temporitzador per commutar un LED cada vegada que es produeixi la interrupció. El valor de precàrrega del bit de temporitzador també es pot ajustar mitjançant botons per controlar la durada en què es produeix la interrupció.
Què és TIMER en electrònica integrada?
El temporitzador és una mena d’interrupció. És com un simple rellotge que pot mesurar l'interval de temps d'un esdeveniment. Tots els microcontroladors tenen un rellotge (oscil·lador), per exemple, a Arduino Uno són 16Mhz. Això és responsable de la velocitat. Com més alta sigui la freqüència del rellotge, major serà la velocitat de processament. Un temporitzador utilitza comptador que compta a una velocitat determinada en funció de la freqüència del rellotge. A Arduino Uno es necessiten 1/16000000 segons o 62nano segons per fer un sol recompte. Significat que Arduino passa d'una instrucció a una altra instrucció per cada 62 nano de segon.
Temporitzadors a Arduino UNO:
A Arduino UNO hi ha tres temporitzadors que s’utilitzen per a diferents funcions.
Temporitzador0:
És un temporitzador de 8 bits i s’utilitza en funcions de temporitzador com delay (), millis ().
Temporitzador 1:
És un temporitzador de 16 bits i s’utilitza a la servoteca.
Temporitzador 2:
És un temporitzador de 8 bits i s’utilitza en la funció tone ().
Registres del temporitzador Arduino
Per canviar la configuració dels temporitzadors, s’utilitzen registres de temporitzadors.
1. Registres de control de temporitzador / comptador (TCCRnA / B):
Aquest registre conté els principals bits de control del temporitzador i s’utilitza per controlar els precalificadors del temporitzador. També permet controlar el mode de temporitzador mitjançant els bits WGM.
Format del marc:
| 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 |
Preescalador:
Els bits CS12, CS11, CS10 de TCCR1B estableixen el valor del precalador. S’utilitza un precalificador per configurar la velocitat del rellotge del temporitzador. Arduino Uno té prescalers d’1, 8, 64, 256, 1024.
| CS12 | CS11 | CS10 | ÚS |
| 0 | 0 | 0 | Sense temporitzador de rellotge PARADA |
| 0 | 0 | 1 | CLCK i / o / 1 sense modificació prèvia |
| 0 | 1 | 0 | CLK i / o / 8 (de Prescaler) |
| 0 | 1 | 1 | CLK i / o / 64 (de Prescaler) |
| 1 | 0 | 0 | CLK i / o / 256 (de Prescaler) |
| 1 | 0 | 1 | CLK i / o / 1024 (de Prescaler) |
| 1 | 1 | 0 | Font de rellotge extern al pin T1. Rellotge a la caiguda |
| 1 | 1 | 1 | Font de rellotge extern al pin T1. Rellotge a la vora ascendent. |
2. Registre de temporitzadors / comptadors (TCNTn)
Aquest registre s’utilitza per controlar el valor del comptador i establir un valor de precàrrega.
Fórmula per al valor de precàrrega per al temps requerit en segons:
TCNTn = 65535 - (16x10 10 xTime en seg / valor de la mida prèvia)
Per calcular el valor de precàrrega del temporitzador 1 durant un temps de 2 segons:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
El temporitzador Arduino s’interromp
Prèviament hem conegut les interrupcions d’Arduino i hem vist que les interrupcions temporitzadores són una mena d’interrupcions de programari. A Arduino hi ha diverses interrupcions del temporitzador que s’expliquen a continuació.Interrupció del desbordament del temporitzador:
Sempre que el temporitzador arriba al seu valor màxim, per exemple, (16 bits-65535) es produeix la interrupció de desbordament del temporitzador . Així, es diu una rutina de servei d’interrupció ISR quan el bit d’interrupció de desbordament del temporitzador està habilitat al TOIEx present al registre TIMSKx de la màscara d’interrupció del temporitzador.
Format ISR:
ISR (TIMERx_OVF_vect) { }
Registre de comparació de sortida (OCRnA / B):
Aquí, quan es produeix la interrupció de comparació de sortida, es crida al servei d’interrupció ISR (TIMERx_COMPy_vect) i també s’establirà el bit de bandera OCFxy al registre TIFRx. Aquest ISR s'activa configurant el bit d'activació a OCIExy present al registre TIMSKx. On TIMSKx és Registre de màscares d'interrupció del temporitzador.
Captura d'entrada del temporitzador:
A continuació, quan es produeix la interrupció de captura d’entrada del temporitzador, es crida al servei d’interrupció ISR (TIMERx_CAPT_vect) i també el bit de senyal ICFx s’establirà a TIFRx (registre de senyal d’interrupció del temporitzador). Aquest ISR s'activa configurant el bit d'activació a ICIEx present al registre TIMSKx.
Components necessaris
- Arduino UNO
- Botons de pressió (2)
- LED (qualsevol color)
- Resistència de 10 k (2), 2,2 k (1)
- Pantalla LCD de 16x2
Esquema de connexions

Connexions de circuits entre Arduino UNO i pantalla LCD de 16x2:
|
LCD de 16x2 |
Arduino UNO |
|
VSS |
GND |
|
VDD |
+ 5V |
|
V0 |
Al pin central del potenciòmetre per al control de contrast de LCD |
|
RS |
8 |
|
RW |
GND |
|
E |
9 |
|
D4 |
10 |
|
D5 |
11 |
|
D6 |
12 |
|
D7 |
13 |
|
A |
+ 5V |
|
K |
GND |
Dos botons polsadors amb resistències de 10K estan connectats amb els pins Arduino 2 i 4 i un LED es connecta al PIN 7 d'Arduino mitjançant una resistència de 2,2K.
La configuració tindrà l'aspecte següent.
Programació de temporitzadors Arduino UNO
En aquest tutorial utilitzarem el TIMER OVERFLOW INTERRUPT i l’utilitzarem per parpellejar el LED ON i OFF durant una determinada durada ajustant el valor de la precàrrega (TCNT1) mitjançant els botons de pressió. Al final es dóna un codi complet per al temporitzador Arduino. Aquí expliquem el codi línia per línia:
Com que s’utilitza una pantalla LCD de 16x2 al projecte per mostrar el valor de la precarregadora, s’utilitza una biblioteca de cristalls líquids.
#incloure
El pin d'ànode LED que està connectat amb el pin 7 d'Arduino es defineix com ledPin .
#define ledPin 7
A continuació, es declara l'objecte per accedir a la classe Liquid Crystal amb els pins LCD (RS, E, D4, D5, D6, D7) que estan connectats amb Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
A continuació, configureu el valor de la precarregadora 3035 durant 4 segons. Comproveu la fórmula anterior per calcular el valor de la precàrrega.
valor flotant = 3035;
A continuació, en configuració nul·la (), primer configureu la pantalla LCD en mode 16x2 i mostreu un missatge de benvinguda durant uns segons.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("TEMPORITZADORS ARDUINO"); endarreriment (2000); lcd.clear ();
A continuació, configureu el pin LED com a pin OUTPUT i els botons polsadors es configuraran com a pins INPUT
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
A continuació, desactiveu totes les interrupcions:
noInterrupts ();
A continuació, s'inicialitza el Temporitzador1.
TCCR1A = 0; TCCR1B = 0;
Es defineix el valor del temporitzador de precàrrega (inicialment com a 3035).
TCNT1 = valor;
A continuació, el valor de l’escalador previ 1024 s’estableix al registre TCCR1B.
TCCR1B - = (1 << CS10) - (1 << CS12);
L'interrupció de desbordament del temporitzador està habilitada al registre de la màscara d'interrupció del temporitzador perquè es pugui utilitzar l'ISR.
TIMSK1 - = (1 << TOIE1);
Per fi, totes les interrupcions estan habilitades.
interrupcions ();
Ara escriviu el ISR per a la interrupció de desbordament del temporitzador que s’encarrega d’encendre i apagar el LED mitjançant digitalWrite . L'estat canvia sempre que es produeix la interrupció de desbordament del temporitzador.
ISR (TIMER1_OVF_vect) { TCNT1 = valor; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
En el bucle buit (), el valor del precarregador s'incrementa o disminueix mitjançant les entrades del polsador i el valor es mostra a la pantalla LCD de 16x2.
if (digitalRead (2) == HIGH) { valor = valor + 10; // Incrementa el valor de precàrrega } if (digitalRead (4) == HIGH) { value = value-10; // Valor de precàrrega de disminució } lcd.setCursor (0,0); lcd.print (valor); }
Així doncs, es pot fer servir un temporitzador per produir retards en el programa Arduino. Consulteu el vídeo següent a continuació, on hem demostrat el canvi de retard augmentant i disminuint el valor de la precàrrega mitjançant els botons de pressió.
