Sari la conținut
ELFORUM - Forumul electronistilor

voltampermetru cu pic 16f876


winston

Postări Recomandate

Buna ziua! Imi poate explica si mie cineva urmatoarele linii de cod:

//Achizitie ADCTensiune = 0;Curent = 0;Temp = 0;for (ADCx=0; ADCx<10; ADCx++) {Tensiune += ADC_Read(0); // Achizitie TensiuneCurent += ADC_Read(1); // Achizitie curentTemp += ADC_Read(2); // Achizitie TemperaturaDelay_ms(50);}//TensiuneTensiune = Tensiune/ADCx; // Alocare valoare tensiuneV = (long)Tensiune*200; // Converteste rezultat in milivolti

Cat este ADCx?

Link spre comentariu

Eu nu inteleg partea asta:

Tensiune = Tensiune/ADCx; // Alocare valoare tensiune

Sa inteleg ca ADCx ia o valoare din cele 10 iteratii?

Cu cat fac bucla mai mare cu atat achizitioneaza mai multe valori? Si la ce ajuta?

 Am incrementat bucla for doar de 3 ori si functioneaza la fel.

Link spre comentariu

Bucla se repetă atâta timp cât condiția din mijloc ( ADCx < 10 ) este adevărată. La ieșirea din buclă ADX are valoarea din dreapta operatorului - 10 în acest caz . Se împarte apoi la numărul de repetări ale buclei = se face o medie , de aceea obții aceiași valoare . De ce se face , e o teorie mai lungă despre eliminarea zgomotelor , uneori și o mărire a rezoluției ( când se împarte la un număr mai mic decât cel al repetărilor)  , etc 

Link spre comentariu

O sa incerc sa descriu liniile in ordinea numerotarii lor din citatul postat de tine @t_alex92:

 

-2, 3 si 4 se seteaza la 0 valoarea initiala a variabilelor Tensiune, Curent si respectiv Temp ( temperatura ).

-5 Incepe bucla for in care se foloseste variabila ACDx careia i se acorda valoarea initiala 0, se verifica starea ei si se incrementeaza cu 1;

-6, 7 si 8 se citesc intrarile analog presetate si se aduna la fiecare variabila in parte pentru fiecare incrementare a ADCx;

-....

-13 Aloca valoarea variabilei Tensiune ca fiind media celor 10 incrementari;

 

Ideea este xca se fac 10 citiri si se aloca valoarea medie variabilei de interes, creste astfel precizia masurarii si imunitatea la zgomot. Se foloseste o bucla for care indeplineste scopul cu doar cateva randuri de cod si deci spatiu putin ocupat in uC. Solutia ii apartine lui @LiviuM si mi se pare una foarte eleganta.

Link spre comentariu

Bun... pana aici am inteles perfect. Multumesc pentru lamurire.

Mai am o nelamurire:

//Temperatura            Temp = Temp/ADCx;                                   // Alocare valoare temperatura            T = (long)Temp*990;                                 // Converteste rezultatul in mV            T = T/1023;                                         // 0...1023 => 0...990mV

De ce se inmulteste cu 990?

Link spre comentariu

Citeste formula completa:

T = Temp*(990/1023);       

Pentru ca la cap de scala ai 990 mV si 1023 LSB (2^10, ADC pe 10 biti), impartind milivoltii la LSB aflii cati mV are un LSB. Inmultind cu valoarea in LSB masurata de ADC, formula transforma valoarea digitala masurata de ADC in valoare analoga ca sa poata fi afisata.  

Link spre comentariu

în bucla FOR, respectiv:

for (ADCx=0; ADCx<10; ADCx++)

nu cumva ADCx ia valori de la 0 pînă la 9 ? condiția fiind ca ADCx să fie mai mic ca 10, altfel iese din buclă.

Caz în care divizarea sumei totale a măsurărilor, pentru mediere, la valoarea lui ADCx adică la 9, nu e corectă, pentru că ADCx a avut 10 valori diferite (0 la 9) deci s-au făcut 10 citiri/însumări a citirilor din ADC.

Nu am mai scris cod de mult, poate nu mai țin nici eu bine minte.

Link spre comentariu

Conditia ramanerii in bucla for este ca ACDx sa fie mai mic decat 10, doar atunci cand nu mai este indeplinita aceasta conditie se iese din bucla si asta se face acordandu-i-se valoarea 10 lui ACDx, adica este ok.

Link spre comentariu

am văzut pe aici versiuni de soft unde afișarea are prea mulți digiți față de rezoluția ADC de 1024 ceea ce nu permite incrementarea cu cîte o unitate dar nu am văzut să se folosească oversampling! Sau nu mă uit eu bine.

Link spre comentariu

păi văd prin poze 50,00V, ca să nu zic că sunt și versiuni cu 3 cifre după virgulă. Ceea ce ar însemna o afișare (pentru 50,00) de la 0000 la 5000 ceea ce nu deține controlerul decît prin oversampling, adică citirea mai multor eșantioane, adunarea tutuor într-o variabilă și împărțirea la un număr mai mic decît numărul de citiri însumate. Mărirea rezoluției la 11 sau mai mulți biți. Să ai o afișare din 2 în 2 sau din 5 în 5 mi se pare inadecvat.

Editat de XAN77
Link spre comentariu

Ai pus punctul pe i. Foarte multe scheme publicate pe aici și pe aiurea suferă de acestă problemă. Acu, ce vreau eu să subliniez , este că nu e suficient să faci 64 citiri și să împarți la 16 pentru a obține o rezoluție de 12 biți în loc de 10. Asta este , pur și simplu, o ajustare a capătului de scală afișat - nu o mărire a rezoluției. Trebuie folosit cu rezervă termenul de oversampling când vorbim de măsurători de CC . Oversampling înseamnă eșantionarea la o frecvență mai mare decît cea minimă prevăzută de Shannon ( sau de Shannon - Nyquist ) . Cât este asta la curent continuu ? Eu cred că dithering-ul este soluția la această problemă. E drept , de multe ori , dithering-ul se face de la sine , pe baza zgomotelor intrinseci. Și încă ceva . Oversampling-ul și/sau dithering-ul NU corectează erorile de INL .

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