Sari la conținut
ELFORUM - Forumul electronistilor

Citire temperatura/tensiune cu Vref


Postări Recomandate

  • Răspunsuri 24
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

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

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

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