Zahada s termistorem a referenci

Jan Waclawek konfera na efton.sk
Neděle Březen 4 19:00:01 CET 2018


> eeprom long     eRefKor=CAL_min-1;

To je CodeVision? Tie eeprom premenne su v pamati, alebo sa citaju
priebezne z eeprom?

A nema nahodou nutkanie optimalizovat? T.j. nemohlo sa stat, ze v tom
vyraze v cykle, kde sa priemeruje, sa pouzila skutocna hodnota ulozena v
eeprom (t.j. ta okolo 1000); kdezto v tom "korekcnom" vyraze kompilator
mohol nadobudnut, ze sa ta hodnota od inicializacie nezmenila a pouzit ju
ako konstantu, t.j. (CAL_min-1)=899?

wek


PS. Read-only clen konferencie mal pripomienku, ze ak je zapojeny termistor
v hornej vetve delica, tak by pri urcitom sposobe konecneho vypoctu
teploty mohli vychadzat zaporne cisla (co zase by mohli pri neznamienkovej
reprezentacii sposobit problem) - ale nemyslim si, ze toto je ten zakladny
problem tu



----- Original Message ---------------

Subject: Re: Zahada s termistorem a referenci
   From: "Pavel Hudecek" <edizon at seznam.cz>
   Date: Sun, 4 Mar 2018 14:36:17 +0100
     To: "HW-news" <hw-list at list.hw.cz>

>Mezitím jsem to dost pøekopal, ale neva:
>
>int je 16b
>
>#define FIRST_ADC_INPUT 0
>#define LAST_ADC_INPUT  7
>#define ADC_inputs      LAST_ADC_INPUT-FIRST_ADC_INPUT+1
>#define ADC_kroku       300L  // pocet kroku mericiho cyklu - muze byt 
>300/400/1000
>#define CAL_min     900       // min povolena hodnota eRefKor
>#define AD_lsb      (1.07421875)          // 1,1V / 1024 = 0,00107421875 | 
>1AD = 1,07421875 mV
>#define TEMP_const  2.5                   // Rt/(Rn + Rt) : Rt 10k, Rn 15k
>#define AD_Tind     (0+FIRST_ADC_INPUT)
>#define AD_T        adPrum[AD_Tind]
>#define AD_intDiv   10    // korekce aby long int nepretekal
>
>globální:
>eeprom long eCalConst[] = { // sem za chodu programu zatim nic nezapisuje
>  TEMP_const * 1000.0 / (float)AD_intDiv,
>  ...
>};
>eeprom long     eRefKor=CAL_min-1;// kalib. ref: =1000 pri ref 1,100 V / 
> >1000 pro <1,1 V / CAL_min-1 nekalibr.
>long                  kalibraceRef=0;
>
>lokální:
>static long           ADt[ADC_inputs];
>
>V ADt mùže být až 1023 * ADC_kroku
>V našem pøípadì cca 2,5x míò - pak by vyšel výsledek 1000 pøi 25 °C
>
>výpoèet:
>for(n=0; n<ADC_inputs; n++) {  // vypocet 
>prumeru ----------------------------------
>    adPrum[n] = (((ADt[n] * eCalConst[n]) / ADC_kroku) * AD_intDiv) / 
>eRefKor;
>    ADt[n]=0;
>}
>
>... další kód, který ale nezapisuje do žádné zde použité promìnné
>
>AD_T = (AD_T * eRefKor) / 1000;
>
>Výchozí eRefKor je 899 a pak se zmìní na kolem 1000:
>
>Tpøed   eRefKor  Tpo
>-----------------------------
>1223    1005    1099
>1201    1004    1077
>1195    1005    1074
>1189    993      1069
>
>-----
>Aktuální stav, kdy se pøed/po neliší, nebo jen o 1:
>
>for(n=0; n<ADC_inputs; n++) {  // vypocet 
>prumeru ----------------------------------
>    if (n==AD_Tind) {
>        adPrum[n] = (((ADt[n] * eCalConst[n]) / ADC_kroku) * AD_intDiv) / 
>1000;
>    } else {
>        adPrum[n] = (((ADt[n] * eCalConst[n]) / ADC_kroku) * AD_intDiv) / 
>eRefKor;
>    }
>    ADt[n]=0;
>}
>
>PH
>
>-----Pùvodní zpráva----- 
>From: Jan Waclawek
>Sent: Sunday, March 04, 2018 1:05 AM
>To: HW-news
>Subject: Re: Zahada s termistorem a referenci
>
>Aha a samozrejme aj vsetky typy ktore v tych vzorcoch vystupuju, a
>sizeof(int).
>
>wek
>
>----- Original Message ---------------
>>No dajte tie konkretne cisla (s povodnym kodom samozrejme).



Další informace o konferenci Hw-list