mars01 Postat Decembrie 2, 2017 Partajează Postat Decembrie 2, 2017 (editat) Problema apare adesea ca pentru PIC nu se stie daca valoarea 1023 sau 1024 corespunde la 5V (cand Vref este 5V). Se pare ca este mai corect insa sa se foloseaca valaorea de 1024 pentru 5V. http://www.electro-tech-online.com/threads/why-adc-1024-is-correct-and-adc-1023-is-just-plain-wrong.132570/ Editat Decembrie 2, 2017 de mars01 Link spre comentariu
UDAR Postat Decembrie 2, 2017 Partajează Postat Decembrie 2, 2017 (editat) Între 2n și 2n-1 răspunsul e foarte simplu . Să considerăm n=1 deci un convertor de 1 bit . Câte intervale avem ? Dacă ar fi un singur intreval (2n-1) nu mai avem conversie, adică orice valoare analogică am avea la intrare am avea tot timpul codul ”0” la ieșire . Ca să avem și codul ”1” înseamnă două intervale. Deci avem 2n intrevale , referința se împarte la 2n pentru a afla LSD iar tranziția de la 2n-1 la 2n ( sau overrange, după caz ) apare undeva între (2n-1/2n)*Vref și Vref . Exemplu frecvent la ADC de 10b : referința = 4.096V , 1LSD = 4mV. Tranziția de la 0b1111111111 la ”over range” apare undeva între 4.092V și 4.096V , ideal la 4.094V. Editat Decembrie 2, 2017 de UDAR Link spre comentariu
catalin004 Postat Decembrie 2, 2017 Autor Partajează Postat Decembrie 2, 2017 (editat) Si pana la urma cum este? app ce semnifica LSD ...ma refer in exemplificare, ca asa stiu despre ce calcul este vorba(nu la droguri) Editat Decembrie 2, 2017 de catalin004 Link spre comentariu
UDAR Postat Decembrie 2, 2017 Partajează Postat Decembrie 2, 2017 LSD = Least Significant Digit dar din viteză am greșit mai sus , trebuia LSB = Least Significant Bit ! Scuze . Link spre comentariu
catalin004 Postat Decembrie 3, 2017 Autor Partajează Postat Decembrie 3, 2017 Bu..si cand avem >>10 inseamna LSB nu? Link spre comentariu
nico_2010 Postat Decembrie 3, 2017 Partajează Postat Decembrie 3, 2017 Nu. Inseamna impatire cu 2^10 (sau cu 1024). Link spre comentariu
catalin004 Postat Decembrie 3, 2017 Autor Partajează Postat Decembrie 3, 2017 (editat) Pai insemna ca este bine in calcul ADRead*5000 >>10....adica nu am impartit la 1023 Editat Decembrie 3, 2017 de catalin004 Link spre comentariu
mars01 Postat Decembrie 3, 2017 Partajează Postat Decembrie 3, 2017 Oricum nu e ca si cum, in cazul tau, ai fi vazut diferenta intre impartire la 1023 sau la 1024 ... Partea cu impartirea la 1024 (sau shiftare la dreapta de 10 ori) este avantajoasa comparativ cu impartirea la 1023 si pentru ca este rapida (shiftarea este operatie low-level, instructiune a uC-ului). Link spre comentariu
catalin004 Postat Decembrie 3, 2017 Autor Partajează Postat Decembrie 3, 2017 Deci este mai bine cu >>10 Oricum problema nu este de acolo...maine o sa lucrez la cod pentru afisare si vad ce iese...o sa fac afisarea pe cel cu 4x20... Link spre comentariu
catalin004 Postat Decembrie 4, 2017 Autor Partajează Postat Decembrie 4, 2017 (editat) Pseudocod: Timr_ISR: ++tick_10ms; if (tick_10ms=25) then flag_Adc=1; if (tick_10ms =100) then update_data = 1; end ISR main: while(1){ if (flag_Adc) flag_Adc =0; read_ADC(); if (update_data) update_data=0; tick_10ms=0; old_data = new_data; refresh_display(old_data); } Cam asa ar trebui sa arate programul. Si 4880 reprezinta valoarea LSB = 1/1024 = 4.88mV x 1000, pentru a nu lucra cu variabile de tip float. Si este 1024, nu 1023 cum am vazut scris eronat in muuulte locuri pe net, deoarece sunt 1024 de valori, de la 0 la 1023. Cum pot reseta acelasi counter?Adica el va merge pana la 250ms apoi flag ADC=1, dar cand il resetez?sau cum face cele 4 citiri? tick++; if(tick >=250){ ADCflag=1; ...... Stiu ca a iesit ca naiba dar merge...Acum astept corectarile de rigoare am pus doar headerul unde fac citirea...unde actualizez AdcRead nu sunt sigur ca am facut bine.... float temp; char strTemp[] = "00.0"; unsigned int val_temp,val_set_temp,tmp, update_display; unsigned int flash,flash_temp, flagADC; unsigned cnt=0, count=0, tick = 0; //Timer1 //Prescaler 1:1; TMR1 Preload = 61036; Actual Interrupt Time : 1 ms //Place/Copy this part in declaration section void InitTimer1(){ T1CON = 0x01; TMR1IF_bit = 0; TMR1H = 0xEE; TMR1L = 0x6C; TMR1IE_bit = 1; INTCON = 0xC0; } void Interrupt(){ if (TMR1IF_bit){ TMR1IF_bit = 0; TMR1H = 0xEE; TMR1L = 0x6C; //interrupt for stabilize the display LCD at 250m count++; tick++; if(count>=250) { flagADC = !flagADC; count = 0; } if(tick>=1000) { update_display = 1; } //interrupt for flash Warnning at 500ms if(cnt >= 500){ flash = !flash; flash_temp =! flash_temp; cnt = 0; } else{ cnt++; } } } void get_ADC(){ static int i; if(flagADC == 1){ ADC_Read(1); //Read ADC voltage } tmp = 0; //make an averrage for 10 reads for(i = 0;i<10;i++){ tmp=tmp+ADC_Read(1); } tmp = tmp/10; temp = ((long)tmp*4900)>>10; } void tempToStr(float, char*); //buffer function for show float temperature void tempToStr(float old_temp, char *buffer) { val_temp = (int)old_temp; buffer[3] = val_temp % 10+48; buffer[1] = val_temp/10 % 10+48; buffer[0] = val_temp/100 % 10+48; } void display_temp(){ static float old_temp; { if(update_display == 1){ update_display = 0; old_temp = temp; tick=0; } tempToStr(old_temp, &strTemp); // convert FLOAT to STRING LCD_Out(1,5, "Temp="); LCD_Out(1, 10, strTemp); // show string value LCD_Chr_Cp(223); //simbol character for degrees LCD_Chr_Cp('C'); //Celsius character to end of row }} float setTemp=30; //initial set ideal temperature work char strSetTemp[] = "00.0"; //buffer function for show float settemperature(referinta) void SetTempToStr(float SetTemp, char *buff) { val_set_temp = SetTemp*10; //convert setTemp in mV buff[3] = val_set_temp % 10+48; buff[1] = val_set_temp/10 % 10+48; buff[0] = val_set_temp/100 % 10+48; } void display_set_temp1(){ LCD_Out(2,4, "SetTemp="); SetTempToStr(SetTemp, &strSetTemp); LCD_Out(2,12, strSetTemp); LCD_Chr_Cp(223); //simbol character for degrees LCD_Chr_Cp('C'); //Celsius character to end of row } void display_set_temp2(){ LCD_Out(2,4, "SetTemp="); LCD_Out(2,12," "); } Editat Decembrie 4, 2017 de catalin004 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