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