You are on page 1of 63

Arhitecturi de sisteme incorporate

Microcontrolere si sisteme integrate


Microchip AVR 8 biți:

• Intrări analogice si conversia analog-numerică


(generalități, scheme bloc, regimul static si regimul
dinamic, o recapitulare sumara..)
• Sistemul de conversie analog-numerică pentru AVR 8 biți:
• Registre
• Controlul unei operații de conversie
• Durata unei conversii
• Variantele AVR modernizate
• Exemple de cod, polling, întreruperi
1
Două exemple de aplicații simple pentru care un
microcontroler ar avea nevoie si de intrări analogice

MCU
MCU

Măsurarea temperaturii
cu un termistor NTC, a unui
Măsurarea luminozității cu ajutorul unei
divizor rezistiv si a unui repetor.
fotorezistențe si a unui divizor rezistiv.
Un termistor NTC (Negative
O fotorezistență (LDR – Light Dependent
Temperature Coefficient
Resistor) este o rezistență (neliniară) a
thermistor) este o rezistență (neliniară)
cărei valoare scade cu creșterea intensității
a cărei valoare scade cu creșterea
luminii incidente
temperaturii
Sunt 2 exemple foarte simple de senzori rezistivi 2
împreună cu circuitele de adaptare (si ele f. simple-niste divizoare rezistive)
O intrare analogică presupune transformarea unei unei
mărimi fizice analogice intr-una numerică (digitizarea
ei): conversie analog-numerica

Proces/Instalatie/
Zgomot MCU
Mediu
înconjurător electromagnetic

Prelucrare

Mărimea Adaptare/ CAN N -


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

Tipul de convertor folosit de majoritatea CAN – Convertor Analog Numeric


microcontrolerelor care au un sistem CAN este ADC – Analog to Digital Converter
cu aproximații successive- successive- 3
approximation ADC
Conversia analog-numerică (CAN):
regimul static
Un exemplu
Uin
pentru un CAN de A
3 biţi ( n = 3 )
N
Numărul N este
exprimat pe 3 biţi:
a2, a1, a0
a2 - este MSb
valori diferite

a0 - este LSb
Rezoluția (analogica)
Avem 8

r = 5/8 = 0.625V
r = Umax / 2n [V]

max
Conversia analog
numerica introduce Uin
întotdeauna o eroare
de cuantificare Avem o infinitate de valori
LSb – Least Significant Bit , cel mai puţin semnificativ bit 4
MSb – Most Significant Bit , cel mai semnificativ bit
Rezoluția (resolution) determina si eroarea de
cuantificare (quantization error)
Rezoluția numerică indică numărul de valori
numerice distincte optenabile in domeniul
Uin
A 0..Umax: n biți, adică 2n valori
biţi
max Rezoluția analogică este exprimată in unități
N ale mărimii de intrare): r = U max /2n [V]
Caracteristici statice de transfer
Pentru un
CAN ideal:
n→∞
r→0

Uin (V) Uin (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 de regim static: liniaritate, decalaj (offset), câștig, ..
Regimul dinamic: cum procedăm in cazul mărimilor variabile
in timp, ce este perioada de eșantionare (sampling period) ?
In « fața » oricărui CAN cu aproximații
Uin (V)
Avem o infinitate de valori
successive se află un circuit de
eșantionare si memorare (Sample/Hold)
care prelevează in mod regulat o valoare
Uin si o menține constantă un interval de
timp Te pană la prelevarea eșantionului
următor (el acționează ca o memorie
analogică).
Te Tensiunea de intrare in CAN
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

Timpul de conversie (conversion time) este intervalul de timp din


momentul declanșării unei operații de conversie si momentul in care
rezultatul ei numeric este disponibil integral.
Conversia analog numerică implică o dublă cuantificare:
• cuantificare temporală, este eșantionarea propriu-zisă
6
• cuantificare in amplitudine (cea care da rezoluția)
Regimul dinamic. Fenomenul de dedublare, replicare a
spectrului (aliasing)
Daca frecventa de eșantionare este prea mica, in semnal sunt “detectate” frecvențe mai joase
decât exista in realitate!
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), ne spune cat de “repede”
trebuie eșantionat semnalul :
Spectrul real al Are loc
semnalului de Fe > 2 * Fmax
« replicarea »
eşantionat spectrului 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 si memorare
(S/H): se utilizează un capacitor pentru memorarea
semnalului pe durata cat care loc conversia

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 si 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
AVR 8 biti- sistemul de conversie analog-
numerică
• Anumite microcontrolere AVR 8 biti, în toate sub familiile (doar anumite Tiny,
majoritatea Mega, toate XMEGA), 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ă (adaptare de nivel) 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 (care 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, daca se dorește
valorificarea timpului de conversie relativ scăzut
– 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 8 biți (exemplu cu 8 canale de
intrare ADC0..ADC7)

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 : schema bloc detailată
(ATMega16)

Registrele utilizator

Sursa referinţa
interna

Convertorul analog numeric -


Este cu aproximaţii successive,
include si circuitul de esantionare-
memorare

Multiplexorul analogic Amplificator programabil (care nu exista la 12


orice varianta!)
AVR 8 biti - sistemul de conversie analog-
numerică -2
• 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
Intrării asimetrice si/sau diferențiale

Intrare asimetrică (single ended) – o singură


bornă de intrare(single input), cealaltă bornă,
comună cu sursa din intrare, este legată la masă!

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


este legată 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)
este un circuit selector analogic : selectează la ieșire
una din mai multe intrări analogice
Doar un singur comutator este închis la un moment dat,
altcumva scurtcircuităm intre ele sursele de tensiune de la intrările Ii!
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 (8 intrări, 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
AVR ATMega- convertorul analogic-numeric,
caracteristici
• 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 (si precizia).
– 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 sub-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 surse de tensiune
de referință externe.
• Caracterizarea preciziei acestui sistem de conversie (erori: liniaritate, offset, câştig,
etc.) este detailată în foile de catalog Microchip/Atmel.
18
Convertorul analogic-numeric AVR ATMega :
registrele asociate
• Sistemul CAN al AVR 8 biți este configurat şi controlat, la fel
ca orice periferic AVR, prin intermediul unor registre mapate
în spațiul I/O.
• Există o serie de biți de comandă/control precum si biți de
stare, grupați in diverse registre, a căror semnificație
particulară va fi detailată .
• Registrele de comandă, control si stare sunt:
– ADMUX - prin intermediul lui se stabilește canalul sau canalele de
intrare al multiplexorului (intrarea analogica care va fi utilizata in
operația de conversie), modul de intrare (asimetric sau diferențial),
câștigul programabil (daca e cazul) şi se selectează referința care
va fi utilizată
– ADCSRA – este registrul de control şi stare al convertorului analog
numeric şi este un set 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
AVR 8 biți- controlul operației de
conversie 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 8 biți aceste mijloace specifice sunt, in primul rând, biţii de
comandă/control precum si cei de stare din registrele aferente CAN
• Sistemul de temporizare numărare AVR 8 biți poate fi utilizat pentru
periodizarea operațiilor de conversie
• Sistemul 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?

Exista 8 moduri diferite de a


declanșa o operație de
conversie analog numerică:
- De către el însuși, auto-declanşare
sau conversie liberă (o operație de
conversie va începe imediat când
s-a terminat precedenta)
- De către ieșirea comparatorului
analogic
- De către pinul INT0 (întreruperea
externa 0)
- De către evenimente asociate
Ceilalţi biţi nu ţin de sistemul CAN! sistemului de temporizare
numărare (5 moduri) 23
Registrele ADCH si ADCL – rezultatul operației de
conversie analog numerică
• Rezultatul conversiei este exprimat pe 10 biți si 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
Registrele de date ADCH si ADCL

Aliniere la dreapta (cea implicită, după 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/comuta
efectiv canalul.
• Starea aceluiași bit 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 si va deveni “0” la finalizarea conversiei
– Astfel el poate fi interogat/testat într-o bucla de așteptare
• “Sursa” după care se va face declanșarea conversiei in mod
“automat” poate fi selectată prin intermediul câmpului de biți ADTSi;
i=0,1,2 din registrul SFIOR.

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

Pentru a putea utiliza sistemul de conversie


analog-numeric, în ansamblul său, acesta
trebuie activat prin setarea bitului ADEN =1
(Analog to Digital conversion ENable) din
ADCSRA. Implicit după reset acest bit este șters.

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 când 27
dorim sa intram intr-un astfel de mod).
Declanșarea/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 (pentru sincronizare) ș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 va fi setat în momentul finalizării
conversiei şi al actualizării registrelor de date.
• Deşi el este destinat generării unei cereri de întrerupere (el este un
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, bitul respectiv fiind folosit eventual printr-o interogare in
bucla.

28
Declanșarea unei operații de conversie -2

• 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ă, cu auto-declansare, automată), eșantionând
intrarea analogica ș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 de utilizator.
• Prima conversie trebuie să fie declanșată de utilizator 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 (a timpului de
conversie)
• Timpul de conversie poate fi controlat/programat, in anumite
limite, de utilizator prin intermediul semnalului de ceas pentru
CAN
• Durata unei operații de conversie, timpul de conversie - care este
invers proporțional cu viteza de conversie - depinde de un factor de
divizare programat și de frecvența oscilatorului de ceas sistem
(CK) care este semnalul de ceas pentru acest divizor
• Astfel, 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 (de 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); atenție, factorii disponibili pot fi diferiți funcție de
varianta de AVR
• Divizorul de frecvență va începe să funcționeze din momentul activării
sistemului CAN, prin setarea bitului ADEN din ADCSRA.

30
Registrul ADCSRA: ne da factorul de
(pre)divizare al ceasului CAN

Funcție de starea programată pentru acești biți ADPSi; i=0,1,2


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

31
AVR 8 biți: cât durează de fapt o operație de
conversie analog- numerică?
• La fel ca si pentru alte sisteme de conversie –analog numerica de la
alte familii de microcontrolere, durata unei astfel de operații se
exprima intr-un număr de perioade ale ceasului CAN
• Convertorul analog-numeric AVR 8 biti asigură rezoluția maximă
adevărată de 10 biţi pentru frecvente 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ă in total un număr de 13 cicluri
(perioade) de ceas CAN.
• Prima conversie după activarea CAN-ului (realizata dupa ce a fost
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
AVR 8 biți: cât durează de fapt o operație
de conversie analog- numerică? -2
• 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
AVR 8 biți: valori ale timpului de conversie
funcție de perioada ceasului CAN
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
34
Exemplu conversie singulară, prima
conversie

35
Exemplu conversie singulară, conversie
normală (următoarele conversii)

36
Exemplu conversie automată (auto-
declanşată)

37
AVR 8 biți: conversia analog-numerica,
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 (se realizează 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 in mod 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
AVR 8 biți: conversia analog-numerica,
modul de intrare diferențial -2
• 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 sursei
de referință

• Pentru comutarea (selectarea) canalului de intrare pe


care se va realiza conversia si/sau a referinței cu care se
va realiza conversia se utilizează câmpurile de biți
MUXi; i=0,1,2.. şi REFSi; i=0,1 din registrul ADMUX,
care sunt de fapt memorate într-un registru temporar, din
care sunt preluate la realizarea efectiva a conversiei.
– 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ță -2
• 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 a intrării si a referinței (de pe care canal provine valoarea
si cu ce referință s-a făcut conversia).
• ADMUX poate fi actualizat într-un mod sigur astfel:
– Atunci când bitul ADATE sau bitul ADEN este șters.
– In 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ță: modul diferențial -3
• 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ță: recomandări generale - 4
• Î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
Sursa de tensiune 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 biților 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ă astfel:
– 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 (la ATMega 16)

44
Sursa de tensiune de referință pentru
convertorul analogic-numeric -2
• Tensiunea de 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 (de ex. pt. ATMega 169 sursa de referință 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 ea 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 regim static si regim dinamic,
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/utilizat sau
nu ca intrare pentru convertor.
• Când canalul este selectat, sursa mai trebuie să comande (sa
încarce si sa descarce) in plus şi capacitorul circuitului de
eșantionare/memorare (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 echivalente 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ă daca avem surse cu o impedanță mică şi semnale cu
o variație lentă, nu mai trebuie 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 ceva 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
analogice.
47
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 externe 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 8 biti
– Î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-
decuplarea alimentarii AVcc

ATMega169
ATMega32 49
Caracteristica statică de transfer şi
rezultatul unei conversii analog-numerice
• 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 biți, rezultatul,
exprimat in cod binar natural, va avea valoarea zecimală, numită aici
generic ADC:
VIN ⋅1024
ADC =
VREF
– unde VIN este tensiunea pe pinul de intrare selectat şi VREF
tensiunea de referință selectată.
– rezultatul ADC este o mărime fără semn, exprimată in cod binar
natural, valorile extreme (în hex) exprimate pe 10 biţi fiind:
• minim 0x000 (0), pentru o tensiune de intrare VIN egala cu masa
analogică
• maxim 0x3FF+1 (1023+1), pentru o tensiune de intrare VIN egala cu
tensiunea de referință selectată VREF.

Dacă avem o conversie pe 8 biți, in care se folosește doar


valoarea din ADCH, in relația de mai sus vom avea 256 in loc de
1024. 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 aleasa
ca neinversoare Vin+),
– VNEG este tensiunea pe pinul de intrare negativă (intrarea aleasa ca inversoare
Vin-),
– GAIN este factorul de câștig selectat pentru amplificatorul programabil (daca
acesta nu exista GAIN=1) şi
– VREF este tensiunea sursei de referință selectată.
• Rezultatul in acest caz este o mărime cu semn, exprimată î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 (adică intrare 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 = - 40010 = 0x270 in cod
binar complement fata de 2 !
– Dacă avem un “0” scris în bitul ADLAR rezultatul va fi aliniat la
dreapta cu: ADCL = 0x70, ADCH = 0x02.
– Dacă avem un “1” scris în bitul ADLAR rezultatul va fi aliniat la
stânga cu: ADCL = 0x00 şi ADCH = 0x9C.

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
Sistemul de conversie analog numeric
– seriile Tiny si Mega modernizate

In foile de catalog ale variantelor modernizate apare o nouă schemă bloc care
ilustrează si funcționalitățile disponibile- practic aceleași ca la variantele clasice,
dar si unele noi gen măsurarea locală a temperaturii si compararea
rezultatului conversiei cu o fereastră de valori (din registrele duble WINLT si
WINHT, cu ieșirea WCOMP), posibilitatea de a acumula (ACC) pană la 64 de
eșantioane intr-un singur rezultat.
Nu mai există mod de intrare diferențial, intrările pot fi doar asimetrice.
Există acum 17 registre de comandă, stare si date asociate sistemului.
Denumirile registrelor s-au modificat (de exemplu registrele de date sunt acum
55
registrul dublu RES), deci obligatoriu trebuie consultată foaia de catalog.
AVR 8 biti: exemplu de programare al
convertorului analog-numeric, mod polling
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 56
si pe ADCH */
O schemă, doar pentru secțiunea
analogică..
ATMega16
+3.3V
Rt1 Rt2

R1 R2
+3.3V

Rt1 si Rt2 sunt doi senzori rezistivi care


formează divizoare rezistive cu rezistentele
fixe R1 si R2.
Tensiunea de alimentare de 3.3V este folosita
ca tensiune de referință si pentru alimentarea
divizoarelor.
Rezistenta interna a sursei de tensiune
echivalente este Rt1//R1 si Rt2//R2.
Din păcate nu pentru toți senzorii rezistivi57
interfața de adaptare este atât de simpla!
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’ 58
}
Un alt exemplu, citirea rezultatului, mod
polling
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);
} 59
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 60
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 61
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*/
} 62
}
Î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 */


{
}
} 63

You might also like