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 naem pøípadì cca 2,5x míò - pak by vyel 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 pouité 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