Sari la conținut
ELFORUM - Forumul electronistilor

Termometru PIC16F690 afisaj 7SEG+LM35


danpin

Postări Recomandate

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_functionhttps://en.wikibooks.org/wiki/C_Programming/Procedures_and_functionshttp://www.csee.umbc.edu/~chang/cs313.s02/stack.shtml

Link spre comentariu

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 de bandi12
Link spre comentariu

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

 

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
Link spre comentariu

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 de mars01
Link spre comentariu

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 de mars01
Link spre comentariu

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 de mars01
Link spre comentariu

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

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

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 de Liviu M
Link spre comentariu

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 de mars01
Link spre comentariu

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

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

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

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 de mars01
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