Sunteți pe pagina 1din 6

Textul si imaginile din acest document sunt licentiate

Attribution-NonCommercial-NoDerivs
CC BY-NC-ND
Codul sursa din acest document este licentiat
Public-Domain
Esti liber sa distribui acest document prin orice mijloace consideri (email, publicare pe website / blog, printare,
sau orice alt mijloc), atat timp cat nu aduci nici un fel de modificari acestuia. Codul sursa din acest document
poate fi utilizat in orice fel de scop, de natura comerciala sau nu, fara nici un fel de limitari.
Arduino comparatorul intern
Ce este comparatorul ?
In electronica digitala, comparatorul este un mic dispozitiv care compara 2 tensiuni sau curenti
si produce un semnal care iti spune care din cele doua este mai mare. Acesta este rolul de baza al
comparatorului. El este format din doua intrari analogice si o singura iesire digitala. Intrarile analogice
sunt marcate cu V+ si V, iar iesirea digitala cu Vo. Iesirea poate genera doar 2 stari si anume! "#$ logic
daca intrarea V+ este mai mare decat intrarea V sau poate genera "%$ logic daca intrarea V+ este mai
mica decat intrarea V.
In aceeasi maniera functioneaza si comparatorul placii Arduino si daca vrei sa descoperi in ce
situatii poti sa il folosesti, atunci viziteaza lin&urile de mai 'os!
(ttp!))***.electronicsblog.net)ver+simplearduinocapacitancemeterusing#,bittimerand
analogcomparator)
-oti sa iti construiesti un capacimetru folosind o placa Arduino, comparatorul intern si timerul
placii sau un osciloscop digital!
(ttp!))***.instructables.com)id).irino/astArduino0scilloscope)1A223TE-3
Afla ca exista si o librarie Arduino care te poate a'uta foarte mult in proiectele tale!
(ttp!))***.leonardomiliani.com)2%#2)analogcompunalibreriapergestireilcomparatore
analogico)1lang4en
Cum genereaza intreruperi comparatorul intern ?
-e langa faptul ca poate compara 2 semnale asta fiind functia lui, comparatorul poate genera si
intreruperi. Asta inseamna ca poti scrie un program care sa execute "ceva$, iar atunci cand apare o
http://www.robofun.ro/forum
situatie exterioara, spre exemplu! iesirea unui senzor a depasit o valoare de referinta, atunci placa
Arduino poate sa raspunda prompt la intrerupere, opreste executia normala a programului si executa
codul asociat intreruperii.
In programarea de nivel scazut 5lo* level6 poti sa spui ca microcontrollerul executa rutina I37
5Interrupt 3ervice 7outine6.
Iata cum arata o rutina I37 care deserveste o intrerupere generata de comparatorul intern!
ISR(ANALOG_COMP_vect)
{
digitalWrite(13, !digitalRead(13))
!
3tructura intreruperii este simpla si anume! I37 este o instructiune macro pe care compilatorul
o detecteaza automat si o interpreteaza ca si rutina I37. Asa ca ori de cate ori comparatorul intern
genereaza o intrerupere, microcontrollerul opreste executia normala a programului si executa toate
liniile de cod din aceasta rutina. Apoi se intoarce de unde a plecat si continua cu executia programului
principal.
2in&ul de mai 'os te a'uta sa descoperi si alte intreruperi pe care le poti gestiona cu rutina I37,
pentru ca nu doar comparatorul intern poate genera intreruperi, dar mai sunt si alte module interne!
(ttp!))***.nongnu.org)avrlibc)usermanual)group88avr88interrupts.(tml
Cum se configureaza comparatorul intern ?
2a nivel de cod, configurarea comparatorului este simpla. Configurarea este totusi necesara
pentru functionarea corecta a comparatorului. Tot ce trebuie sa faci este sa accesezi un registru si sa
setezi anumiti biti. 2ucrul asta il vei face in rutina setup56. 3pre exemplu iata cum se configureaza
comparatorul intern!
v"id #et$%() {
%i&M"de(',INP())
%i&M"de(13, O()P())
digitalWrite(13, LOW)
Serial*+egi&(,-..)
ACSR / 0.1.11.1.
!
2inia de cod cu care nu esti tocmai familiar este AC37 4 9%#%##%#%. Indicatorul 9 din fata
sirului de biti ii indica compilatorului ca are dea face cu un sir de biti si nu o valoare numerica. AC37
este registrul de status si control al comparatorului analogic si are urmatoarea structura de biti!
AC:, AC9., AC0, ACI, ACIE, ACIC, ACI3#, ACI3%
http://www.robofun.ro/forum
/iecare bit are rolul lui. :aca te uiti la linia de cod de mai sus vei observa ca placa seteaza niste
biti pe "#$ si alti biti ii pastreaza pe "%$.
-rin setarea bitului AC9., placa Arduino va selecta singura tensiunea de referinta pentru
intrarea pozitiva a comparatorului. Aduti aminte ca un comparator are 2 intrari 5una pozitiva, cealalta
negativa6 si o iesire. -ractic placa Arduino va alege singura o tensiune de prag pentru intrarea pozitiva
care este de aproximativ #,2V. Intrarea negativa este accesibila la pinul digital ;. 2a acest pin tu vei aplica
o tensiune analogica pe care doresti ca placa Arduino sa o compare cu tensiunea de referinta 5#,2V6.
-rin setarea bitului ACI se sterge bitul de flag al intreruperii. 2ucrul asta te a'uta pentru ca in
primul moment de functionare al placii pot aparea intreruperi false si c(iar daca vor aparea, bitul flag
este sters deocamdata si placa nu raspunde la aceste intreruperi.
-rin setarea bitului ACIE 5Analog Comparator Interrupt Enable6 se activeaza intreruperea
comparatorului intern asa ca ori de cate ori apare o tranzitie sau o sc(imbare la iesirea comparatorului,
acesta va genera o intrerupere, iar placa Arduino va executa rutina I37.
-rin setarea bitilor ACI3# si ACI3%, comparatorul va genera intreruperi pe frontul descrescator
al iesirii, adica atunci cand iesirea trece din "#$ in "%$ logic.
Totusi ce valori are iesirea comparatorului 1
Intotdeauna iesirea va fi "#$ daca tensiunea de referinta este mai mare decat tensiunea aplicata
pe pinul digital ;. In sc(imb iesirea comuta in "%$ daca tensiunea de pe pinul ; creste si depaseste
tensiunea de referinta. Cu alte cuvinte, cand are loc aceasta tranzitie din "#$ in "%$, comparatorul
genereaza o intrerupere, iar placa Arduino executa rutina I37 asociata.
Cum testez codul pe o placa Arduino ?
Tot ce trebuie sa faci este sa incarci s&etc(ul de mai 'os. Copiaza codul sursa si incarcal in
placa Arduino.
v"id #et$%() {
%i&M"de(',INP())
%i&M"de(13, O()P())
digitalWrite(13, LOW)
Serial*+egi&(,-..)
ACSR / 0.1.11.1.
!
v"id l""%() {
!
http://www.robofun.ro/forum
ISR(ANALOG_COMP_vect) {
digitalWrite(13, !digitalRead(13))
!
/olosindute de un fir, conecteaza pinul marcat cu <V la pinul digital ; 5atentie mare sa nu il
conectezi la pinul VI= deoarece poate duce la defectarea placii6. Apoi incepe si comuta firul de pe pinul
<V pe pinul .=:. :e fiecare data cand comuti, poti observa ca se aprinde ledul, adica se executa linia
de cod digital>rite5#?, @digital7ead5#?66A din interiorul rutinei I37.
Iata un alt exemplu!
v"id #et$%() {
Serial*+egi&(,-..)
ACSR /
(. 11 AC2) 3
(. 11 AC0G) 3
(. 11 ACO) 3
(1 11 ACI) 3
(1 11 ACI4) 3
(. 11 ACIC) 3
(1 11 ACIS1) 3
(1 11 ACIS.)
%i&M"de(13, O()P())
%i&M"de(,, O()P())
!
v"id l""%() {
i5(ACSR 6 (1 11 ACO))
digitalWrite(,, 7IG7)
el#e
digitalWrite(,, LOW)
dela8(1..)
!
ISR(ANALOG_COMP_vect ) {
digitalWrite(13, !digitalRead(13))
!
:e aceasta data poti observa o forma noua de scriere a registrului AC37. 3pre deosebire de
s&etc(ul precedent acesta compara nivelele semnalelor aduse pe pinii digitali , si ; 5mai sus programul
compara tensiunea de pe pinul ; cu tensiunea de referinta interna6.
http://www.robofun.ro/forum
3pre exemplu, poti folosi acest s&etc( pentru a regla temperatura intro incinta. -entru asta vei
avea nevoie de urmatoarele componente!
0 placa Arduino B=0
Bn tranzistor TI-#22 bric& (ttp!))***.robofun.ro)bric&s)tranzistortip#22bric&
sau o placa 2 relee 3-:T (ttp!))***.robofun.ro)placa828relee8#2vdc
Bn microventilator (ttp!))***.robofun.ro)electronice)generale)microventilator#2V
Bn alimentator extern (ttp!))***.robofun.ro)surse8de8alimentare)alimentatoare
Bn senzor de temperatura bric& (ttp!))***.robofun.ro)bric&s)senzortemperaturabric&
7ezistoare pentru a construi un divizor rezistiv (ttp!))***.robofun.ro)electronice)rezistoare
:e ce tranzistorul TI-#22 bric& 1 -entru ca tranzistorul iti permite sa comanzi o sarcina de
putere mare direct cu placa Arduino. -e de alta parte, poti opta pentru placa cu 2 relee 3-:T daca
doresti sa comanzi nu unul, ci doi consumatori care se alimenteaza in curent alternativ.
Cum se conecteaza componentele de mai sus 1
Cai intai vei incepe cu ventilatorul sau sursa de putere pe care doresti sa o comanzi. /irele
ventilatorului se conecteaza in conectorul marcat cu C0T07 de pe placa tranzistorului.
-entru tranzistorul TI-#22! pinii marcati cu VI= si .=: se conecteaza la bornele "+$ si "$
ale sursei de alimentare, iar pinul marcat cu I= la pinul digital #? de pe placa Arduino.
-entru senzorul de temperatura bric&! pinii VCC si .=: la pinii <V si .=: de pe placa
Arduino, iar pinul 0BT de pe senzorul bric& la pinul digital ;.
:ivizorul rezistiv 1 Aici trebuie sa descoperi cum sa conectezi 2 rezistori la pinul digital ,,
pentru ca aici vei alege tensiunea de prag la care se va declansa ventilatorul.
Totusi iti raman foarte multe lucruri de facut. 3pre exemplu, trebuie sa descoperi ce tensiune
scoate senzorul bric&, trebuie sa calculezi divizorul rezistiv si sa modifici s&etc(ul de mai sus pentru a
efectua comanda ventilatorului cu grade variabile de turatie.
http://www.robofun.ro/forum