Sari la conținut
ELFORUM - Forumul electronistilor

Compensare soft sau hard probleme ADC


XAN77

Postări Recomandate

scuze pentru postul foarte lungIntenționam să scriu aici http://www.elforum.info/topic/85207-adc-attiny24-discutii/ dar numele nu e prea sugestiv pentru a fi găsită ușor informația. Acest post se vrea un fel de articol.Este pentru aceia care au observat neliniaritatea ADC-ului, îi deranjează și vor s-o diminueze. Nu se pune problema de formulă greșită sau schemă eronată, cum cred unii, problemele ADC sunt de mai multe feluri și sunt reale. Chiar producătorul le tratează explicit în notele de aplicație AVR120 și AVR127 ce se găsesc ușor pe gugăl.Eu am făcut mai multe teste  și mereu mi-a stat pe creier acele abateri ale ADC care nu sunt constante față de un multimetru etalon și nici măcar de același sens.Am observat astfel că pornind dinspre 0V în sus, la începutul scalei AVR indică mai puțin decît DMM(multimetru banal) iar crescînd tensiunea la ADC acea abatere scade ușor pînă ajunge la 0, adică indică la fel ca DMM iar apoi crescînd tensiunea măsurată AVR începe să indice mai mult decît DMM ajungînd la un maxim la capătul de sus al scalei.Am observat acest comportament la mai multe controlere, inclusiv la PIC, ceea ce ma cam deranjat și am renunțat la a folosi MCU la proiect mai serios de măsură. Am la sursa mea liniară un VAmetru făcut de mine cu mega8 cu 2x3digit_led la care la tensiune am renunțat la compensarea soft de care eram în stare pînă mai ieri, astfel la 28-30V el arată mai mult cu 0,2V față de DMM, însă la curent, mai ales curenți mici trebuia comensare musai, dar greu de implementat datorită neliniarității abaterii/erorii. Am studiat AN120, nu îmi explic de ce nu am făcut-o pînă acum, și am rezolvat problema, pentru care fac acuma vorba asta lungă.

 

Montajul cu care am testat ceea ce tot delirez pe aici este cu Mega88, referință externă MCP1541 de 4,096V, C-uri de 100n, inductanța etc, tot ce trebuie. Alimentare din surse liniare cu transformator. Tensiunea măsurată este un element Li-ion cu un reglabil multitură. În soft citesc de cîte 256 de ori și afișez 2 valori separate pe un LCD, una pe 10 biți clasică și una de 14 biți obținută prin oversampling (însumarea celor 256 valori citite și împărțirea sumei finale la 16). Astfel avînd rezoluție de afișare de 1mV. Menționez că s-a comportat foarte bine, fiind fluent în afișare cu pas de 1mV.

Dar să enumăr problemele ADC:1. Offset. Se măsoară astfel: se pleacă de la 0V la intrare ADC și se crește ușor la nivel de mV pînă ADC are LSB=1, primul 1 din cuvîntul de 10biți. Teoretic tensiunea necesară pentru ca LSB să fie 1 ar fi cam jumătate din  Vref/1024, adică pasul-rezoluția ADC funcție de Vref, că 10biți e cam la majoritatea. La mine de exemplu la 4,096Vref extern, incrementul/pasul ar fi de 4mV. La mine trebuia ca începînd cu 2mV sa am LSB=1 dar în realitate abia la 10mV la intrare a reacționat ADC și am avut LSB=1. Acea diferență de 10mV(real)-2mV(ideal)= Offset de 8mV. Transformat în LSB acei 8mV, la rezoluția mea de 4mV ar fi 2 LSB.Pentru compensarea erorii dată de offset este nevoie să se adune matematic la valoarea măsurată de ADC, constanta de 2LSB, adică cei 8mV.2. Gain. Se măsoară la capătul de maxim al scalei. La mine la 4,096V ADC arăta așa cum spuneam anterior, mai mult decît DMM. Practic cînd ADC indica de exemplu 4,088V DMM avea 4,07 (reglam crescînd ușor tensiunea pînă ce DMM se oprea la 4,07 după 4,06 intermitent). Cei aprox. 18 mV reprezintă eroarea de cîștig. Aici mă pricep mai puțin să explic ce am citit în AN, poate AN120 vă va părea mai clar.Pentru compensarea acestei erori, valoarea ADC , musai după aplicarea compensării de offset, se scalează cu eroarea de Gain pentru a aduce ADC-ul la normal. Practic la mine 4070(real) împărțit la 4088(ADC cu gain eror)= 0,9956. Se înmulțește valoarea ADC cu acest număr. Acea valoare se poate ajusta ușor în soft ca indicația să fie mulțumitor de apropiată cu DMM. Pentru evitarea calculului în virgulă mobilă se ține informația ADC într-o variabilă de 32 biți și se înmulțește cu 9956 și apoi se împarte la 10.000.3. Non-linearity. Problemele de neliniaritate ”pură” sunt și ele prezente. Intervalul de tensiune necesar de la ultima schimbare  LSB pînă la următoarea ar trebui să fie egal cu pasul/rezoluția ADC-ului, la mine 4mV. Să le spunem lățimea biților e de 4mV. În realitate sunt biți mai scurți sau mai lungi de 4mV, suma tuturor celor 1024 fiind totuși Vref. Dar asta nu înseamnă că sunt toți la fel de lați de 4mV. Dacă sunt mai mulți biți alăturați asemănători adică scurți sau lați, se cumulează erorile. Astfel pot apărea zone izolate poziționate random din lungimea scalei, unde ADC nu bate cu DMM cu abateri notabile, dar în afara acelor zone totul este ok. Aceste erori nu se pot compensa cu simple calcule matematice ci doar cu tabele de corespondențe, așa zisele look up table.Din fericire aceste erori de neliniaritate nu sunt așa pregnante ca cele de offset și gain care tot din fericire se pot corecta chiar foarte ușor.

 

Corecțiile din soft sunt cum ziceam adunarea întotdeauna la valoarea curentă ADC, indiferent de valoarea tensiunii măsurate, a erorii de offset, urmată de scalarea cu factorul dat de eroarea de gain, adică înmulțirea cu un număr apropiat de 1 dar diferit 0,990-1,009 depinde ce se dorește scăderea sau creșterea rezultatului inițial. Corecția soft are un dezavantaj la corecția de offset.La mine adăugînd cei 8mV la valoarea măsurată, însemna că sub 8mV nu puteam măsura nimic, practic se reduce scala ADC-ului.Această corecție se poate face conectînd un AO la intrare cu reglaj de offset, iar din reglajul de offset al AO să dăm intenționat valoarea rezultată ca eroare de offset ADC, cei 8mV ai mei. Un fel de adunare analogică cu 8mV. Astfel la 0V la intrare în AO, vom avea 8mV ieșirea AO spre ADC, iar la 2-4mV la intrare AO vor fi 10-12mV la ADC deci se va putea  măsura normal pentru LSB=1 la 2-4mV cum e normal la un ADC fără astfel de probleme. Astfel recuperăm scala ADC.Corecția de gain se poate face și ea hard conectînd după acel AO (dacă este folosit) un divizor rezistiv. Eu am folosit 33R-4K7.Am testat ceea ce spun și rezultatele sunt peste așteptări. Am folosit TL081 alimentat la +/-5 pus ca repetor adică fără amplificare. Am făcut corecțiile atît din softul MCU și a fost perfect cu excepția reducerii scalei cu cei 8mV,  cît și hardware cu reglaj offset la amplificatorul operațional și divizorul de mai sus.Consider că reglajul hardware este mai indicat, nu necesită ”improvizații” software ce sunt diferite pentru fiecare MCU în parte și e așa mai...profi ca să zic așa. Folosirea AO are dezavantajele care sunt (piese în plus, tensiune dublă), mai toți încercăm să le evităm, eu m-am consolat că de acum le voi folosi mai des. Avantajele însă sunt mai multe, adaptor de impedanțe, posibilitate de amplificare, buffer de protecție pentru MCU.Astfel compensat ADC-ul meu este chiar mulțumitor, acum pot face fără strîngere de inimă un proiect de voltmetre/ampermetre cu MCU. Nu mai simt nevoia de 7107/7135.

Link spre comentariu
  • Răspunsuri 8
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • XAN77

    3

  • one

    2

  • Fulgerik

    1

  • godFather89

    1

Top autori în acest subiect

Convertorul A/D din AVR este cu aproximatii succesive si se comporta absolut normal unui ADC din clasa lui. Neliniaritatile despre care vorbesti ( integrala, diferentiala si offset) sunt inerente.  ADCul cu aproximatii succesive a fost gandit pentru viteza. Pe langa aceaste probleme pe care le descri in post mai trebuie sa iei in calcul si variatia acestor erori in timp datorate temperaturii si imbatranirii componentelor. Acestea cum le corectezi? 

Mult succes in descoperirea problemelor care apar in functionarea precisa a unui instrument. Care crezi sa fie motivul pentru care orice aparat cu schema de principiu simpla este in realitate intesat cu componente.

Link spre comentariu

3. Erorile de nonlinearitate se pot ajusta cu functii matematice. Vezi in cazul touch-screen-urilor rezistive.

Cum spunea si Fulgerik, toate aceste erori se modifica in functie de temperatura.

 

Pana la urma conteaza ce precizie ai nevoie. Probabil e mai simplu sa folosesti un ADC extern conceput pentru precizie.

Link spre comentariu

Am implementat cele de mai sus la singurul volt-amper metru ce-l am la sursa de birou liniară. Pe tensiune am divizor aproximativ 11, pe curent am folosit chiar șuntul de 0,47 ce face parte din schema sursei (renumita cu 3xTL081) de unde se face limitarea de curent, fără a mai folosi un alt șunt special pentru ampermetru.

Am făcut cu această ocazie cîte 2 scale la fiecare, la voltmetru x , x x V / x x , x V și la ampermetru x x x mA și x , x x A ce se schimbă automat funcție de măsură. Scalele de x,xx v (folosind același divizor de 11) și xxx mA sunt obținute evident după oversampling.

Datorită offsetului de aproximativ 2LSB (cam 5mV la Vref de 2,56) compensat doar din soft, pe voltmetru îmi măsoară începînd cu 0,05 V iar pe ampermetru începînd cu 11 mA, însă o face foarte corect, sincron cu multimetrul pe toată scala ADC și pe orice scală aș comuta multimetrul. E altă viață.

Avînd în vedere că limitarea minimă de curent la acea sursă, în cazul meu, este de 7mA, iar limita de jos la măsurat tensiune de 50mV nu e mare deranj, nu voi face compensări hard cu amplificatoare operaționale.

Editat de XAN77
Link spre comentariu

XANT te felicit, asta era rezolvarea la mult discutata problema cu neliniaritatea, este prima oara cind vad aceasta problema rezolvata, o solutie aparent simpla acum insa stiu cita munca a insemnat, este bine si ca ai facut un topic separat astfel poate fi gasit usor si in tema cu problema. Bravo si multumesc totodata.

 

Link spre comentariu

La măsurătorile pe şunturi high-side mai există o problemă: CMMR. Acum vreo doi ani am avut surpriza (neplăcută) să constat că măsurătoarea curentului varia cumplit, fără să înţeleg iniţial de ce. După multe teste şi încercări am ajuns să citesc ceva mai în detaliu şi să-mi dau seama că factorul de rejecţie a modului comun are un rol extrem de important în măsurătoare. Pe scurt, citeam valori diferite ale aceluiaşi curent, la tensiuni diferite pe sarcină. Cu cît şuntul are o valoare mai mică, cu atît problema devine mai ţepoasă. Eu aveam de citit curenţi pînă la 100A cu rezoluţie de 10mA pe un şunt de 1mOhm şi un ADC pe 15 biţi (16 biţi diferenţial). Cu greu am obţinut rezoluţia respectivă, fiindcă nivelul tensiunii pe şunt era sub zgomotul primului etaj (semnal util 10uV, zgomot de 17,5uV).

 

O altă problemă legată de măsurătoare e că niciun operaţional de pe planeta asta nu e rail-to-rail, toate au o cădere de tensiune pe etajul final, de cîţiva milivolţi. Niciodată zero. Mai mult, cu cît te apropii mai mult de zona respectivă, devin FOARTE neliniare. Altele au efectul de latch, cînd nivelul tensiunii de intrare se apropie de alimentare. Soluţii: adăugarea unui offset sau alimentare diferenţială. Alimentarea trebuie să fie mai mare cu cel puţin un volt faţă de semnalul util. Din păcate, acestea introduc alte probleme.

 

Pentru îmbunătăţirea măsurătorilor, nu folosiţi niciodată ADC-ul în single shot. Faceţi măsurători în mai multe puncte, la o frecvenţă cretină, care să nu aibe legătură cu nimic din jur, apoi mediaţi valorile.

Link spre comentariu
  • 1 lună mai târziu...

Felicitari pentru munca de cercetare  si pentru solutiile gasite.

 

Ma surprinde ca ADC din AVR nu este monoton. Ma astept sa nu masoare precis, mai ales la valori apropiate de zero, de aceea eu evit sa folosesc un ADC in partea inferioara a domeniului de intrare.

 

Cred ca ADC din AVR a fost gandit mai degraba pentru a-l integra intr-un regulator, nu pentru a face masuratori precise, oricum 10biti sunt minimul chiar si pentru regulatoare cred.

Eu folosesc ADC-uri externe de obicei, cu un numar de biti mai mare si fac o medie mobila. AD7718 (24biti) pentru mai multe canale si MCP3421 (18b) cand am nevoie de ceva mai simplu. Rezultate bune am obtinut si cu MCP3204 (12biti).

 

Nu sunt sigur, dar arunc o idee: nu cumva si AVR-urile astea sunt produse in mai multe locuri? Eu am remarcat oarecare diferente intre capsulele celor din magazinele consacrate (RS, Digikey, Farnell, Distrelec) si cele luate de pe ebay.

Editat de one
Link spre comentariu

Văd că și MCP3204, ca probabil orice adc, are acele erori, ele sunt tipice operației de conversie AD bănuiesc. Văd în catalog la valori maxime Offset error = +/- 3 LSB iar Gain error = +/- 5 LSB, ceea ce duce la aceleași probleme. Deci e important să știm cum să le corectăm.

Link spre comentariu

Intra-adevar, dar 5LSB la 10bit si 5 lsb la 12 bit sunt de 4 ori mai putini.

 

Pe de alta parte,cred ca este un pic exagerata folosirea unui ADC pe 10biti pentru masuratori.

Un aparat de masura decent, de exemplu Fluke 117 are precizia pe scala DC de 2%+3digit in mod auto si 0.5%+2digit in mod manual. Adica, in mod manual , pe scala de 600V,am oficial 5V de eroare, iar in automat, 15V !!!!

 

De altfel, ce fac cu un ADC perfect, cu gain liniar si ultraprecis si offset zero (cum masor zero?) ? Il pun intr-un sistem unde orice alta componenta se comporta dupa regulile pretului scazut (de productie, nu de vanzare).

 

Un exemplu: am facut in sistem care aplica o presiune care creste liniar intr-un sistem (un banc pentru test de anduranta supape de siguranta).

Transductorul de presiune, care costa cat 30 ATmega, are o precizie de 3% !!!! Masor cu un ADC ultraprecis?

Valva care imi comanda fluxul, are un offset de circa 1V (circa!!!!). Adica, eu ii aplic 0 (zero) sau 1% din tensiune si este tot inchisa! 

De aceea, cred ca teoria ar trebui extinsa la intreg sistemul. 

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări