mars01 Postat Iulie 10, 2015 Partajează Postat Iulie 10, 2015 Variabilele se declara UNSIGNED atunci cand stim ca acea variabila va avea valori pozitive tot timpul. In acest caz, efectiv valoarea posbil stocata in ele se "dubleaza" fata daca s-ar folosi tipul SIGNED. O variabila SIGNED LONG stocheaza valori pozitive pana la ceva mai mult de 2.147 miliarde pe cand o variabila UNSIGNED LONG stocheaza numai valori pozitive pana la cca 4,294 miliarde. PIC-ul folosit are doar 8 nivele in stiva hardware asa ca ar trebui economisite prin folosirea functiilor in mod judicios. Pentru un program atat de simplu nu sunt probleme dar daca programul ar fi complex atunci ar putea deveni problematic. Intr-adevar impachetarea instructiunilor in functii arata mai bine si este mai usor de citit programul dar nu aduce nimic in plus in performanta ba chiar scade o idee viteza de executie. In schimb ar fi poate avantajos daca variabilele folosite in functie ar fi declarate local si nu ar fi folosite variabile globale mai ales cand memoria RAM este limitata. Chestia cu apelurile functiilor cam asa este cum ai scris. Pentru mai mult: https://en.wikipedia.org/wiki/Inline_function, https://en.wikibooks.org/wiki/C_Programming/Procedures_and_functions, http://www.csee.umbc.edu/~chang/cs313.s02/stack.shtml 1 Link spre comentariu
Bandi Szasz Postat Iulie 10, 2015 Partajează Postat Iulie 10, 2015 (editat) La ce viteza lucreaza un PIC in zilele noastre (20mhz) la un banal termometru nu o sa se vada nici o diferenta intre unsigned long si long, poti folosii ambele variante. A doua chestie pe care poti face sa utilizezi returnari in loc de variabile globale ( declarate sus in primele linii). De ex. int readADC(short ch){ int reading =0; for(......) reading += ADC_Get_Sample(ch);.......return reading}int calcTemp(){ int temp = 0; int adcReading = readADC(9); ...... calculezi temp.return temp;}void display(){ int tempToDisplay = calcTemp(); ... si afisezi continutul lui tempToDisplay} Editat Iulie 10, 2015 de bandi12 Link spre comentariu
Depanatoru Postat Iulie 10, 2015 Partajează Postat Iulie 10, 2015 Uitandu-ma la schema pusa de tine , fara un filtru trece jos la intrarea ADC-ului sa nu te miri ca nu e stabila indicatia . Cand e facuta partea hardware calumea , pentru masurat tensiune continua nu trebuie eliminata prima citire a ADC-ului , mediere si alte complicatii ... Link spre comentariu
nico_2010 Postat Iulie 10, 2015 Partajează Postat Iulie 10, 2015 ADC-ul pe 10biti numara de la 0 la (2^10)-1 = 1023. Dar sunt 1024 valori (1023 valori + 0). Din aceasta cauza, rezolutia in mV este de Vref/1024, in cazul tau 2.5V/1024 = 2.441mV. Daca dorim sa aflam ce tensiune corespunde la o citire binara atunci se foloseste formula: Vin = Vref * (ADC_read/((2^N)-1). In cazul tau, Vin = 2.5V * (ADC_read/1023) Prima data aflam rezolutia in tensiune. A doua oara interpretam o citire binara a ADC-ului pentru a afla tensiunea la intrarea ADC-ului. Fara a fi interpretat gresit, in pasajul marcat este o eroare, iar explicatia este aici (posturile 1 si 2): http://forum.allaboutcircuits.com/threads/why-adc-1024-is-correct-and-adc-1023-is-just-plain-wrong.80018/ In plus, formula de calcul a valorii ADC (data de orice producator de convertoare ADC) este : ADC= (Vin * 1024)/Vref De aici Vin va fi: Vin = (ADC * Vref)/1024 in niciun caz: Vin = (ADC * Vref)/1023 1 Link spre comentariu
mars01 Postat Iulie 10, 2015 Partajează Postat Iulie 10, 2015 (editat) Nico, foarte informativ link-ul. Multumesc. Am sters chestiile postate initial pentru ca nu fac decat sa adanceasca confuzia. LE: Desi se poate vedea cam care este pozitia producatorului, Microchip, pe baza careia mi-am formulat opinia, aici de exemplu: http://ww1.microchip.com/downloads/en/AppNotes/Achieving%20Higher%20ADC%20Resolution%20Using%20Oversampling%2001152A.pdf sau aici: http://ww1.microchip.com/downloads/en/AppNotes/01072A.pdf Editat Iulie 10, 2015 de mars01 Link spre comentariu
mars01 Postat Iulie 10, 2015 Partajează Postat Iulie 10, 2015 (editat) Dupa ce am mai studiat problema cu impartirea la 1023 sau 1024 cred ca atata timp cat rezultatele vor fi doar aproximari date de ADC cu o anumita eroare destul de complex de evaluat,eu prefer sa urmez recomandarea producatorului, iar acesta conform link-urilor postate mai sus este: Vin = Vref * (ADC_read/((2^N)-1)Pt 10bit,Vin = Vref * (ADC_read/1023) LE: Mai devreme am avut o discutie destul de lunga cu un coleg programator, care implica formule de calcul pentru eroare, realizare de grafice, etc. Rezultatul a fost ca mai bine se ia in considerare recomandarea producatorului deci formula pe care am enuntat-o este corecta. Cel putin pentru mine si pentru el si pentru producator (Microchip). Chiar si numai pentru ca este necesar sa avem o "referinta" comuna. Nu zic ca opinia celui din link-ul http://forum.allaboutcircuits.com/threads/why-adc-1024-is-correct-and-adc-1023-is-just-plain-wrong.80018/ nu are o valoare, doar ca nu este ceva formal asa cum este un application note sau un datasheet. Pt aplicatiile de zi cu zi insa diferenta data de impartire la 1023 vs 1024 nu este atat de mare incat pana la urma fiecare face cum crede. In orice caz, multumesc lui Nico pentru ca a adus aceasta informatie. Editat Iulie 10, 2015 de mars01 Link spre comentariu
mars01 Postat Iulie 10, 2015 Partajează Postat Iulie 10, 2015 (editat) Uitandu-ma la schema pusa de tine , fara un filtru trece jos la intrarea ADC-ului sa nu te miri ca nu e stabila indicatia . Cand e facuta partea hardware calumea , pentru masurat tensiune continua nu trebuie eliminata prima citire a ADC-ului , mediere si alte complicatii ... Aveti dreptate ca se poate face si asa. Atata timp cat intelegeti ca este doar o abordare, una hardware. Filtrarea se poate face si in cod, deci o abordare software. Este la fel cu debounce-ul pentru un buton conectat la un microcontroller. Se poate face hardware cu un condensator, rezistor si un triger Schmidt sau se poate face in firmware cu un simplu delay. Editat Iulie 10, 2015 de mars01 Link spre comentariu
Liviu M Postat Iulie 10, 2015 Partajează Postat Iulie 10, 2015 Referitor la impartirea cu 1023 sau 1024, m-am jucat cu un calculator de buzunar, l-am comutat pe binar, am tastat de 10 ori 1, l-am comutat pe zecimal si am citit rezultatul conversiei: 1023. Cu alte cuvinte, valoarea maxima reprezentabila pe 10 biti e 1023. Asa ca pentru a afla cati mV are un LSB, luam valoarea maxima a intervalului de masurat (Vref_pos - Vref_neg) si o impartim la valoarea maxima reprezentabila pe 10 biti, adica 1023. Nu? Link spre comentariu
UDAR Postat Iulie 10, 2015 Partajează Postat Iulie 10, 2015 Imi cer iertare ca intervin , discuția asta cu 2^N vs 2^N-1 a mai fost , chiar si pe acest forum daca îmi amintesc bine . Eu propun un exercițiu . Avem un DAC ( nu ADC ) de N biți cu o referință REF . Când toți biții sunt ”1” tensiunea la ieșire este REF * ( 2^N-1)/2^N pentru că MSB dă REF/2 , următorul dă REF/4.... ultimul (LSB ) dă REF/2^N . Nu vi se pare logic că la ADC să avem reciproca ? Link spre comentariu
Liviu M Postat Iulie 10, 2015 Partajează Postat Iulie 10, 2015 (editat) Da, eram in erore. Am mai sapat acum si m-am prins de unde-mi vine confuzia. Aveam senzatia ca intr-un ADC pentru "toti bitii = 1" Vref e legat direct la intrarea converterului (adica ADC_MAXIM = Vref), da' m-am uitat acum pe un pdf de la analog devices si am vazut ca in cazul "toti bitii 1" intre intrarea ADC si Vref mai e "un LSB". Asa ca imi cer scuzele de rigoare pentru "dezinformarea" anterioara si afirm ca Nico are dreptate si e "1/1024". Editat Iulie 10, 2015 de Liviu M Link spre comentariu
mars01 Postat Iulie 11, 2015 Partajează Postat Iulie 11, 2015 (editat) Se pare ca si tipii de la Microchip sunt confuzati. In acest application note se sustine ceea ce a afirmat @nico_2010: http://ww1.microchip.com/downloads/en/appnotes/00693a.pdf inclusiv faptul ca un ADC poate scoate coduri binare conform: "Each digital output code represents a fractional valueof the reference voltage. The largest value that can beobtained from the A/D converter is (N-1)/N, where N isthe resolution in bits. Referring to Figure 2, the largestoutput value that the 3-bit A/D converter can produce is7/8ths of the full-scale reference voltage." Tradus: " Fiecare cod digital la iesire reprezinta un procent din tensiunea de referinta. Valoarea cea mai mare care poate fi obtinuta dintr-un ADC este (N-1)/N, unde N este rezolutia in biti. Cu referire la figura 2, cea mai mare valoare de iesire pe care un convertor analog digital ADC o poate produce este 7/8 din tensiunea de referinta." Editat Iulie 11, 2015 de mars01 Link spre comentariu
UDAR Postat Iulie 11, 2015 Partajează Postat Iulie 11, 2015 Oricine poate greși.... inclusiv în citatul de mai sus , corect era , evident , (2^N-1)/2^N pentru codul maxim generabil de un ADC. Nu sunt foarte rare cazurile de mici erori în Notele de aplicații - de la Microchip în particular , dar și de la alții. Link spre comentariu
mars01 Postat Iulie 11, 2015 Partajează Postat Iulie 11, 2015 Pai in aceste conditii ... cu o eroare atat de crasa (e drept ca apare mai jos un ajutor cand face referire la 7/8 din Vref), este usor de inteles de ce anumite informatii sunt neclare. Link spre comentariu
UDAR Postat Iulie 11, 2015 Partajează Postat Iulie 11, 2015 Eu nu aș fi chiar atât de aspru ... Notele de aplicații sunt ceea ce le spune numele - detalii despre folosirea componentei respective . Teoria fundamentală se ia din manuale sau din alte materiale cu caracter teoretic/didactic mult mai bine verificate ( în principiu cel puțin ) . Link spre comentariu
mars01 Postat Iulie 11, 2015 Partajează Postat Iulie 11, 2015 (editat) Application note-ul acela este din 2000. De atunci aveau timp sa il verifice si sa il corecteze. Plus ca aceste app note sunt documente menite sa clarifice nu sa ne bage in ceata. De ex la TI nu am vazut app note care sa aiba erori de acest gen. La Microchip am gasit mai multe app note in care in unele se afirma o chestie care apoi sa fie infirmata in altele. Sunt cum s-ar spune "unreliable". Ceea ce este grav. In fine, termometrul o sa meaga bine indiferent cu cat imparte, 1023 sau 1024. Erorile vor fi minimale si vor fi introduse mai mult de senzor. Editat Iulie 11, 2015 de mars01 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