t_alex92 Postat Iunie 29, 2014 Partajează Postat Iunie 29, 2014 Multmesc mult!. Am descarcat si eu mikroC si asa merge..probabil e diferenta de sintaxa sau librarii.. Link spre comentariu
t_alex92 Postat Iulie 1, 2014 Partajează Postat Iulie 1, 2014 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
UDAR Postat Iulie 1, 2014 Partajează Postat Iulie 1, 2014 10. A fost incrementat în bucla for până la 10 când s-a părăsit bucla. Link spre comentariu
t_alex92 Postat Iulie 1, 2014 Partajează Postat Iulie 1, 2014 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
UDAR Postat Iulie 1, 2014 Partajează Postat Iulie 1, 2014 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
Marian Postat Iulie 1, 2014 Partajează Postat Iulie 1, 2014 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
t_alex92 Postat Iulie 1, 2014 Partajează Postat Iulie 1, 2014 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
Liviu M Postat Iulie 1, 2014 Partajează Postat Iulie 1, 2014 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
XAN77 Postat Iulie 5, 2014 Partajează Postat Iulie 5, 2014 î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
Marian Postat Iulie 5, 2014 Partajează Postat Iulie 5, 2014 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
XAN77 Postat Iulie 5, 2014 Partajează Postat Iulie 5, 2014 da, asa este, am verificat, mea culpa. Link spre comentariu
XAN77 Postat Iulie 5, 2014 Partajează Postat Iulie 5, 2014 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
UDAR Postat Iulie 6, 2014 Partajează Postat Iulie 6, 2014 Fii , te rog , mai concret/explicit. Subiectul poate fi interesant. Link spre comentariu
XAN77 Postat Iulie 6, 2014 Partajează Postat Iulie 6, 2014 (editat) 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 Iulie 6, 2014 de XAN77 Link spre comentariu
UDAR Postat Iulie 6, 2014 Partajează Postat Iulie 6, 2014 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
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum