Zahada s termistorem a referenci

Pavel Hudecek edizon na seznam.cz
Pondělí Březen 5 00:08:23 CET 2018


jojo, codevision. A optimalizace tímto způsobem by asi jako vysvětlení 
dávala smysl:-)

Takže příště při podobných okolnostech radši přidám volatile:-)

A termistor je zapojený dole. Už proto, že nerad tahám dráty s referencí 
zbytečně daleko.

Záporný výsledek by jinak v longu nevadil a záporná teplota je vlastně taky 
normální. Ale není mi jasné, jak by to mělo fungovat. Když termistor 
zkratuju, dostanu 0, pokud by to bylo naopak, tak 2500. Když ho rozpojím, 
dostanu 2500 a když to bude naopak, dostanu 0.

PH

-----Původní zpráva----- 
From: Jan Waclawek

> 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 ---------------
   From: "Pavel Hudecek" <edizon na seznam.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;
>} 



Další informace o konferenci Hw-list