Sari la conținut
ELFORUM - Forumul electronistilor

ADC Attiny24, discutii.


nickrvl

Postări Recomandate

@nickrvl: Calculul era pentru ratza, nu pentru tine.In alta ordine de idei, abaterea de 0.02V este destul de mare (2LSB la o referinta de 5V ar trebui sa fie aproximativ 10mV, sau pentru puristi 9.765625mV). Si pana la urma, de unde ai scos eroarea de 0.8V (sau pe cea de 1.6V) ca este o discrepanta mare intre eroarea de conversie a ADC-ului si ce spui tu ca iti afiseaza multimetrul probabil. Scoate complet condensatorul de 47uF si reverifica masuratorile.

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

Top autori în acest subiect

  • nico_2010

    31

  • nickrvl

    30

  • ratza

    11

  • Liviu M

    8

Top autori în acest subiect

Imagini postate

@nickrvl: Calculul era pentru ratza, nu pentru tine.In alta ordine de idei, abaterea de 0.02V este destul de mare (2LSB la o referinta de 5V ar trebui sa fie aproximativ 10mV, sau pentru puristi 9.765625mV). Si pana la urma, de unde ai scos eroarea de 0.8V (sau pe cea de 1.6V) ca este o discrepanta mare intre eroarea de conversie a ADC-ului si ce spui tu ca iti afiseaza multimetrul probabil. Scoate complet condensatorul de 47uF si reverifica masuratorile.

Ce este LSB?Eroarea de 0.2V este minima si se manifesta de la 0 la 23,9V, daca extindem la toata scala de la 0 la 100V rezulat 0.8V = 0.2 x 4(23.9V rotunjit = 25V) dar asta este valoarea minima de abatere, este si mai mare sau cea mai mare da acei 1.6V pe toata scala, asta a rezultat dupa "multe" teste si incercari dar o luam de baza pe cea mai mica pentru ca ma pot incadra adica acei 0.2V in plaja 23.9V sau 0.8V pe toata scala de 100VCondul daca il scot nu mai pot citii, fluctueaza valoarea ADC de nu se poate stabili precis, dar au fost momente cind am reusit totusi sa citesc valoarea si pot spune cert ca abaterea persista si fara el.L.E. am spus 0.2V zic bine nu? nu 0.02V, daca reglez valoarea ADC sa fie afisata la fel ca tensiunea de masurat la 23.9V ADC afisat = 239 atunci la 1V masurat , ADC = 08 adica i-mi arata 0.8V.
Link spre comentariu

LSB = Last Significant Bit. In cazul de fata, daca la 0 volti ADC=000000000, la 4,88mV (pentru referinta de 5V) vei avea ADC=000000001, ca urmare, 2LSB=2 X 4.88mV= ~9.97mV (rotunjit 10mV).Mi-e teama ca si aparatul tau de masura (bun de altfel) are si el erorile lui (precizia de masurare la tensiuni continue este de 0.5%+1 digit, ceea ce inseamna ca pe scala de 200V ai o precizie de 1V+/-0.1V), asa ca, in absenta unui aparat de masura performant, eu zic s-o lasi asa.Cat despre fluctuatiile de afisare, acum nu am timp, insa voi rezolva problema.

Link spre comentariu

LSB = Last Significant Bit. In cazul de fata, daca la 0 volti ADC=000000000, la 4,88mV (pentru referinta de 5V) vei avea ADC=000000001, ca urmare, 2LSB=2 X 4.88mV= ~9.97mV (rotunjit 10mV).Mi-e teama ca si aparatul tau de masura (bun de altfel) are si el erorile lui (precizia de masurare la tensiuni continue este de 0.5%+1 digit, ceea ce inseamna ca pe scala de 200V ai o precizie de 1V+/-0.1V), asa ca, in absenta unui aparat de masura performant, eu zic s-o lasi asa.Cat despre fluctuatiile de afisare, acum nu am timp, insa voi rezolva problema.

Aparatul, de fapt am incercat 3 tipuri pentru ca primul presuspus vinovat a fost multimetru, pe toate trei aceasi decalare, intre ele diferenta nesemnificativa. Ce sa zic, multumesc pentru ajutor/lamuriri, acuma fiecare dupa timpul disponibil, dar m-ar bucura o rezolvare la aceasta "problema", problema cu care am avut de a face nu numai acum ci mai de mult si pe alte tipuri de Mc-uri, a devenit o obsesie si as vrea sa o rezolv pentru todeauna.
Link spre comentariu

@nickrvl: Testeaza te rog codul de mai jos, sper sa intruneasca conditiile tale.

'Program de test FORUM - nickrvl'4 februarie 2014$regfile = "attiny24.dat"$crystal = 8000000$hwstack = 40$swstack = 8$framesize = 40$simConfig Lcd = 16 * 2Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portb.0 , Rs = Portb.1Cursor OffConfig Adc = Free , Prescaler = Auto , Reference = AvccOn Adc Adc_isr NosaveEnable AdcEnable InterruptsDim Aratavolt As String * 8Dim W As Word , Channel As Byte , Volt As Single , Flag As BitChannel = 3Flag = 0Do  Channel = 3  Start Adc  Idle  Stop Adc  If Flag = 1 Then  Gosub Display_lcdEnd IfLoopEndDisplay_lcd:Flag = 0Volt = W * 5.0Volt = Volt / 1024Aratavolt = Str(volt)If Volt > 99. Then'Aratavolt = Format(aratavolt , "000.0")Locate 2 , 1Lcd Fusing(volt , "##.#") ; "V  "Else'Aratavolt = Format(aratavolt , "00.0")Locate 2 , 1Lcd Fusing(volt , "#.#") ; "V  "End IfReturnAdc_isr: Flag = 1  push r26  push r27  push r24  in r24,sreg  push r24  push r25  W = Getadc(channel)  pop r25  pop r24  !out sreg,r24  pop r24  pop r27  pop r26Return
Link spre comentariu

@nickrvl: Testeaza te rog codul de mai jos, sper sa intruneasca conditiile tale.

Pe primul rind afisaza ADC = 0 si atit, pe al doilea rind afisaza un numar de 3 cifre din care prima cifra este vizibila a doua plipliie usor dar e vizibila iar la treiea nu se vede deloc, e un pilpiit continuu, acest numar creste sau scade cu tensiunea injectata.
Link spre comentariu

Insereaza o intarziere de circa 200ms, asa:

Lcd Fusing(volt , "#.#") ; "V  "End Ifwaitms 200
Daca vrei sa vezi si valoarea ADC, iti va depasi capacitatea de memorie.
Nu vreau sa-mi afiseze ADC-ul, chiar i-mi afisaza ADC, sau mai bine zis i-mi afisa, acum se comporta haotic, am intercalat intirziere fara efect, am setat de la 1ms pina la 10 secunde, intirzierea nu are efect. Zic ca se comporta haotic, inainte i-mi afisa ADC acum i-mi afisaza aiurea, in linia a doua incearca sa afiseze ceva dar tot asa, nu se distinge mare lucru.post-9441-139829752104_thumb.jpgL.E. stai, era dezactivat divide clok by 8, l-am activat si acum se vede clar dar trebuie sa modific divizorul rezistiv, acum i-mi indica maxim 1.2V, revin.L.L.E. Am modificat divizorul dar valoarea afisata nu-mi depaseste 5.0V, asta inseamna ca mi-a depasit valoarea maxima a ADC-ului, valoarea de 1024.
Link spre comentariu

introdu:

Volt = 100 * Volt
dupa
volt=volt/1024
si atunci va tine seama de divizorul de tensiune.
Da, corect.Insa decalajul persista, pun doua poze cu multimetrul pe scala 20V si 200V, cam slabe pozele dar se vede....L-am echilibrat la 23.9V iar cind scad spre zero aceasi poveste, decalaj de 0.2V.post-9441-139829752112_thumb.jpgpost-9441-139829752117_thumb.jpgL.E. am scos si condul, am prins o pozitie unde nu pilpie si e stabil insa fara efect, acelasi decalaj, cel putin am eliminat si "necunoscuta" cu condensatorul, nu e de acolo.
Link spre comentariu

Gandeste-te ca daca ai un zgomot cu amplitudinea de 10mV valoarea mediata va fi inmultita cu 100. Ca sa obtii 0 V trebuie sa iei masuri speciale (si nu spun prostii) de decuplare, de realizare a cablajului de ecranare a traseelor catre uc s.a.m.d., insa asa cum am vazut ca ai tu montajul (muuulte fire in aer) poti accepta si aceasta eroare.

Link spre comentariu

Gandeste-te ca daca ai un zgomot cu amplitudinea de 10mV valoarea mediata va fi inmultita cu 100. Ca sa obtii 0 V trebuie sa iei masuri speciale (si nu spun prostii) de decuplare, de realizare a cablajului de ecranare a traseelor catre uc s.a.m.d., insa asa cum am vazut ca ai tu montajul (muuulte fire in aer) poti accepta si aceasta eroare.

Deci e "fara speranta"!!!, totusi ce intrebari i-mi pun, daca "zgomotul" influenteaza, nu ar trebuii sa influenteze in sus? voltmetru cu mc indica 0.0V iar multimetrul 0.2V, pe de alta parte am citeva voltmetre printre care si mai compacte cu aceasi "problema". Oricum o sa incerc sa ma focalizez asupra eliminarii zgomotului intr-un nou eventual cablaj dedicat. Softul dat de tine, nu-l inteleg de loc semn ca esti avansat, m-ar bucura sa-l pot intelege dar probabil ca este ca in bac, nu ca nu ai avea timp sa explici ci nu l-as intelege eu. Dar pe scurt, daca "noul" meu soft ocupa doar 45% facind acelasi lucru "e de rau" sau "e de bine"?
$regfile = "ATtiny24.dat"Config Lcd = 16 * 2Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portb.0 , Rs = Portb.1Cursor OffClsConfig Adc = Single , Prescaler = Auto , Reference = AvccStart AdcDim V As WordDim Aratavolt As String * 4DoV = Getadc(3)Aratavolt = Str(v)If V > 99 ThenAratavolt = Format(aratavolt , "00.0")Locate 1 , 1Lcd Aratavolt ; "V  "ElseAratavolt = Format(aratavolt , "0.0")Locate 1 , 1Lcd Aratavolt ; "V  "End IfWaitms 60Loop
***************************************
'Program de test FORUM - nickrvl'4 februarie 2014$regfile = "attiny24.dat"$crystal = 8000000$hwstack = 40$swstack = 8$framesize = 40$simConfig Lcd = 16 * 2Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portb.0 , Rs = Portb.1Cursor OffConfig Adc = Free , Prescaler = Auto , Reference = AvccOn Adc Adc_isr NosaveEnable AdcEnable InterruptsDim Aratavolt As String * 8Dim W As Word , Channel As Byte , Volt As Single , Flag As BitChannel = 3Flag = 0Do  Channel = 3  Start Adc  Idle  Stop AdcIf Flag = 1 Then  Gosub Display_lcdEnd IfLoopEndDisplay_lcd:Flag = 0Volt = W * 100Volt = Volt / 1024Aratavolt = Str(volt)Locate 2 , 1Lcd Fusing(volt , "##.#") ; "V  "Waitms 200ReturnAdc_isr: Flag = 1  push r26  push r27  push r24  in r24,sreg  push r24  push r25  W = Getadc(channel)  pop r25  pop r24  !out sreg,r24  pop r24  pop r27  pop r26Return
Link spre comentariu

@nickrvl: Mea culpa cu privire la zgomot si modul in care se reflecta aspra masuratorilor (intr-adevar valoarea afisata ar fi mai mare ca cea reala), insa eram cu mintea in vacanta. Restul afirmatiilor cu privire la masuri raman in continuare valabile insa.

Acum, sa abordam prima parte a solicitarii tale: varianta de firmware pe care ti-am dat-o presupune utilizarea intreruperilor si a functiei de "Noise reduction" prin trecerea uC in starea de "sleep" pana la terminarea conversiei.

La sfarsitul timpului de conversie, ADC-ul genereaza o intrerupere care scoate uC din starea de sleep si prelucreaza valoarea masurata intr-o forma afisabila.

In subrutina de intrerupere sunt comenzi in assembler care presupun salvarea unor registri inainte de achizitia ADC, scrierea unor dintre ei cu valoarea ADC si restaurarea altora pentru a nu tulbura buna functinare a programului in sine.

Pentru a doua parte a postarii tale, programul propus de tine nu face altceva decat sa preia valoarea masurata de ADC, nu o converteste in tensiune ci doar o prelucreaza intr-o forma afisabila conform dezideratului tau si asta din cauza lipsei din program a formulei de conversie. Ca urmare, valoarea afisata a ceea ce crezi tu ca reprezinta valoarea tensiunii masurate este doar valoarea ADC neconvertita in tensiune dar formatata.

Nu acelasi lucru se poate spune despre programul postat de mine in schimb.

Pe de alta parte, in imaginea atasata este rezultatul masuratorii tensiunii de 3.3V de pe o placa Arduino (folosind acelasi program pe care l-am postat) si comparatia cu aparatul meu de masura. Dupa cum vezi este o eroare de circa 40mV si nu de 200mV sau si mai rau. Asta ma face sa cred ca aparatul tau de masura s-ar putea sa aiba unele probleme.

Sper ca raspunsul meu sa iti clarifice unele intrebari.

post-40487-139829752449_thumb.jpg

Link spre comentariu

Vad ca s-a scris mult pe tema asta ... pana la urma n-am inteles daca acum masoara mai liniar si cu cat decat cu primul program simplu care nu tinea cont de formula de conversie . Neliniaritatea scalei mai apare desigur si de la divizorul rezistiv de la intrare , alta divizare fata de ce scrii in soft , si valoarea referintei ADC-ului care trebuie masurata cu un aparat precis si scrisa in softEu am facut voltmetre cu Atmega , pus la punct e identic cu un aparat de masura

Link spre comentariu

Vad ca s-a scris mult pe tema asta ... pana la urma n-am inteles daca acum masoara mai liniar si cu cat decat cu primul program simplu care nu tinea cont de formula de conversie . Neliniaritatea scalei mai apare desigur si de la divizorul rezistiv de la intrare , alta divizare fata de ce scrii in soft , si valoarea referintei ADC-ului care trebuie masurata cu un aparat precis si scrisa in soft

Eu am facut voltmetre cu Atmega , pus la punct e identic cu un aparat de masura

Da, intr-adevar, s-a scris cam mult pe aceasta tema si, in mod particular, pe marginea programului propus de userul nickrvl pentru a indeparta o confuzie facuta de el in programul initial.

In alta ordine de idei, liniaritatea masuratorii este data in principal de caracteristicile electrice intrinseci ale ADC (vezi foaia de catalog) si mai putin de raportul de divizare care este constant si introduce o eroare constanta in masurari. Intotdeauna ceea ce scrii in soft aia primesti, microcontroller-ul nu este o forma de inteligenta artificiala care sa-ti corecteze greselile.

Valoarea tensiunii de referinta o poti msura atata timp cat este externa, insa cand folosesti referinta interna lucrurile se complica. Si cu toate acestea pe cale software se poate stabili valoara "exacta" a referintei interne, insa intr-un Attiny24 nu ar fi intrat liniile de cod aditionale.

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