Sunteți pe pagina 1din 62

Microcontrolere si sisteme

integrate (incorporate-
embedded systems)

ATMEL AVR 8 biți: Intrări


analogice, sistemul de conversie
analog-numerică

1
2 aplicaţii foarte simple pentru care am avea
nevoie si de intrări analogice

MCU

MCU

Măsurarea luminozităţii cu ajutorul unei Măsurarea temperaturii


fotorezistenţe si a unui divizor rezistiv cu un termistor NTC, a unui
Un fotorezistenţă (LDR – Light Dependent divizor rezistiv si a unui repetor
Resistor) este o rezistenţă (neliniară) a Un termistor NTC (Negative
cărei valoare scade cu creşterea intensităţii Temperature Coefficient
luminii incidente thermistor) este o rezistenţă (neliniară)
a cărei valoare scade cu creşterea
2 exemple f. simple de senzori rezistivi temperaturii 2
împreună cu circuitele aferente de adaptare
Intrare analogică = transformarea unei unei
mărimi fizice analogice intr-una numerică
(digitizarea)
Zgomot
electromagnetic

Proces/ MCU
Mediu Prelucrare
înconjurător

Mărime Adaptare CAN N -


Senzor/ Filtrare mărime
fizica, poate
Traductor numerică
fi si V1 V2 V3
neelectrică codificată
binar
Tensiuni
Bloc de prelucrare
analogică a semnalului

CAN – Convertor Analog Numeric


3
ADC – Analog to Digital Converter
Conversia analog-numerică
Un exemplu de
Vin
CAN de 3 biţi A
(n=3)
N
Numărul N este
exprimat pe 3 biţi:
a2, a1, a0
a2 - este MSB
a0 - este LSB
Rezoluţia (analogica)
8 valori
diferite

r = 5/8 = 0.625V
r = Vmax / 2n

max
Conversia analog
numerica introduce Vin
întotdeauna o eroare
de cuantificare O infinitate de valori
LSB – Least Significant Bit , cel mai puţin semnificativ bit 4
MSB – Most Significant Bit , cel mai semnificativ bit
Eroarea de cuantificare
Vin Rezoluţia analogică (in unităţi ale mărimii de
A intrare): r = V max /2n
biţi
Rezoluţia numerică: n biţi
Vmax
N
Caracteristici statice de transfer
CAN ideal
n→∞
r→0

Vin (V) Vin (V)

Eroarea analogică = r Eroarea analogică : ± r/2


Eroarea numerică = 1 LSB Eroarea numerică : ± 1/2 LSB

Un CAN are rezoluţia adevărată de n biţi doar dacă eroarea numerică este ± 1/2 LSB
5
Exista si alte erori: liniaritate, decalaj (offset), câştig, ..
Ce facem in cazul mărimilor variabile in timp,
perioada de eşantionare
Vin (V) In « faţa » CAN se află un circuit de
O infinitate de valori eşantionare/memorare (Sample/Hold)
care prelevează in mod regulat o valoare
Vin si o menţine constantă un interval de
timp Te pană la prelevarea eşantionului
următor (o memorie analogică)
Tensiunea de intrare in CAN
Te Timpul de conversie al CAN
trebuie să fie inferior lui Te

Comanda circuitului de eşantionare


perioada de eşantionare este Te , frecvenţa de
eşantionare este Fe = 1/Te

Conversia analog numerică implică o dublă cuantificare:


• cuantificare temporală (eşantionare propriu-zisă)
• cuantificare in amplitudine (rezoluţia)
6
Aliasing
Exemplu: un semnal sinusoidal de perioada T eşantionat cu Te= 1.25 T
T
Fe= 0.8 F

T' = 5 T
F' = 0.2 F
F' = F - Fe

Te=1.25 T

Teorema lui SHANNON :


( Criteriul lui Nyquist )
Spectrul real al « Replicarea »
semnalului de Fe > 2 . Fmax
spectrului
eşantionat
Fmax : frecvenţa maximă din
spectrul lui Uin
La intrarea CAN (înainte de
F
circuitul de eşantionare
/memorare) este necesar un
filtru trece jos (FTJ) cu frecvenţa 7
de tăiere Fc = Fe/2
Schema principială a unui circuit de
eşantionare / memorare (S/H)

Repetor (opamp)
Repetor (opamp) Comutator / cheie
de tensiune

Vo
C
Semnal Vc
Vi de ceas
Capacitor
de memorare

8
Principiul de funcţionare al unui circuit
de eşantionare / memorare (S/H)
V3
Vi
V2 V4
V1 V5

t
Semnal K inchis
ceas
K deschis
V3 t
Vc=Vo V4
V2
V5
V1
t
Th Ts Th Ts

Th timp de memorare (hold)


Ts timp de eşantionare (sample) Aici Vc =Vo urmăreşte tensiunea de intrare
9
Sistemul de conversie analog-
numerică (Sistemul CAN)
• Anumite microcontrolere AVR, în toate sub familiile (doar anumite Tiny,
majoritatea Mega), au printre resursele de tip periferic şi un sistem de
conversie analog-numerică, cu mai multe canale de intrare.
• Mărimea de intrare pe un astfel de canal este întotdeauna de natura unei
tensiuni, astfel că orice altă mărime analogică, de altă natură (curent,
rezistenţă, etc.) care se doreşte măsurată, trebuie convertită mai întâi in
tensiune si scalată corespunzător domeniului tensiunii de intrare pentru
canalele de intrare
• Sistemul constă in: un multiplexor analogic si un convertor analog-
numeric de tipul cu aproximări succesive (include un circuit eşantionare
– memorare: Sample/Hold) şi o sursă de referinţă de tensiune, internă
si/sau externă).
• Utilizarea unui circuit de eşantionare-memorare este esenţială dacă CAN-ul
este de tipul cu aproximări succesive
– Pentru acest tip de CAN, orice modificare a mărimii de intrare, pe durata
conversiei, mai mare de ±1 LSB, poate duce la erori grosolane
• Descrierea care urmează este bazată pe sistemul de conversie analog-
numeric existent la familia ATMega (de exemplu ATMega 16).

10
Schema bloc funcţională a sistemului de
conversie analog numerică AVR

ADC7
ADC6 Registru rezultat
ADC5
Octet superior (ADCH)
N
Vin
ADC4 CAN 10 biţi 10 biti
ADC3
Multiplexor CAN 10bits
ADC2 Registru rezultat
Vref+
ADC1 Octet inferior (ADCL)
ADC0

Registru de control Registru de control/


ADMUX stare ADCSRA

Registru de control
SFIOR 11
Convertorul analogic-numeric (CAN): schema bloc
detailată (ATMega16)

Registrele utilizator

Sursa referinţa
interna

Convertorul analog numeric -


cu aproximaţii succesive

Multiplexorul analogic Amplificator programabil (nu exista la 12


orice varianta!)
Sistemul de conversie analog-
numerică (Sistemul CAN)
• Din punct de vedere al utilizatorului există, odată, 8 intrări analogice
asimetrice (notate ADC7..ADC0) care de fapt sunt cele 8 canale de intrare
ale unui multiplexor analogic.
• Cele 8 intrări analogice sunt de fapt funcţii alternative ale pinilor portului A
(PORTA) - la ATMega16/32.
• Tensiunile de intrare, în acest mod asimetric, sunt raportate faţă de borna
de masă GND, care defineşte potenţialul de 0V.
– In acest mod putem avea maxim 8 canale de intrare
• Există însă şi posibilitatea ca aceste canale de intrare să fie folosite şi într-
un mod diferenţial.
– Sunt posibile până la 16 combinaţii, toate descriind diferite moduri de intrare
diferenţială.
– In acest mod putem avea maxim 4 intrări diferenţiale adevărate (fiecare utilizând
2 pini) si maxim 7 intrări pseudo diferenţiale (de exemplu, borna inversoare Vin-
de intrare este ADC1, celelalte 7 canale fiind utilizate ca borne de intrare
neinversoare Vin+).
– Doar in modul diferențial se pot măsura tensiuni “negative”, sursa echivalenta
având borna negativa conectata la Vin+ si borna pozitiva la Vin-

13
Intrarea asimetrică si/sau diferenţială
Intrare asimetrică (single ended) – o singură
borna de intrare, cealaltă bornă este la masă

Intrare diferenţială (differential) – nici o bornă


la masă, avem o bornă de intrare pozitivă (In+) sau
neinversoare si una de intrare negativă (In-)
sau inversoare

14
Multiplexorul analogic (ca exemplu, un
multiplexor 4:1)
Doar unul singur este închis la un moment dat,
altcumva scurtcircuităm sursele de tensiune de la intrări!

K1
I0
4 Intrări K2
I1 1 Ieşire
Analogice K3 - O
I2 + Analogică
(tensiuni K4
I3 (tensiune
faţă de faţă de masă)
masă) S1 S2
Semnale de
selecţie
(numerice!)
Multiplexorul analogic este o reţea de comutatoare (chei)
electronice de tensiune Ki, care sunt comandate de o logică de
decodificare, prin intermediul unor semnale de selecţie (S1, S2
reprezintă “adresa” intrării pe care vreau să o aduc la ieşire) 15
Intrări analogice: ATMega
ATmega 32 (identic cu ATMega16) ATmega 8 (doar 6 intrări)

16
Intrări analogice: ATtiny 15 si ATtiny 24
ATtiny 15 are doar 4 canale
analogice ADC0..ADC3

Datorită numărului redus de pini,


nu au borne AVcc si AVREF, se pot utiliza
doar cu sursa de referinţă internă
ATtiny 24/44/84 are 8 canale
analogice ADC0..ADC7

17
Convertorul analogic-numeric
• Pentru ATMEGA 16, două dintre intrările - perechile diferenţiale (ADC1/ADC0 şi
ADC3/ ADC2) pot utiliza un amplificator de câştig programabil (Gain Amplifier),
cu paşii de amplificare de 0 dB (x1), 20dB (x10), sau 46 dB (x200).
– Utilizarea acestui câştig (GAIN) programabil reduce rezoluţia.
– Dacă este selectat câştigul de x1 sau x10, rezoluţia rezultată va fi de 8 biţi, iar dacă este
selectat câştigul de x200, rezoluţia rezultată va fi de 7 biţi.
• Datorită tehnicii de conversie utilizată (aproximări succesive) sistemul conţine şi un
circuit eşantionare şi memorare (Sample Hold - S/H) conectat între ieşirea
multiplexorului analogic şi intrarea convertorului, care asigură menţinerea
constantă a tensiunii de intrare a CAN–ului pe toată durata conversiei.
• Convertorul analog-numeric este unul având rezoluţia de 10 biţi utilizând metoda
aproximărilor succesive
– Eroarea totală este de ± 2 LSB, deci el nu are precizia unui CAN de 10 biti (nu are rezoluţia
adevărată de 10 biţi!)
– Sunt necesari 2 octeţi pentru memorarea rezultatului conversiei.
• Există o conexiune externă separată, AVCC pentru alimentarea sistemului CAN.
• AVCC nu trebuie să difere cu mai mult decât ±0.3V faţă de VCC (alimentarea
numerică).
• Există şi o sursă de referinţă internă de 2.56V (valoarea poate fi diferită funcţie de
variantă!) precum şi un pin dedicat VREF pentru conectarea unei referinţe externe.
• Caracterizarea preciziei acestui sistem de conversie (erori: liniaritate, offset, câştig,
etc.) este detailată în foile de catalog Atmel.

18
Convertorul analogic-numeric: registrele
• Sistemul CAN este configurat şi controlat prin
intermediul unor registre mapate în spaţiul I/O.
• Există o serie de biţi de comandă şi control a căror
semnificaţie particulară va fi detailată .
• Registrele de comandă, control si stare sunt:
– ADMUX - prin intermediul lui se stabileşte canalul de intrare al
multiplexorului, modul de intrare (asimetric sau diferenţial),
câştigul programabil şi se selectează referinţa care va fi utilizată
– ADCSRA – este registrul de control şi stare al convertorului
analog numeric şi este o colecţie de biţi de control şi stare
– SFIOR – în acest registru există un câmp de 3 biţi prin care se
selectează cine va declanşa operaţia de conversie

19
Combinaţiile posibile (ex. ATMega16)
de intrări si câştig pentru
amplificatorul programabil (MUX4..MUX0)

ADMUX
Selectarea sursei
de referinţă

Dar există si variante (ex.


ATMega169) care nu au un
un amplificator cu câştig
programabil
Tabela este diferită pentru
20
acestea !
Intrarea asimetrică si/sau diferenţială:
selecţia canalului/canalelor de intrare
MUX 4…MUX0= 00000 MUX 4…MUX0= 10001

Vin Vin+

Vin-

21
Conversia analog-numerică
• Funcţionarea convertorului analog numeric (si in particular cea a unuia cu
aproximaţii succesive) este una periodizată cu ajutorul unui semnal de
ceas si a unei maşini secvenţiale sincrone
• Exista mai multe etape/faze ale procesului de conversie analog-numerică
realizat de acest convertor
• Procesul începe cu declanşarea operaţiei de conversie (SOC- Start Of
Conversion) si se termină cu finalizarea conversiei (EOC- End Of
Conversion), atunci când valoarea numerică rezultată este integral
disponibilă pentru utilizator
• Pentru un CAN cu aproximaţii succesive una din fazele importante este cea
de eşantionare/memorare (S/H- Sample/Hold)
• Utilizatorul (programatorul) trebuie să aibă mijloace specifice pentru a
controla declanşarea operaţiei de conversie si pentru a determina momentul
când s-a finalizat operaţia de conversie
• In cazul AVR aceste mijloace specifice sunt, in primul rând, biţii de
comandă/control precum si cei de stare din registrele aferente CAN
• Nu in ultimul rând, CAN este integrat in sistemul de întreruperi AVR, CAN
având un vector de întrerupere dedicat

22
Registrul SFIOR- cine declanşează
si porneşte conversia?

8 moduri diferite de a
declanşa o operaţie de
conversie analog numerică:
- Auto-declanşare, conversie
liberă
- De către comparatorul analogic
- De către pinul INT0
- De către sistemul de temporizare
numărare (5 moduri)

Ceilalţi biţi nu ţin de sistemul CAN!


23
Registrele ADCH si ADCL – rezultatul
operaţiei de conversie analog numerică
• Rezultatul conversiei, pe 10 biti, este disponibil, după finalizarea
conversiei, în registrele ADCL şi ADCH.
– Implicit, valoarea pe 10 biţi este aliniată la dreapta, dar se poate
alinia şi la stânga setând bitul ADLAR în ADMUX.
– Dacă rezultatul este aliniat la stânga şi dacă o precizie de 8 biţi
suficientă, atunci se poate citi/utiliza doar ADCH.
• Altcumva, trebuie citit mai întâi ADCL, urmat obligatoriu de
ADCH, pentru a garanta apartenenţa la aceeaşi conversie a
conţinutului registrelor de date.
– Odată ce ADCL este citit, actualizarea registrelor de date este blocată
până la citirea lui ADCH.
– Aceasta înseamnă că dacă ADCL a fost citit, şi o altă conversie s-a
încheiat înainte ca ADCH să fie citit, registrele nu sunt actualizate şi
rezultatul conversiei este pierdut.
• Sistemul de conversie analog-numeric este integrat cu sistemul de
întreruperi AVR, tipic finalizarea unei conversii putând declanşa o
cerere de întrerupere.
– Rezultatul conversiei poate fi citit/salvat in rutina de tratare a întreruperii
24
ADCH si ADCL

Aliniere la dreapta (implicită, dupa reset )


MSB

MSB Aliniere la stânga

MSB=ADC9, cel mai semnificativ bit al rezultatului 25


Declanşarea unei operaţii de conversie
• O conversie singulară este una declanşată “manual” scriind un “1”
logic în bitul de start al conversiei ADSC (Analog to Digital Start
Conversion) din registrul ADCSRA.
– Acest bit se va menţine în “1” logic atât timp cât conversia este în curs
de desfăşurare şi va fi şters hard când conversia este completă.
– Dacă un alt canal de intrare este selectat în timpul conversiei, se va
aştepta finalizarea conversiei curente înainte de a se schimba canalul.
• Starea bitului ADSC poate să fie folosită pentru a determina
dacă o conversie este în curs de desfăşurare.
– El va fi citit în “1” pe durata unei conversii, indiferent de modul de
declanşare a conversiei.
• “Sursa” după care se va face declanşarea conversiei este selectată
prin câmpul de biţi ADTS din registrul SFIOR.

26
Registrul ADCSRA
O conversie poate fi declanşată si în mod
„automat” în mai multe moduri (folosind
mai multe surse potenţiale de declanşare).
Declanşarea automată este activată
setând bitul ADATE în ADCSRA

Sistemul de conversie analog-numeric


este activat, în ansamblul său, prin
setarea bitului ADEN (Analog to Digital
conversion ENable) din ADCSRA.
Sistemul CAN are un consum
nesemnificativ atunci când ADEN este
şters, lucru de care trebuie ţinut seama
când se intră în unul din modurile “Sleep”
(ADEN trebuie să fie şters).
27
Declanşarea si pornirea unei operaţii de
conversie
• La apariţia unui front crescător al semnalului ales de declanşare,
divizorul de frecvenţă (prescaler) care generează semnalul de ceas
pentru convertor va fi resetat şi conversia este pornită.
• Aceasta reprezintă o metodă de a realiza o conversie repetată, la
intervale fixe de timp sau, cu alte cuvinte, de a periodiza conversia.
– Dacă un nou front crescător apare în timpul conversiei, el va fi ignorat.
• Bitul ADIF din registrul ADCSRA este setat în momentul finalizării
conversiei şi al actualizării registrelor de date.
• Deşi el este destinat generării unei cereri de întrerupere (IF –
Interrupt Flag) el va fi setat chiar dacă respectiva întrerupere este
dezactivată sau bitul global de întrerupere I din SREG este şters.
– O conversie poate astfel să fie declanşată/finalizată fără să producă şi o
întrerupere

28
Declanşarea unei operaţii de conversie

• Modificarea stării bitului ADIF poate fi folosită ca sursă de


declanşare, determinând convertorul să pornească o nouă
conversie, de îndată ce conversia în curs de desfăşurare a luat
sfârşit.
• Astfel convertorul funcţionează în modul numit “Free Running”
(achiziţie liberă, automată), eşantionând şi actualizând în mod
constant registrele de date, cu o viteză dictată practic de timpul de
conversie şi de cel de preluare a datelor.
• Prima conversie trebuie să fie declanşată scriind un “1” logic în bitul
ADSC din ADCSRA.
• În acest mod se vor face conversii succesive indiferent dacă bitul
ADIF este sau nu şters de utilizator.
• Chiar dacă auto-declanşarea este activată, conversiile singulare pot
fi declanşate prin setarea bitului ADSC.

29
Controlul vitezei de conversie
• Durata unei operaţii de conversie (sau timpul de conversie care
este invers proporţional cu viteza de conversie) depinde de factorul
de divizare programat precum şi de frecvenţa oscilatorului de
ceas sistem (CK).
• Sursa de ceas pentru convertorul analog-numeric este un divizor
programabil de frecvenţă (prescaler) de 7 biţi, având ca semnal de
ceas ceasul unităţii centrale CK=fCPU.
• Factorul de divizare (2, 4, 8, 8, 16, 32, 64 şi 128) poate fi programat
de utilizator prin intermediul câmpului de biţi ADPS din registrul
ADCSRA (figura).
• Divizorul de frecvenţă va începe să funcţioneze din momentul
activării sistemului CAN, prin setarea bitului ADEN din ADCSRA.

30
Registrul ADCSRA: factorul de
divizare

Funcţie de starea programată pentru aceşti biţi ADPSi


se stabileşte viteza de conversie (timpul de conversie): ei
controlează un factor de divizare programabil al ceasului
sistem

31
Viteza de conversie =
1 / Timpul de conversie
• Convertorul analog-numeric AVR asigură rezoluţia maximă
adevărată de 10 biţi pentru frecvenţe ale ceasului CAN între 50 KHz
şi 200 KHz.
• Dacă este necesară o frecvenţă de eşantionare mai mare, cu o
rezoluţie adevărată mai mică de 10 biţi (cu o precizie mai mică),
frecvenţa ceasului poate fi şi mai mare de 200 KHz.
• Atunci când se lansează o conversie singulară, setând bitul ADSC
în ADCSRA, conversia va începe pe următorul front crescător al
ceasului CAN.
• O conversie obişnuită durează 13 cicluri (perioade) de ceas CAN.
• Prima conversie după activarea CAN-ului (când este setat ADEN în
ADCSRA) durează însă 25 cicluri de ceas CAN, cicluri necesare şi
pentru iniţializarea circuitului analogic.
• Eşantionarea şi memorarea propriu-zisă durează 1.5 cicluri de ceas
CAN după pornirea unei conversii, dar durează 13.5 cicluri CAN
după pornirea primei conversii.

32
Timpul de conversie
• Când este folosită auto-declanşarea (free running), divizorul de frecvenţă va
fi şi resetat în momentul declanşării.
• Aceasta asigură o întârziere fixă din momentul declanşării până la pornirea
conversiei.
• În acest mod, eşantionarea şi memorarea durează 2 cicluri de ceas CAN,
după frontul crescător declanşator.
• Trei cicluri suplimentare de ceas CPU sunt folosite pentru logica de
sincronizare.
• Când se foloseşte modul de intrare diferenţial împreună cu auto-
declanşarea de la o altă sursă decât finalizarea conversiei curente, fiecare
conversie va necesita 25 cicluri (perioade) de ceas CAN.
• Aceasta datorită faptului că, după fiecare conversie, CAN-ul trebuie să fie
dezactivat şi apoi reactivat.
– O evaluare a timpului de conversie, exprimat in perioade ale sistemului de ceas
CAN, este dată în tabelul din slide-ul următor
• Practic, timpul de conversie, pentru o frecvenţa de ceas sistem de 8
MHz, poate fi de la ordinul x 10 μsec până la ordinul x100 sau x1000
μsec

33
Conversie singulară, prima
conversie

34
Conversie singulară, conversie
normală (următoarele conversii)

35
Conversie automată (auto-
declanşată)

36
Timpul de conversie
Timpul total de
Timpul de eşantionare şi conversie
urmărire (Cicluri / perioade (Cicluri /
Condiţia
ale ceasului de la începutul perioade ale
conversiei) ceasului
CAN)

Prima conversie 14.5 25

Conversii normale,
1.5 13
mod asimetric
Conversii auto-
2 13.5
declanşate

Conversii normale,
1.5/2.5 13/14
mod diferenţial
37
Modul de intrare diferenţial
• Există anumite aspecte ale conversiei analog numerice care trebuie
să fie luate în consideraţie atunci când se folosesc canalele de
intrare în mod diferenţial (conversii diferenţiale).
• Conversiile diferenţiale sunt sincronizate cu un ceas intern CKADC2
egal cu jumătate din ceasul CAN.
– Această sincronizare se face în mod automat astfel încât eşantionarea
şi memorarea să aibă loc într-o fază specifică a lui CKADC2.
• O conversie iniţiată de utilizator (toate conversiile singulare şi prima
conversie în modul “ Free Running”) atunci când CKADC2 este “0”
va dura aceeaşi perioadă de timp ca şi o conversie asimetrică (13
cicluri de ceas CAN).
• O conversie iniţiată de utilizator când CKADC2 este “1” va dura 14
cicluri de ceas CAN datorită mecanismului de sincronizare.
• În modul “Free Running”, o nouă conversie este iniţiată îndată ce
conversia anterioară este completă, şi deoarece CKADC2 este “1”
logic în acest moment, toată conversiile pornite automat în modul
“Free Running” (mai puţin prima) vor dura 14 cicluri de ceas CAN.

38
Modul de intrare diferenţial
• Etajul de amplificare programabilă care poate fi utilizat numai în
modul diferenţial este optimizat pentru o lărgime de bandă
(bandwidth) de 4 KHz, pentru amplificările posibile.
– Frecvenţele mai mari pot fi afectate de o amplificare neliniară.
– Este recomandată o filtrare trece-jos externă, dacă semnalul de
intrare conţine componente de frecvenţă mai mare decât lărgimea de
bandă.
– Nu există însă nici o legătură între frecvenţa de ceas CAN şi lărgimea
de bandă, putându-se realiza şi folosi rate de eşantionare mult mai mari
decât cele care ar rezulta din corelarea cu lărgimea de bandă.
• Dacă este utilizat modul de intrare diferenţial şi conversiile sunt
pornite în mod automat, convertorul trebuie să fie oprit între
conversii.
• Când este folosită auto-declanşarea, divizorul de frecvenţă este
resetat înainte de pornirea conversiei.
• Astfel, deoarece câştigul este dependent de un ceas CAN stabil pe
perioada anterioară conversiei, această conversie nu va fi validă.
• Dezactivând şi apoi reactivând CAN–ul între conversii (scriind
în ADEN din ADCSRA “0” şi apoi “1”) se vor executa doar
conversii extinse, dar al căror rezultat va fi întotdeauna valid.
39
Comutarea canalelor de intrare sau
a referinţei
• Pentru comutarea (selectarea) canalului de intrare sau a
referinţei se utilizează câmpurile de biţi MUXn şi REFS
din registrul ADMUX, care sunt de fapt memorate într-un
registru temporar.
• Aceasta garantează că selectarea referinţei sau a
canalului se vor face numai în momente de timp sigure
în timpul conversiei.
• Selectarea referinţei şi canalului se poate face
oricând o conversie nu este pornită (nu este in curs
de desfăşurare)!
• Odată conversia pornită, selectarea referinţei şi canalului
este blocată pentru a se garanta un timp de eşantionare
suficient.
• Este recomandat să nu se încerce selectarea unui nou
canal sau a unei noi referinţe imediat după ce bitul
ADSC este setat, aşteptându-se finalizarea conversiei. 40
Comutarea canalelor de intrare si/sau a
sursei de referinţă (1)
• Dacă este folosită auto-declanşarea, momentul exact al declanşării nu este
precis determinat.
– Este necesară o atenţie specială la actualizarea registrului ADMUX, pentru a
controla şi a şti ce conversie va fi afectată de noile configurări.
• Dacă atât bitul ADATE cât şi bitul ADEN sunt în “1”, setarea bitului ADIF
poate avea loc în orice moment.
• Dacă registrul ADMUX este actualizat în această perioadă, utilizatorul nu va
putea discerne dacă conversia următoare este bazată pe vechea sau pe
noua configurare (de pe care canal provine valoarea).
• ADMUX poate fi actualizat într-un mod sigur astfel:
– când bitul ADATE sau bitul ADEN este şters.
– în timpul conversiei, după minim un ciclu de ceas CAN de la momentul
declanşării.
– după terminarea unei conversii, înaintea de ştergerea bitului ADIF folosit ca
sursă de declanşare.
• La actualizarea lui ADMUX în aceste condiţii, noile configurări vor afecta
următoarea conversie.

41
Comutarea canalelor de intrare si/sau a
sursei de referinţă (2)
• Comutarea canalelor, în modul de intrare diferenţial, pune şi ea nişte
probleme mai deosebite.
• Din momentul comutării canalelor (al actualizării registrului ADMUX)
durează aproximativ 125 µs până ce câştigul programat se va
stabiliza la noua valoare.
• Astfel conversiile ar trebui să fie pornite la cel puţin după 125 µsec
de la realizarea noii selecţii sau rezultatele conversiei pe această
perioadă nu trebuie luate în considerare.
• Acelaşi timp de stabilizare este necesar şi pentru prima conversie
diferenţială realizată după comutarea referinţei CAN (după
actualizarea câmpului REFS1:0 din ADMUX).
• Când se trece de la un mod de intrare asimetric la un mod
diferenţial, rezultatul primei conversii este, în general de precizie
mult scăzută datorită timpului de stabilizare necesar pentru circuitul
de anulare automată a offset-ului (decalajului la intrare).
– Practic, valoarea rezultată nu trebuie luată în considerare.

42
Comutarea canalelor de intrare si/sau a
sursei de referinţă (3)
• În concluzie există câteva recomandări care trebuie urmate pentru
a ne asigura ca selecţia canalului de intrare s-a făcut corect
• În modul conversie singulară (Single Conversion):
– întotdeauna se selectează canalul înainte de a porni conversia.
– selectarea canalului poate fi modificată după un ciclu de ceas CAN, din
momentul setării bitului ADSC.
– metoda cea mai simplă este să se aştepte terminarea conversiei
pentru a comuta canalul.
• În modul achiziţie liberă (Free Running):
– întotdeauna se selectează canalul înainte de a porni prima conversie.
– La fel ca la modul anterior selectarea canalului poate fi schimbată după
un ciclu de ceas CAN, din momentul setării lui ADSC şi cel mai simplu
este să se aştepte terminarea conversiei pentru a comuta canalul.
– Deoarece conversia următoare a pornit deja în mod automat, următorul
rezultat reflectă selecţia anterioară a canalului.
– Doar următoarele conversii vor reflecta selectarea noului canal de
intrare.

43
Tensiunea de referinţă pentru
convertorul analogic-numeric
• Tensiunea de referinţă VREF este cea care practic stabileşte
domeniul de conversie (domeniul mărimii de intrare pentru un canal
analogic) pentru CAN.
• Referinţa este selectată cu ajutorul bitilor REFS1 si REFS0 din
registrul ADMUX
• Dacă tensiunea de intrare (în modul mod asimetric) depăşeşte
VREF, în urma conversiei vor rezulta coduri egale cu valoarea
0x3FF (valoarea maximă exprimabilă pe 10 biţi).
• Tensiunea de referinţă VREF poate fi selectată:
– fie ca provenind de la pinul AVCC (alimentarea analogică),
– fie de la pinul extern dedicat AREF,
– fie de la o sursă de referinţă internă de 2.56V

44
Tensiunea de referinţă pentru
convertorul analogic-numeric
• Referinţă internă de 2.56V este oferită de o sursă de referinţă cu bandă
interzisă – band gap (VBG) printr-un amplificator intern de separare (buffer).
• Atenţie, pentru alte variante AVR sursa de referinţă internă poate avea
alte valori (ex. pt. ATMega 169 sursa de referinţa interna este de 1.1V)
• Indiferent de selecţia referinţei, pinul AREF este direct conectat la intrarea
de referinţă a CAN, şi tensiunea de referinţă poate fi filtrată (decuplată)
conectând un capacitor între pinul AREF şi masă
• VREF poate, de asemenea, să fie măsurată pe pinul AREF, dar trebuie ţinut
cont de faptul că ea este o sursă cu impedanţă internă mare acceptând
practic numai o încărcare capacitivă (practic nu poate debita curent).
• Dacă utilizatorul foloseşte o sursă de referinţă externă conectată la AREF,
atunci nu se mai pot utiliza celelalte opţiuni pentru tensiunea de referinţă,
sursa externă scurtcircuitând variantele interne.
• Dacă însă nu se utilizează o sursă de referinţă externă, utilizatorul poate
oricând să comute între AVCC şi referinţa internă.
• Atenţie, prima conversie realizată după comutarea referinţei poate să dea
un rezultat incorect, astfel că ea nu ar trebui luată in considerare!

45
Schema electrică echivalentă
pentru o intrare analogică
• Schema electrică echivalentă pentru o intrare analogică
(intrare asimetrică) este prezentată în figura de mai jos.
• O sursă de tensiune aplicată la intrarea ADCn este implicit
încărcată (are ca sarcină) cu capacitatea şi rezistenţa acelui
pin către masă, indiferent dacă acel canal este selectat sau
nu ca intrare pentru CAN.
• Când canalul este selectat, sursa mai trebuie să comande in
plus şi capacitorul circuitului S/H printr-o rezistenţă serie
(rezistenţa combinată din calea de intrare).

46
Schema electrică echivalentă pentru o
intrare analogică (2)
• Circuitul de intrare al CAN–ului este optimizat pentru semnalele
analogice generate de surse de tensiune cu o impedanţă de ieşire
mai mică de 10 KΩ, în sensul că, dacă este folosită o astfel de
sursă, contribuţia impedanţei sursei la timpul necesar pentru
eşantionare va fi neglijabilă.
• În practică cuvintele cheie sunt: surse cu o impedanţă cât mai
mică şi semnale cu o variaţie lentă, în această situaţie ne mai
trebuind să evaluăm în nici un fel contribuţia circuitului de
eşantionare-memorare (S/H).
• Dacă este utilizată varianta de intrare diferenţială, schema electrică
echivalentă de intrare este oarecum diferită, condiţiile impuse
impedanţei sursei de intrare fiind ceav mai relaxate ( < 100 KΩ ).
• Principial, în spectrul semnalului de intrare nu trebuie să apară
componente cu frecvenţa mai mare decât frecvenţa Nyquist
(fADC/2) pentru orice tip de canal, pentru a evita apariţia unor
conversii cu rezultate imprevizibile.
• Eventualele componente de înaltă frecvenţă trebuie eliminate de
utilizator printr-o filtrare externă de tip trece-jos (FTJ)
corespunzătoare, înainte de aplicarea semnalelor la intrările
47
analogice.
Tehnici de reducere a zgomotului
analogic
• La fel ca la orice sistem de mod mixt, componentele numerice
interne şi/sau externe generează un zgomot de comutaţie
(zgomot numeric, digital noise) care poate influenţa consistent
precizia măsurărilor analogice.
• Dacă precizia de conversie este critică, nivelul de zgomot poate fi
redus aplicând una sau mai multe din următoarele tehnici:
– Căile de semnal analogic trebuie să fie cât mai scurte, iar circuitele de
semnal analogic plasate cât departe de circuitele numerice care comută
rapid.
– Pinul de alimentare analogică AVCC ar trebui să fie conectat la
tensiunea de alimentare numerică VCC printr-un filtru LC ca în figura .
– Folosirea funcţiei de reducere a zgomotului numeric (ADC Noise
Reduction) specifică convertorului CAN AVR
– În cazul în care există pini din portul de intrări analogice care sunt
folosiţi ca ieşiri numerice, este esenţial ca aceştia să nu comute pe
durata unei conversii.

48
Tehnici de reducere a zgomotului
analogic- alimentarea AVcc

ATMega169
ATMega32 49
Caracteristica statică de transfer şi
rezultatul conversiei
• După finalizarea unei operații de conversie (bitul ADIF este “1”),
rezultatul conversiei poate fi găsit în registrele pentru rezultat/date
ale CAN–ului: ADCL şi ADCH.
• Pentru o conversie unipolară (asimetrică) pe 10 biti (valoarea
maxima este 0x3FF sau 1023 ) sau 8 biti (valoarea maxima este
0xFF sau 255 ), rezultatul, exprimat in cod binar natural, va avea
valoarea zecimală, numită aici generic ADC:
VIN ⋅ 1023 VIN ⋅ 255
ADC = ADC =
VREF VREF
– unde VIN este tensiunea pe pinul de intrare selectat şi VREF
tensiunea de referinţă selectată.
– Valorile extreme (în hex) exprimate pe 10/8 biţi sunt:
• minim 0x000 (0), VIN=masa analogică şi
• maxim 0x3FF/0xFF (1023/255), VIN=VREF, tensiunea de
referinţă selectată.
50
Caracteristica statică de transfer şi
rezultatul conversiei (2)
• Pentru o conversie diferenţială, pe 10 biți, rezultatul, in
zecimal, va fi de forma:

ADC =
(VPOS − VNEG ) ⋅ GAIN ⋅ 512
VREF

• unde VPOS este tensiunea (fața de masă) pe pinul de intrare


pozitivă (intrarea neinversoare Vin+), VNEG este tensiunea pe pinul
de intrare negativă (intrarea inversoare Vin-), GAIN este factorul de
câştig selectat pentru amplificatorul programabil (daca nu exista
GAIN=1), şi VREF este tensiunea sursei de referinţă selectată.
• Rezultatul, este o mărime cu semn, exprimata în cod binar
complement faţă de doi, pe 10 biţi, având valori de la minimul
negativ 0x200 (-512) până la maximul pozitiv 0x1FF (+511).
• Dacă utilizatorul vrea să execute doar o verificare rapidă de
polaritate, este suficientă citirea doar a MSB-ului (bitul ADC9 din
ADCH) care în acest caz este bitul de semn. 51
Caracteristica statică de transfer şi
rezultatul conversiei (3)

Caracteristica statică de transfer a


convertorului, utilizat în modul cu
intrare diferenţială.

52
Caracteristica statică de transfer şi
rezultatul conversiei (4)
• În tabelul următor sunt prezentate codurile de ieşire
rezultate dacă este selectată perechea de intrare
diferenţială (ADCn – ADCm), cu un câştig GAIN şi o
tensiune de referinţă VREF.
• Un exemplu de calcul bazat pe această caracteristică
este prezentat în continuare:
– Registrul ADMUX = 0xED (ADC3 - ADC2, câştig x10, referinţă
internă 2.56V, rezultat aliniat la stânga)
– Tensiunea pe ADC3 este de 300 mV, iar tensiunea pe ADC2 de
500 mV.
– ADC = 512 * 10 * (300 - 500) / 2560 = - 400 = 0x270
– Astfel vom avea ADCL = 0x00 şi ADCH = 0x9C.
– Scriind un “0” în bitul ADLAR rezultatul va fi aliniat la dreapta
cu: ADCL = 0x70, ADCH = 0x02.

53
Caracteristica statică de transfer şi
rezultatul conversiei (5)
Valoarea zecimală
VADCn Codul citit
corespunzătoare
VADCm + VREF/GAIN 0x1FF 511
VADCm + 0.999 VREF/GAIN 0x1FF 511
VADCm + 0.998 VREF/GAIN 0x1FE 510
… … …
VADCm + 0.001 VREF/GAIN 0x001 1
VADCm 0x000 0
VADCm – 0.001 VREF/GAIN 0x3FF -1
… … …
VADCm – 0.999VREF/GAIN 0x201 -511
VADCm – VREF/GAIN 0x200 -512
54
Exemplu de programare ADC (1)
int ADC_temp=0;/* pt. memorarea rezultatului, exprimat pe
16 biti */
/* Selectam canalul de intrare ADC0, referinta interna,
rezultat aliniat la dreapta */
ADMUX =0xC0 ;
// Activare ADC
// ADC Prescaler la fosc= 1MHz / 8 = 125kHz
// Declansare automata
// Dupa Reset bitii ADTSi din SFIOR sunt in 0, deci suntem
// si in modul Free Running
ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0 | (1<<ADATE);
//lansare conversie
ADCSRA |= (1<<ADSC);
//asteapta finalizare conversie, bitul ADIF =1?
while(!(ADCSRA & 0x10));
/*in ADC_temp se va reconstrui valoarea pe 10 biti */
ADC_temp = ADCL; /* citeste primul pe ADCL!!!! */
ADC_temp += (ADCH << 8); /* citeste, deplaseaza si aduna
si pe ADCH */
55
O schemă, doar pentru secţiunea
analogică..
ATMega16
+3.3V
Rt1 Rt2

R1 R2
+3.3V

2 senzori rezistivi
Din păcate nu pentru toţi
senzorii rezistivii interfaţa de
adaptare este atât de simpla!

56
Si un alt exemplu, mai multe
canale, conversie singulară
O funcţie generică de iniţializare:

void adc_init()
{
// Referinta va fi una externa, cea preluata de pe pinul
// AVcc, adica AREF = AVcc
ADMUX = (1<<REFS0);
// Activare CAN si alegem divizorul (prescaler) 8
// daca avem un ceas sistem de 8 MHz
// f ceas CAN = 8 000 000 / 8 = 1 000 000 Hz = 1 MHz
// adica T ceas CAN = 1 usec
//adica o conversie obisnuita va dura 13 x 1 usec = 13 usec
// doar prima conversie va dura 25 x 1 usec = 25 usec
ADCSRA=(1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);
//avem conversie singulara (neautomata), pt. ca ADATE a ramas
in ‘0’
//de asemenea rezultatul este aliniat la dreapta, ADLAR a ramas
in ‘0’ 57
}
Un alt exemplu, citirea rezultatului
O funcţie generică de citire a rezultatului (returnat ca un întreg fără semn pe 16 biţi) de
pe un canal specificat ca argument (întreg fără semn pe 8 biţi):

uint16_t adc_read(uint8_t ch)


{
uint16_t ADC;
// selecteaza un canal intre 0 si 7
// AND ch cu '7' ne asigura ca valoarea efectiv utilizata
// va fi intotdeauna ceva intre 0 si 7
ch &= 0b00000111;
// selectam canalul, ceilati biti nu vor fi afectati
ADMUX |= ch;
// start conversie singulara, scrie un '1' in ADSC
ADCSRA |= (1<<ADSC);
// asteapta finalizare conversie
// atunci cand ADSC devine '0' din nou
// pana atunci asteapta in bucla
while(ADCSRA & (1<<ADSC));
ADC = ADCL; // citeste primul pe ADCL!!!!
ADC += (ADCH << 8);
return (ADC);
}
58
Un alt exemplu, programul
principal…
Si un program principal in care citim si prelucrăm două canale, ADC0 si ADC1:

#include <avr/io.h>

void adc_init();
uint16_t adc_read(uint8_t ch);

int main()
{
uint16_t adc_result0, adc_result1;
// initializare CAN
adc_init();
//o bucla fara sfarsit
while(1) {
adc_result0 = adc_read(0); // citim valoarea canal ADC0
adc_result1 = adc_read(1); // citim valoarea canal ADC1
// in continuare prelucram cele 2 rezultate
// eventual le “afisam”, etc.
…………….
} Intr-una din prezentările viitoare va apărea si
} un exemplu in care se utilizează întreruperea aferentă CAN 59
Exemplu de utilizare a convertorului analog-numeric
(CAN) si a întreruperii aferente lui : schema (se
utilizează oscilatorul de ceas RC intern)..
ATMega16
5V
Rt1

R1
5V

Rt1 este un senzor rezistiv de


luminozitate (o fotorezistenţă)
LED1
LED2

Atâta timp cât iluminarea este sub o anumită


limită LED1 este aprins si LED2 stins 60
Când se depăşeşte această limită, LED-urile isi schimbă starea
Întreruperi: exemplu de utilizare convertor
analog-numeric (CAN)
#include <avr/io.h>
#include <avr/interrupt.h>
/*cele doua LED-uri sunt conectate LED1 = PC6 si LED2= PC7
catre masa, astfel ca se aprind cu pinul in ‘1’*/
/* Rutina de tratare a intreruperii CAN, conversie
finalizata: indicator ADIF=1 */
ISR(ADC_vect)
{
/*totul se intampla in rutina de tratare*/
if(ADCH < 128) /* testare daca tensiunea de intrare este
mai mica de jumatate din AVCC*/
{
PORTC |= (1 << PORTC6 ); /* Aprinde LED1 */
PORTC &= ~(1 << PORTC7 ); /* Stinge LED2 */
}
/*daca nu */
else
{
PORTC &= ~(1 << PORTC6); /* Stinge LED1 */
PORTC |= (1 << PORTC7); /* Aprinde LED2*/
} 61
}
Întreruperi: exemplu de utilizare convertor
analog-numeric (CAN)
int main (void)
{
/* LED1 = PC6 iesire, LED2 = PC7 iesire */
DDRC |= ((1 << DDC6) | (1 << DDC7) );
/* Factor divizare ceas CAN =128, frecventa de esantionare va
fi de 31.25 KHz la un fosc = 4 MHz */
ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
ADMUX |= (1 << REFS0); /* Referinta CAN este AVCC */
ADMUX |= (1 << ADLAR); /* Ajusteaza rezultatul la stanga, nu
se va citi decat un octet ADCH */
/* Nu sunt necesare valori pentru MUX, conversia se face
numai dupa canalul ADC0 */
ADCSRA |= (1 << ADATE); /* Modul achizitie libera Free-
Running */
ADCSRA |= (1 << ADEN); /* Activare CAN */
ADCSRA |= (1 << ADIE);
/* Activare intrerupere CAN */
sei(); /* Activarea globala a intreruperilor */
ADCSRA |= (1 << ADSC); /* Porneste conversiile AN */

for(;;) /* O bucla infinita, in care nu facem nimic */


{
}
} 62