catalin004 Postat August 10, 2017 Partajează Postat August 10, 2017 (editat) < do { temp_value = ADC_Read(0); tempinK = temp_value*5000/255; //tempinK = tempinK*10; tempinC = tempinK-273.15; //tempinF = 9*tempinC/5 + 3200; Display_Temperature(); Delay_ms(500); // Temperature sampling at 1 sec interval } while(1); } > Am postat doar partea de afisare si calcul....ca sa nu incarca forumul Editat August 10, 2017 de catalin004 Link spre comentariu
nico_2010 Postat August 10, 2017 Partajează Postat August 10, 2017 Pare OK portiunea de program. Ce nu functioneaza sau, si mai bine, ce valori afiseaza? Butonul de care vorbea mars01 este asta: si il gasesti pe bara editorului prin care faci postarile Link spre comentariu
catalin004 Postat August 10, 2017 Partajează Postat August 10, 2017 Deci senzorul l-am alimentat astfel, insa procesorul este un PIC: temperatura afisata nu este reala...adica este mai mare decat cea normala..... Link spre comentariu
nico_2010 Postat August 10, 2017 Partajează Postat August 10, 2017 Si cu cat este mai mare(mai mica) temperatura afisata fata de cea reala? Lucrezi pe breadboard? Link spre comentariu
catalin004 Postat August 10, 2017 Partajează Postat August 10, 2017 Nu lucrez pe breadboard....am o placa de test facuta de mine...de pe care scot procesorul si il scriu apoi fac testul...LM este montat tot pe ea....temperatura este mai are cu 6-7 grade...am incercat si din ADJ insa daca ii pun potentiometrul sta fixa la 22 si nu modifica nimic...in general ma interea formula de calcul , restul poate e din hard.... Link spre comentariu
nico_2010 Postat August 10, 2017 Partajează Postat August 10, 2017 Citeste foaia de catalog. Masurarea temperaturii in regim necalibrat da o eroare de 6-7 grade. Link spre comentariu
catalin004 Postat August 10, 2017 Partajează Postat August 10, 2017 Si calibrarea cum o fac?cu alt termometru? Link spre comentariu
Elison Postat August 10, 2017 Partajează Postat August 10, 2017 (editat) Calibrarea o poti face la punctul de inghet sau fierbere al apei, sau la temperatura corpului, este destul de stabila, insa calibrarea n-o sa te ajute sa afisezi temperatura cu o rezolutie mai mica de doua grade celsius, asta din cauza convertorulului ADC de 8 biti. Abateri mari poti sa ai si din cauza faptului ca in program nu lucrezi cu variabile de tipul float. Editat August 10, 2017 de Elison Link spre comentariu
catalin004 Postat August 10, 2017 Partajează Postat August 10, 2017 Imi puteti da un exemplu de astfel de variabile?multumesc...sau de un programel cu variabile... Link spre comentariu
Elison Postat August 10, 2017 Partajează Postat August 10, 2017 (editat) Incearca sa intelegi ce scrie aici Editat August 10, 2017 de Elison Link spre comentariu
Mircea Postat August 10, 2017 Partajează Postat August 10, 2017 Abateri mari poti sa ai si din cauza faptului ca in program nu lucrezi cu variabile de tipul float.Puteti argumenta afirmatia asta? Multumesc. Link spre comentariu
Elison Postat August 11, 2017 Partajează Postat August 11, 2017 Puteti argumenta afirmatia asta? Multumesc. Sa presupunem ca tempinC este variabila de tipul INT, asta inseamna, conform codului atasat, ca la o valoare temp_value de 143 o sa avem tempinC egal 2529 in loc de 2529.85. Link spre comentariu
puriu Postat August 11, 2017 Partajează Postat August 11, 2017 La un LM335 necalibrat, eroarea de 6 grade este normala. Cu un ADC pe 8b, rezolutia este de 2 grade si eroarea indicatiei poate creste. In primul rand, senzorul trebuie calibrat cu o tensiune ajustabila intre OUT si GND. Daca nu merge, senzorul are calibrarea defecta. Se poate realiza calibrarea si cu un al doilea ADC la care se aplica o tensiune ajustabila intre GND si +5V. Se aduna la valoarea citita la ADC1 o valoare (pozitiva sau negativa) proportionala cu cea citita la ADC2 (N - 128). Rezolutia de 8b (20 mV) a MC este prea slaba, ar trebui macar 10b (5 mV) pentru a arata fiecare grad. Se poate imbunatati mult rezolutia unui ADC prin interpolare liniara, dar este complicat. Link spre comentariu
catalin004 Postat August 31, 2017 Partajează Postat August 31, 2017 Salutare...vreau sa fac un singur buton pentru on/off am ales programul urmator...dar nu prea merge....nu vrea sail stinga....daca scot variabila, si nu bag delay , cand apas pe buton imi porneste si se opreste repede, sau face de 3 ori comanda , adica se repeta si imi reia ciclul...rog ajutor... void main() { int i=0; TRISC.F3=0; TRISB.F0=1; PORTC.F3=0; for(;;) { if (PORTB.F0==0 && i==0) { PORTC.F3=1; delay_ms(300); i=1; } if (PORTB.F0==0 && i==1) { PORTC.F3=0; delay_ms(300); i=0; } }} Link spre comentariu
mars01 Postat August 31, 2017 Partajează Postat August 31, 2017 Salut! Ceea ce iti este neclar tie este: 1. Tu trebuie sa faci un asa numit toggle: adica fiecare apasare a unui buton sa schimbe starea unei iesiri. Prima apasare a butonului face iesirea ON, a 2-a o face OFF si tot asa. Pentru aceasta se poate face XOR pe bitul corespunzator iesirii tale din registrul portului respectiv, adica in cazul tau PORTB. Sau pur si simplu inversezi starea logica a bitului in cauza. 2. Daca doresti ca atunci cand se tine butonul apasat sa nu se intample nimic atunci tot ce trebuie sa faci este sa tii cont de starea anterioara a butonului si sa conditionezi schimbarea starii iesirii de faptul ca anterior, pe interatia precedenta prin bucla, iesirea sa fi fost in stare diferita. Cu alte cuvinte o varianta ar fi asa: void main() { TRISC.F3 = 0; // iesire TRISB.F0 = 1; // buton PORTC.F3 = 0; while(1) { if (PORTB.F0 == 0) { delay_ms(10); if (PORTB.F0 == 0) { PORTC.F3 = !PORTC.F3; } } delay_ms(300); } } sau o varianta care tine cont de starea anterioara a butonului astfel incat daca se tine butonul apasat se ramane in aceasi stare, schimbarea efectuandu-se doar cand se apasa butonul, pe tranzitia de la OFF la ON. #define OFF 1 #define ON 0 void main() { unsigned char stare_anterioara = OFF; TRISC.F3 = 0; // iesire TRISB.F0 = 1; // buton PORTC.F3 = 0; while(1) { if (PORTB.F0 == OFF) { stare_anterioara = OFF; } if (PORTB.F0 == ON && stare_anterioara == OFF) { delay_ms(10); if (PORTB.F0 == ON) { PORTC.F3 = !PORTC.F3; stare_anterioara = ON; } } } } 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