Content uploaded by Vehbi Neziri
Author content
All content in this area was uploaded by Vehbi Neziri
Content may be subject to copyright.
Principi i punës së A/D konvertuesit në Atmega128
RAMADAN DERVISHI
VEHBI NEZIRI
Fakulteti i Inxhinierisë Elektrike dhe Kompjuterike
Universiteti i Prishtinës
Kodra e Diellit
10000 Prishtinë, Kosovë
dervishi@gmail.com
vehbineziri@gmail.com
I. ABSTRAKT
Pothuajse të gjitha sinjalet në botën reale janë analoge, si
drita, zëri, temperatura dhe dukuritë tjera të ngjashme.
Prandaj këto sinjale duhet të konvertohen në sinjale digjitale
duke përdorur qarqe të quajtura konvertues analog-digjital
apo ADC (Analog-to-Digital Converter) para se ato të mund
të përdoren nga pajisjet digjitale. Në brendi të këtij punimi
do të tregohet se çka janë ADC-të, më pas do të përshkruhet
principi i përgjithshëm i punës së tyre. Po ashtu do të
tregohen gjendjet e ndryshme të punës dhe do të bëhet
përshkrimi në detaje për këto gjendje të punës. Fokus i
veçantë do ti kushtohet konvertuesit në ATMEGA128.
Fjalët çelës: Atmega 128, A/D konvertuesi, Principi i
punës, konvertuesi analog-digjital, clock.
II. HYRJE
Shpesh është e nevojshme që të dhënat e marra nga një
sistem fizik të konvertohen në formë digjitale. Të dhënat e
tilla do të shfaqen zakonisht në formën analoge elektrike[1].
ADC është një pajisje që sinjalet e vazhdueshme i
konverton në vlera diskrete digjitale. ADC nevojitet në të
gjitha ato aplikacione të cilat kanë ndërlidhje me botën
analoge, ndërsa shfrytëzojnë procesimin digjital të
informacioneve. Procesimi digjital ka më shumë përparësi
se ai analog, për këtë rëndësia e ADC-së është rritur.
Përdorimi i ADC-së gjen zbatim në shumë fusha të jetës së
përditshme sidomos në ato procese ku ndonjë fenomen i
caktuar ka natyrë analoge, ndërsa procesimi i të dhënave
bëhet në mënyrë digjitale si p.sh matja e temperaturës, dritës,
procesimi i zërit etj. Pasi që bëhet konvertimi nga sinjali
analog në digjital atëherë kjo informatë mund të përpunohet
më lehtë dhe të paraqitet në formë më të përshtatshme për
njeriun, apo edhe për komunikim me pajise tjera. Sinjalet
analoge janë vështirë për tu ruajtur sepse kërkojnë memorie
analoge si p.sh kondensatorët [2].
III. PRINCIPI I PUNES SË A/D KONVERTUESIT
Ashtu siç u cek edhe në hyrje sinjalet në botën reale janë
analoge. P.sh kur të skanohet një fotografi apo dokument,
skaneri e bën konvertimin nga analog në digjital. Po ashtu
edhe kur bëhet regjistrimi i zërit ndodh procesi i konvertimi
të sinjalit nga analog në digjital. Ky proces ndodh edhe në
shume procese tjera si gjatë bisedës telefonike, gjatë
regjistrimi të CD-ve si de në shumë e shumë procese tjera
që ndodhin në natyrë. Nëse dëshirohet që sinjali analog të
kthehet përsëri pas konvertimit në digjital, atëherë përdoren
konvertuesit digjital-analog apo DAC[3].
Ka disa arsye pse bëhet konvertimi i sinjaleve nga analog në
digjital, një nga këto janë edhe zhurmat. Sistemet digjitale
kuptojnë vetëm dy vlera, 1 dhe 0 derisa sistemet analoge
mund të marrin secilën vlerë, prandaj aty mund të ketë edhe
zhurma. Një avantazh tjetër i sistemeve digjitale është se ato
kanë mundësinë e kompresimit të të dhënave. Konvertuesi
analog-digjital mund të konsiderohet si një kuti e mbyllur
siç shihet edhe në Fig. 1.
Konvertus analog-digjital
ADC
Vin
Hyrja analoge
D0
D1
D2
D3
D5
D6
D4
Dn
...
Dalja digjitale
Fig. 1 Konvertuesi analog-digjital ADC[3]
Ekzistojnë lloje të ndryshme të A/D konvertuesve. Ata
vijnë në shpejtësi të ndryshme, përdorin ndërfaqe të
ndryshme dhe përkrahin shkallë të ndryshme të saktësisë.
Punimi do të fokusohet në dy llojet më të popullarizuara:
Konvertuesit “Flash” dhe konvertuesit “successive
approximation”[4].
A. Konvertuesit Flash
Konvertuesit Flash janë më të shpejtë sesa llojet e tjera të
konvertuesve, por janë më të shtrenjtë se konvertuesit e tjerë.
ADC Flash përdorin komparatorët dhe një varg të
rezistorëve. ADC-të 4-bitësh kanë 16 komparatorë; ADC 8-
bitësh kanë 256 komparatorë. Të gjitha daljet e
komparatorëve lidhen tek një bllok logjik që determinon
daljen bazuar se cili komparator është i ultë e cili më i lartë.
Një konvertues flash përbëhet nga një numër i
komparatorëve të lidhur prej hyrjeve të invertuara (-).
3R
2
+
-
+
-
+
-
+
-
+
-
+
-
+
-
R
R
R
R
R
R
R
2
Enkoduesi 8/3
VREF
VIN
D0
D1
D2
Dalja digjitale
Hyrja analoge
Fig. 2 Konvertuesi Flash analog-digjital[1]
Vargu i rezistorëve është e lidhur në një njërën anë në një
tension 0V dhe në anën tjetër në një tension referent i cili
prodhon një rang fiks të tensionit përgjatë zinxhirit të
rezistorëve. Ky tension hyrës është ushqim për hyrjet e jo
invertuara (+) të të gjithë komparatorëve. Çdo komparator
krahason këtë tension me tensionin që ai pranon nga
zinxhiri[3].
Për shembull, në qoftë se është tension referent prej 5V,
kjo do të thotë se kulmi i sinjalit analog do të jetë 5V. Në
ADC-në 8-bitësh kur sinjal hyrës arrin 5V, atëherë në daljen
e ADC-së do të kemi 255 apo në binar 11111111, pra vlera
maksimale e mundshme[3].
B. Konvertuesit Successive approximation
Këta konvertues përdorin dizajnin e DAC. Janë më preciz
dhe kanë një kosto më të ulët se sa konvertuesit Flash.
Control logic Clock
+
-
DAC
Regjistri
successive approximation
D0D1D2
Komparatori
D3
Dalja
Vin
Fig. 3 Konvertuesi Successive appoximation[3]
Konvertimi me succsesive approximation behet në disa
hapa, çdo hap në një cikël të clock-ut, ku edhe sipas emrit të
këtij konvertuesi, konvertori punon duke e kërkuar
gradualisht daljen e saktë. Së pari vendoset vlera 1 në MSB
(1000) në SAR, pastaj kjo vlerë konvertohet në DAC dhe
krahasohet në komparator me vlerën që do të matet. Nëse
vlera është më e vogël apo me e madhe atëherë vazhdohet
duke e vendosur vlerën tjetër për krahasim kështu deri sa ta
arrihet vlera e barabartë me vlerën që do të matet.
IV. OPERIMI I A/D KONVERTORIT NË ATMEGA128
Konvertori A/D në ATMega 128 është i llojit succsesive
approximation. ADC konverton tensionin hyrës analog në
vlerë digjitale 10-bitëshe me successive approximation.
Vlera minimale është GND dhe vlera maksimale është
tensioni në pinin AREF. ADC aktivizohet duke vendosur
bitin në ADEN (ADC enable bit)[5]. Tensioni referues dhe
përzgjedhësi i kanaleve hyrëse nuk kanë efekt deri sa të
vendoset ADEN. ADC gjeneron rezultatin në 10 bit që ruhet
në regjistrat e ADC në ADCH dhe ADCL. ADC ka
interruptet e tij që mund të shkrepin (trigger) kur të
përfundon konvertimi. Nëse qasja e ADC në regjistrat e të
dhënave është e ndaluar në mes leximit të ADCH edhe
interrupti ADCL do të shkrep edhe nëse rezultati ka humbur.
Qarku me successive approximation punon me
frekuencën e clock-ut prej 50kHz deri në 200kHz, për të
arritur rezolucion maksimal. Nëse nevojitet rezolucion me i
ultë, atëherë frekuenca e clock-ut mund të jetë më e madhe
se 200kHz, në mënyrë që të kemi frekuencë më të lartë të
mostrimit. Moduli ADC e ka një përshkallëzues (prescaler) i
cili gjeneron një frekuencë të pranueshme të clock-ut të
ADC prej çfarëdo frekuence të CPU mbi 100kHz.
Përshkallëzues vendoset në bitët ADPS të regjistrit
ADCSRA.
Rezultatet e konvertimit. Pas kryerjes së konvertimit
(ADIF është në gjendje të lartë), rezultati i konvertimit
mund të gjendet në regjistrin e rezultateve të ADC (ADCL,
ADCH). Për konvertimin single-ended rezultati është[5]:
ADC=
ref
IN
V
V 1024*
Regjistrat e ADC
Regjistri i përzgjedhjes së multiplekserit ADMUX
4
3
2
1
Bit
7
6
5
0
MUX4
MUX3
MUX2
MUX1
Emri
REFS1
REFS1
ADLAR
MUX0
R/W
R/W
R/W
R/W
Read/Write
R/W
R/W
R/W
R/W
0
0
0
0
Vlera inic.
0
0
0
0
Bitët 7:6 janë bitët e përzgjedhjes së tensionit referues,
nëse bitët 7 dhe 6 ndryshojnë gjatë konvertimit, atëherë nuk
do ketë efekt deri sa të përfundojë konvertimi. Tabela në
vijim paraqet vlerat e bitëve 7 dhe 6 për zgjedhjen e
tensionit referent.
REFS1
REFS0
Tensioni referent
0
0
AREF
0
1
AVCC me kondensator në pinin AREF
1
0
I rezervuar
1
1
Tensioni referent interno 2.56 V me
kondensator në pinin AREF
Biti 5, ADLAR është bit që konfiguron ruajtjen e
rezultatit të ADC në regjistra. Nëse ADLAR është 1, atëherë
rezultati është i vendosur prej pjesës së majtë, në të
kundërtën është prej pjesës së djathtë. Ndërrimi i vlerës së
këtij regjistri ndikon menjëherë në regjistrin e të dhënave pa
marrë parasysh se a është duke u kryer ndonjë konvertim.
Bitët 4:0, MUX4:0 janë bit me të cilët përzgjidhen nyjat
analoge që do të lidhen në ADC, gjithashtu bëhet edhe
përzgjedhja e shkalles së përforcimit të sinjalit në kanalet
diferenciale.
Regjistri i kontrollit dhe statusit të ADC: A-ADCSRA
4
3
2
1
Bit
7
6
5
0
ADIE
ADPS2
ADPS1
MUX1
Emri
ADEN
ADSC
ADFR
ADPS0
R/W
R/W
R/W
R/W
Read/Write
R/W
R/W
R/W
R/W
0
0
0
0
Vlera inic.
0
0
0
0
Biti 7-ADEN: ADC Enable, në momentin e shkrimit të
vlerës 1 në këtë bit aktivizohet ADC dhe me shkrimin e
vlerës 0, ADC ndalet. Nëse gjatë konvertimit ADC ndalet
atëherë edhe konvertimi ndërpritet.
Biti 6 ADSC: ADC Start Conversation, në modin Single
conversation në këtë bit duhet të shkruhet 1 për çdo
konvertim, ndërsa në modin Free Running në këtë bit
shkruhet 1 vetëm për të filluar konvertimin e parë.
Konvertimi i parë fillon pasi që është shkruar 1 në ADEN
pastaj edhe në bitin ADSC. Nëse shkruhet 1 në të dy këta bit
njëkohësisht, atëherë konvertimi i parë do të fillojë pas 25
cikleve të clockut. Pasi që kryhet konvertimit vlera e ADSC
kthehet në zero. Shkrimi i vlerës 0 në këtë bit nuk ka efekt.
Biti 5-ADFR: ADC Free Running Select, me shkrimin e
vlerës 1 në këtë bit, ADC operon në modin Free Running
(për me shumë në pjesën V).
Biti 4-ADIF: ADC Interrupt Flag, ky bit vendoset me
rastin e përfundimit të konvertimit dhe regjistrat e të
dhënave ndryshohen. Interrupti i kompletimit të konvertimit
ekzekutohet nëse biti ADIE dhe biti I në SREG vendosen.
Biti 3-ADIE: ADC Interrupt Enable, nëse në këtë bit
shkruhet 1 dhe biti 1 i SREG është vendosur, atëherë
interrupti i kompletimit të konvertimit aktivizohet.
Biti 2:0-ADPS2:0: ADC Prescaler Select Bits, këta bita
mundësojnë përzgjedhjen e përshkallëzuesit. Faktori ndarës
përcaktohet varësisht prej vlerës së këtyre bitëve si në tabelë:
ADPS2
ADPS1
ADPS0
Faktori ndarës
0
0
0
2
0
1
0
4
0
0
1
2
0
1
1
8
1
0
0
16
1
1
0
64
1
0
1
32
1
1
1
128
Regjistri i të dhënave i ADC- ADCL dhe ADCH, kur të
përfundon konvertimi, rezultati gjendet në këta dy regjistra.
Nëse përdoren kanale diferenciale, atëherë rezultati gjendet
në formën e 2 komplementit (2’).
ADLAR=0
4
3
2
1
Bit
7
6
5
0
-
-
-
ADC9
ADCH
-
-
-
ADC8
R/W
R/W
R/W
R/W
Read/Write
R/W
R/W
R/W
R/W
0
0
0
0
Vlera inic.
0
0
0
0
ADC4
ADC3
ADC2
ADC1
ADCL
ADC7
ADC6
ADC5
ADC0
ADLAR=0
4
3
2
1
Bit
7
6
5
0
ADC6
ADC5
ADC4
ADC3
ADCH
ADC9
ADC8
ADC7
ADC2
R/W
R/W
R/W
R/W
Read/Write
R/W
R/W
R/W
R/W
0
0
0
0
ADCL
ADC1
ADC1
0
0
V. MODET E OPERIMIT TË A/D KONVERTORIT NË ATMEGA128
Modet e operimit të A/D konvertorit janë[3]:
a) Modi Free running
b) Modi Single Conversion
a) Modi Free running, në ketë mod ADC
vazhdimisht bën mostrimin dhe azhurnimin e
regjistrave të të dhënave. Ky mod zgjidhet duke
vendosur ‘1’ logjik në bitin ADFR në regjistrin
ADCSRA. Konvertimi fillon doke shkruar 1
logjik në bitin ADSC në regjistrin ADSCRA.
Nëse gjatë konvertimit zgjidhet ndonjë kanal
tjetër ADC së pari e përfundon konvertimin
pastaj e ndërron kanalin. Kanali hyrës në këtë
mod duhet të zgjidhet para fillimit të konvertimit
apo duhet të pritet deri sa të përfundojë
konvertimi pastaj të zgjidhet kanali. Në modin
free running konvertimi i ri nis menjëherë pas
përfundimit të konvertimi paraprak pasi që biti
ADSC mbetet ‘1’.
b) Modi Single Conversion, konvertimi fillon duke
e shkruar ‘1’ logjik ne bitin ADSC (ADC Start
Conversion bit). Ky bit do te mbetet ‘1’ deri sa
te përfundon konvertimi dhe pastaj pastrohet
prej hardueri. Konvertimi normal të ky mod i
punës zgjat 13 cikle të clock-it të ADC.
Konvertimi i parë bëhet pasi që ADC
aktivizohet në (vendoset 1 në ADEB në
regjistrin ADSCEA) i cili zgjat 25 cikle të
clock-ut të ADC. Pasi që kryhet konvertimi
rezultati ruhet në regjistrat e ADC-së dhe
vendoset bit në ADIF. Në këtë mod biti ADSC
pastrohet pasi që të përfundon konvertimi dhe
për të filluar konvertimin tjetër duhet të
vendoset prapë ky bit dhe pas vendosjes do të
fillon konvertimi.
ADIF mund të vendoset edhe përmes softuerit.
VI. PËRDORIMI I INTERRUPTEVE NË ADC NË ATMEGA128
ADC ka interruptin e tij i cili shkrep me rastin e
kompletimit të konvertimit. Aktivizimi i interruptit të
kompletimit në ADC në Atmega128 bëhet nëse vendoset
vlera logjike ‘1’ në bitin ADIE (ADC Interrupt Enable) të
regjistrit ADCSRA dhe biti I i SREG është vendosur. Me
rastin e përfundimit të konvertimit biti 4 ADIF vendoset dhe
vlera e regjistrave të dhënave ndryshohet. Biti I mund të
vendoset dhe të fshihet me instruksionet SEI dhe CLI.
Me shkrepjen e interruptit, ekzekutohet një Interrupt
Service Routine (ISR), ku pas përfundimit të këtij
ekzekutimi vazhdon ekzekutimi i programit aty ku ka
mbetur. Në ISR shkruhen veprimet që duhet të bëhen me
rastin e shkrepjes së një interrupti të caktuar[6]. Në shtojcë
është një shembull i përdorimit të interruptit në ADC.
VII. KONKLUZION
Konvertimi i sinjaleve analoge në ato digjitale në
ATmega128 bëhet kryesisht në konvertimin e temperaturës
apo edhe konvertimin e intensitetit të dritës. Pas konvertimit
rezultati mund të paraqitet në ndonjë formë më të
lexueshme për njeriun si p.sh në LED, indikator 7
segmentesh apo edhe në LCD Display. Saktësia e matjes së
këtyre fenomeneve natyrore nuk do të thotë që është e saktë
100%, por kjo varet prej karakteristikave të konvertuesit AD.
Në bazë të dokumentacionit të ATmega128 për matjen e
temperaturës, senzori i temperaturës bën matje në rangun
prej -40
o
C deri në +100
o
C. Varshmëria e ndryshimit të
temperaturës në ndryshimin e tensionit është 10mV për
o
K
(Kelvin), ku 0mV do të thotë 0
o
K, ku saktësia e konvertimit
varet direkt prej karakteristikave të elementeve që e
përbejnë këtë proces.
REFERENCES
[1] Jacob Millman, Arvin Grabel, MICROELECTRONICS Second
edition.
[2] Behzad Razavi, Fundamentals of Microelectronics; ISBN: 978-0-
471-47846-1
[3] http://www.hardwaresecrets.com/article/317
[4] Owen Bishop, Microelectronics – Systems and Devices; ISBN 0
7506 4723 X
[5] ATMEL AVR, 8-bit Microcontroller with 128K Bytes In-
System Programmable Flash, ATMega128 Datasheet, Rev.
2467R–AVR–06/08
[6] http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewto
pic&t=56429
ANNEX
#include <avr/io.h>
#define BV(bit) (1<<(bit))
#define vendos_bit(reg, bit) reg |=
(BV(bit))
#define largo_bit(reg, bit) reg &=
~(BV(bit))
void inic_ADC(char modi);
int main(void)
{
unsigned short vleraH,vleraL;
DDRE = 0xff; // vendos LED1 si
//dalje
DDRG = 0xff; // vendos LED2 si
//dalje
inic_ADC(1);//inicializon ADC dhe
// vendos modin e punes
//0-Single Conversion,
//tjera vlea free
running
vendos_bit(ADCSRA,ADSC);
while(true)
{
while(ADCSRA & 0b01000000);
vleraH=ADCH;
vleraL=ADCL;
//vendosja e vleres se konvertimit ne
//LED1 dhe LED2
PORTE=vleraH;
PORTG=vleraL
if (!(ADCSRA & BV(ADFR)))//nese
//nuk eshte ne modin Free
//Runninf ,vendos bit ne ADSC
//te rexhistrit ADCSRA
{
vendos_bit(ADCSRA,ADSC);
}
}
return 0;
}
void inic_ADC(char modi) //inicializimi
//i ADC dhe vendosja e modit te punes
{
vendos_bit(ADCSRA,ADEN); //enable
//ADC
if(modi==0) //ne modin e punes
//Single conversation
{
largo_bit(ADCSRA,ADFR);
}
else //per vlera tjera, ne modin
//free running
{
vendos_bit(ADCSRA,ADFR);
}
ADCSRA = ((ADCSRA & 0b11111000) |
0b00000110);
ADMUX = ((ADMUX & 0b00111111) |
0b01000000);
ADMUX &= 0b11100000;
largo_bit(ADMUX,ADLAR);
}
Shembull i përdorimit të interruptit[6].
#include <avr/io.h>
#include <avr/interrupt.h>
int main (void)
{
DDRE = 0xff; // vendos portin si
//dalje
DDRG = 0xff; // vendos portin si
//dalje
ADCSRA |= (1 << ADPS2) | (1 << ADPS1)
| (1 << ADPS0); // Vendos ADC prescaler
//në 128 - 125KHz me frekuencë të
//mostrimit @ 16MHz
ADMUX |= (1 << REFS0); // vendos
//referencën e ADC ne AVCC
ADMUX |= (1 << ADLAR); // Left adjust
//ADC rezultatin
ADCSRA |= (1 << ADFR); // vendos ADC
//ne modin free running
ADCSRA |= (1 << ADEN); // Aktivizo
//ADC
ADCSRA |= (1 << ADIE); // Aktivizo
//ADC Interruptin
sei(); // Aktivizo Global
//Interruptat
ADCSRA |= (1 << ADSC); // Starto
//konvertimin
for(;;) // Loop forever
{
}
}
ISR(ADC_vect) // Interrupt Service
//Routine
{
if(ADCH < 128)
{
PORTE |= (1 << 2); // ndez LED1
PORTG &= ~(1 << 0); // fik LED2
}
else
{
PORTE &= ~(1 << 2); // Fik LED2
PORTG |= (1 << 0); // ndez 1
}
}