temperatura e PIC

ciao

sto utilizzando un PIC16F88 con oscillatore interno a 8Mhz per leggere la temperatura da un TMP36 utilizzando una VRef di 2.048 V. Nonostante nel programma la temperatura venga letta ad intervalli e poi calcolata la media, questa oscilla sempre (+/- 0.2=B0C che poi =E8 la risoluzione max che posso ottenere). Per esempio:

17.0 / 16.8 / 17.2 / 17.0 im un arco di 10 secondi varier=E0 un paio di volte. L'alimentazione =E8 stabilizzata a 3.3V, di condesatori ce ne sono... Altri suggerimenti? lo schema =E8 in :
formatting link
oppure qui allegato in fidocad cos=EC come i sorgenti:

[FIDOCAD ] LI 100 30 105 30 LI 110 35 115 35 LI 105 30 150 30 LI 110 35 100 35 MC 105 50 0 0 045 LI 100 40 105 40 LI 105 40 105 50 MC 110 40 1 0 170 LI 110 35 110 40 LI 110 50 105 50 SA 110 35 SA 105 50 LI 95 80 100 80 LI 95 90 100 90 RV 80 75 95 95 TY 81 93 5 3 90 1 0 * LM4040 TY 91 88 4 2 0 0 0 * A TY 92 77 4 2 0 0 0 * C LI 90 65 120 65 LI 120 65 120 35 LI 120 35 115 35 LI 105 65 105 70 LI 105 80 100 80 SA 105 65 LI 100 90 105 90 LI 150 30 155 30 LI 150 35 155 35 LI 150 40 155 40 LI 150 45 155 45 LI 150 50 155 50 LI 150 55 155 55 LI 150 60 155 60 LI 150 65 155 65 LI 150 70 155 70 LI 180 30 185 30 LI 180 35 185 35 LI 180 40 185 40 LI 180 45 185 45 LI 180 50 185 50 LI 180 55 185 55 LI 180 60 185 60 LI 180 65 185 65 LI 180 70 185 70 RV 155 25 180 75 TY 157 28 4 2 0 0 0 * RA2 TY 157 33 4 2 0 0 0 * RA3 TY 157 38 4 2 0 0 0 * RA4 TY 157 43 4 2 0 0 0 * RA5 TY 157 48 4 2 0 0 0 * VSS TY 157 53 4 2 0 0 0 * RB0 TY 157 58 4 2 0 0 0 * RB1 TY 157 63 4 2 0 0 0 * RB2 TY 157 68 4 2 0 0 0 * RB3 TY 172 68 4 2 0 0 0 * RB4 TY 172 63 4 2 0 0 0 * RB5 TY 172 58 4 2 0 0 0 * RB6 TY 172 53 4 2 0 0 0 * RB7 TY 172 48 4 2 0 0 0 * VDD TY 172 43 4 2 0 0 0 * RA6 TY 172 38 4 2 0 0 0 * RA7 TY 172 33 4 2 0 0 0 * RA0 EV 165 25 171 29 TY 172 28 4 2 0 0 0 * RA1 TY 166 58 5 3 90 1 0 * 16F88 MC 105 70 1 0 080 LI 105 80 125 80 LI 125 80 125 35 LI 125 35 150 35 SA 105 80 MC 135 35 1 0 170 MC 135 45 0 0 045 SA 135 35 MC 105 100 0 0 045 LI 105 90 105 100 TY 115 50 3 2 90 0 0 * 0.1u TY 110 75 3 2 90 0 0 * 1k TY 140 45 3 2 90 0 0 * 2.2u LI 25 30 30 30 LI 25 35 30 35 LI 25 40 30 40 LI 25 45 30 45 RV 30 25 50 50 LI 50 30 55 30 LI 55 35 50 35 LI 55 40 50 40 LI 55 45 50 45 LI 95 30 100 30 LI 95 40 100 40 RV 80 25 95 45 TY 81 41 5 3 90 1 0 * TMP36 LI 95 35 100 35 TY 88 39 4 2 0 0 0 * GND TY 88 28 4 2 0 0 0 * OUT TY 89 34 4 2 0 0 0 * V+ TY 35 45 5 3 90 1 0 * MAX619 MC 35 55 0 0 170 MC 35 20 0 0 170 LI 55 45 55 55 LI 55 55 45 55 LI 35 55 25 55 LI 25 55 25 45 LI 25 30 25 20 LI 25 20 35 20 LI 45 20 55 20 LI 55 20 55 30 LI 55 35 60 35 LI 60 35 60 40 LI 60 40 55 40 LI 55 40 60 40 LI 60 40 70 40 LI 70 40 70 50 LI 70 50 105 50 SA 60 40 MC 10 65 0 0 460 LI 25 35 10 35 LI 10 35 10 65 MC 10 85 0 0 045 TY 15 85 4 2 90 1 0 * 3v(2x1.5) MC 15 35 1 0 170 SA 15 35 MC 15 45 0 0 045 TY 15 35 3 2 0 0 0 * 10u LI 25 40 20 40 LI 20 40 20 65 LI 20 65 30 65 MC 30 65 1 0 170 MC 30 75 0 0 045 LI 30 65 50 65 RV 50 60 65 70 LI 90 65 65 65 LI 60 70 60 85 MC 60 85 0 0 045 SA 30 65 TY 35 70 3 2 0 0 0 * 10u LI 70 65 70 75 LI 70 85 70 90 MC 70 90 0 0 045 SA 70 65 MC 70 75 1 0 170 TY 70 75 3 2 0 0 0 * 1u TY 52 61 3 2 0 0 0 * TC1263 TY 50 64 3 2 0 0 0 * I TY 62 64 3 2 0 0 0 * O TY 56 66 3 2 0 0 0 * GND TY 40 15 3 2 0 0 0 * 0.22u TY 30 55 3 2 0 0 0 * 0.22u TY 85 90 3 2 90 0 0 * 2.048 TY 80 20 3 2 0 0 0 * 10mV/=B0C TY 45 60 3 2 0 0 0 * 5V TY 70 60 3 2 0 0 0 * 3.3v LI 120 65 135 65 LI 135 65 135 80 LI 135 65 145 65 LI 145 65 145 80 MC 135 80 1 0 170 MC 145 80 1 0 170 MC 135 90 0 0 045 MC 145 90 0 0 045 TY 135 80 3 2 0 0 0 * 10u TY 145 80 3 2 0 0 0 * 100n SA 135 65 SA 120 65

PROGRAM TermoLight; //{$DEFINE DEBUG_MODE} USES EEpromLib_E_a; Const ZonaTmpMax=3D$30; ZonaTmpMin=3D$20; MaxSteps=3D3;

D7S:ARRAY[0..17] of byte=3D($3f,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F,$77,$7C,$39,$37,$30,$40,$54= ,$76); VAR StepCorrente:Byte; Tick_count : longint; absolute $20; TempValida : Byte; absolute $30; AppoDT:Byte; TmpLettaGradi:Integer; Segno:Byte; TkCnt:Byte; Tmp_Prec:Word; Tmp_Max:Word; Tmp_Min:Word; FUNCTION mask(num: byte):byte; // this function returns masks begin // for common cathode 7-seg. display { case num of 0 : result :=3D $3F; 1 : result :=3D $06; 2 : result :=3D $5B; 3 : result :=3D $4F; 4 : result :=3D $66; 5 : result :=3D $6D; 6 : result :=3D $7D; 7 : result :=3D $07; 8 : result :=3D $7F; 9 : result :=3D $6F; 65: result :=3D $77; //10=3DA 66: result :=3D $7C; //11=3DB 67: result :=3D $39; //12=3DC 77: result :=3D $37; //M //13 73: result :=3D $30; //I //14 45: result :=3D $40; //- //15 78: result :=3D $54; //n //16 88: result :=3D $76; //X //17 end; //case end}

result:=3DD7S[Num]; end; FUNCTION TastoFn:Byte; //pressione del tasto Function su PORT A bit 4, attivo alto per 1 ms; //VAR OK:Byte; Begin {Ok:=3D0; While Button(PORTA, 4, 1, 1) do Begin nop; Ok:=3D255; end;} Result:=3DButton(PORTA, 4, 75, 1) //Result:=3DOk; End; FUNCTION TastoRes:Byte; //pressione del tasto Reset su PORT A bit 5, attivo alto per 1 ms; //VAR OK:Byte; Begin { Ok:=3D0; While Button(PORTA, 5, 1, 1) do Begin nop; Ok:=3D255; end;} Result:=3DButton(PORTA, 5, 75, 1) End;

PROCEDURE AbilitaDisplay(Num:Byte); Begin //PortA.7:=3D1; //PortA.0:=3D1; //PortA.1:=3D1; PortA:=3DPortA OR $83; case num of

1: PortA.1:=3D0; 2: PortA.0:=3D0; 3: PortA.7:=3D0; end; end; Procedure Scrivi7Seg(Quale,Cosa:Byte); Begin PortB:=3D$00; PORTB:=3DMask(Cosa); AbilitaDisplay(Quale); {$IF_DEF DEBUG_MODE} {$ELSE} // delay_ms(1); {$END_IF} End; PROCEDURE Scrivi(D_1,D_2,D_3:Byte); Begin Scrivi7Seg(1,D_1); Scrivi7Seg(2,D_2); Scrivi7Seg(3,D_3); End; PROCEDURE WriteTempToEprom(Indirizzo:Byte; Tmp:Word); Begin Eeprom_Write(Indirizzo,integer((Tmp SHR 8)) AND $FF); Delay_ms(20); Eeprom_Write(Indirizzo+1,byte(Tmp AND $FF)) ; End; FUNCTION LeggiTempFromEprom(Indirizzo:Byte):Word; VAR B1,B2:Byte; OutT:Word; Begin OutT:=3D0; B1:=3DEEprom_Read(Indirizzo); Delay_ms(20); B2:=3DEEprom_Read(Indirizzo+1);

If (B1=3D$FF) AND (B2=3D$FF) then OutT:=3D0 Else Begin Outt:=3DB1; //OutT:=3DOutT*$100; OutT:=3DOutT SHL 8; OutT:=3DOutT+B2;

end; Result:=3DOutT; ENd; Procedure tmpWord_ToInt(TmpIn:Word; VAR OutT:Integer; VAR OutSegno:Byte); Var TmpLettaAppo:Integer; Begin OutSegno:=3D0; Outt:=3D0; TmpLettaAppo:=3D (TmpIn SHL 1) ; //TmpLettaAppo:=3D((TmpIn *2)-480); If TmpLettaAppo=3D255 then Begin If AppoTmp_Max then Begin Tmp_Max:=3DAppo; WriteTempToEprom(ZonaTmpMax,aPPo) ; End; End;

{ TmpLettaGradi:=3D((aPPo *2)-500); If TmpLettaGradi=3D112); Appo:=3D0; Repeat Appo:=3DAPpo+1; if (TastoFn=3D255) Then GoTo FineProc; if (TastoRes=3D255) Then GoTo FineProcReset; DisplayTemp(T,S);

Until (Appo>=3D220); Until False; FineProcReset: Nop; if CheAddr=3DZonaTmpMin Then Begin WriteTempToEprom(ZonaTmpMin,1500) ; Tmp_Min:=3D1500; end; if CheAddr=3DZonaTmpMax Then Begin WriteTempToEprom(ZonaTmpMax,0) ; Tmp_Max:=3D0; end; Appo:=3D0; Repeat Appo:=3DAPpo+1; //Scrivi7Seg(1,Ord('-')); Scrivi7Seg(1,15); Scrivi7Seg(2,15); Scrivi7Seg(3,15); Until (Appo>=3D4095); FineProc: Nop; //StepCorrente:=3D1;

end; begin OPTION_REG :=3D $80; OSCCON:=3D$70; //Internal 8Mhz clock Ansel:=3D$0C; //Input analogico da RA2/AN2 segnale, RA3 vref+ ADCon0:=3D$D0; //clock a/d rc osc , Ch RA2/AN2 ADCon1:=3D$A0; //right justified,RA3 vref+ TrisB:=3D0; //porta B =E8 output per display TrisA:=3D$3C; // Port A input tranne RA1/AN1 e Ra0/An0 e Ra7 e ra6(segno) AbilitaDisplay(4); PortA.6:=3D0; //segno Tick_count:=3D0; CCP1Con:=3D0; TempValida:=3D0; Segno:=3D0; TmpLettaGradi:=3D0; Tmp_Prec:=3DAdc_Read(2); Tmp_Min:=3DLeggitempFromEprom( ZonaTmpMin); If (Tmp_MIN=3D$FFFF) Then Tmp_Min:=3D$05DC;

Tmp_Max:=3DLeggitempFromEprom( ZonaTmpMax); If (Tmp_Max=3D$FFFF) Then Tmp_max:=3D$0; TkCnt:=3D128; TmpLettaGradi:=3D0; StepCorrente:=3D1; Repeat Tick_count:=3DTick_count+1; If StepCorrente=3D1 then begin { AppoDT:=3D0; If TempValida>=3D254 then Repeat TkCnt:=3D3; AppoDT:=3DAppoDT+1;

DisplayTemp(TmpLettaGradi,Segno); Until AppoDt>=3D32 Else } DisplayTemp(TmpLettaGradi,Segno); end; If StepCorrente=3D2 then DisplayMinMax(ZonaTmpMin); If StepCorrente=3D3 then DisplayMinMax(ZonaTmpMax);

If (TastoFn=3D255) Then If StepCorrente=3DMaxSteps THen StepCorrente:=3D1 Else StepCorrente:=3DStepCorrente+1; If Tick_Count=3DTkCnt then Begin DoLettura2; Tick_Count:=3D0; If TempValida

Reply to
merco
Loading thread data ...

Non so che range di temperatura ti interessa ma perche' complicarsi la vita con cosi tanti componenti, io per misurare temperature col pic utilizzo questo circuito :

+5v ! NTC !_____ RA ! R ! massa

Con una NTC da 10k e resistenza 10k e' abbastanza lineare tra 0 e 40 gradi con un errore di 0,5% Se la resistenza la metto da 4700 diventa lineare tra 20 e 60 ...

Reply to
Pippo Baldo

Per come funzionano gli ADC, =E8 normale la variazione +-1 sull'ultima cifra significativa. Ogni strumento con lettura digitale (anzich=E9 analogica a lancetta) presenta questa variazione oscillante sull'ultima cifra. Per esempio una temperatura di

37,26 gradi, letta con precisione del decimo di grado su uno strumento digitale, mostrer=E0 37,2 per un po' del tempo e 37,3 per un altro po' del tempo.

Non chiedermi di approfondire perch=E9 non so come funziona. Non so da che dipende la frequenza con la quale oscilla l'ultima cifra. Non so se il tempo di permanenza di una indicazione e dell'altra =E8 proporzionale alla distanza del valore vero dai due quantizzati indicati.

Se qualcuno sa approfondire questo argomento, interessa tanto anche me!

Reply to
sancono

Non ha importanza fare media di pi=F9 campioni. Il problema =E8 dovuto alla quantizzazione, ovvero al numero finito di valori diversi che ti restituisce una indicazione digitale di una grandezza analogica, e non =E8 possibile rimuoverlo. Letture digitali: ultima cifra balla. I condensatori puoi pure toglierli o ridurli di capacit=E0, poich=E9 la temperatura =E8 gi=E0 una grandezza che varia lentamente, se la si misura su un corpo che abbia un minimo di capacit=E0 termica. Poi dipende da quello che devi fare: se il sensore =E8 molto piccolo, misuri temperatura dell'aria, ci sono folate improvvise e vuoi eliminare in hardware il contributo di queste, allora ben vengano i condensatori. Ma non ti eliminano il problema dell'ultima cifra che balla in ogni rappresentazione digitale di una grandezza analogica.

Se per questioni puramente estetiche vuoi eliminare l'inconveniente, puoi fare come feci io per la lettura della posizione di uno slider (potenziometro) di comando in un mixer luci digitale che ho costruito. Ho avuto lo svantaggio di ridurre a un terzo la risoluzione ma ho ottenuto una lettura che non ballava pi=F9.

Tutto fatto in firmware: EXTRA LOOP

- prendi la misura digitale

- la memorizzi in una variabile LOOP

- prendi la misura digitale

- calcolo il delta con la misura memorizzata Se il delta =E8 =3D3 passi di quantizzazione, cambio la visualizzazione su schermo e aggiorno la misura memorizzata.

- Goto Loop

In realt=E0 ho implementato l'algoritmo, per il mio caso specifico, in maniera appena differente, per facilitarmi la vita. Anzich=E9 ridurre a 1/3, ho ridotto a 1/4 la risoluzione. Scartavo valori terminanti (in binario) con 00 o 11 come bit meno significativo, poich=E9 questi valori, ballando, finivano per modificarmi i bit pi=F9 alti. Accettavo come letture valide solo quelle terminanti in 01 o 10. Queste ballando si portavano a numeri terminanti nei quattro modi possibili: 00 01 10 11, ma i bit pi=F9 significativi a sinistra rimanevano tal quali per tutto il discorso.

Campionavo a 10 bit, usavo i due bit meno significativi per eliminare i balletti, e gli

8 bit pi=F9 significativi come lettura a 8 bit della grandezza (posizione dello slider). Non so se una soluzione del genere =E8 adatta al tuo scopo.

Es.: lettura 0000 0011 11 buttata via (come se non l'avessi fatta) perch=E9 minacciava di trasformarsi in

0000 0100 00 per un balletto, dandomi gli 8 bit pi=F9 significativi ballanti tra 0000 0011 e 0000 0100

lettura 0000 0011 10 accettata, perch=E9 in caso di balletto, pu=F2 trasformarsi in:

0000 0011 11 oppure 0000 0011 01 ma gli 8 bit pi=F9 significativi restano stabili a 0000 0011 senza ballare.

Ho ideato da me quest'algoritmo, non so se =E8 una pratica diffusa e che errori di misura introduce, a parte l'incremento di 4 volte del passo di quantizzazione contro la gradevolezza estetica di non far ballare l'ultima cifra.

Tutti gli strumenti digitali che ho visto hanno l'ultima cifra ballante: ne costruiscono e pubblicizzano alcuni senza, e come ottengono la perdita di balletto?

Reply to
sancono

ciao sei sicuro che con un NTC, che tipicamente ha un erorre del 5% o 10% e un andamento non lineare,ma quasi logaritmico riesci a fare delle misure di temp. con un errore dello 0.5%? ti posso garantire che per fare misure in quel range con un errore dello

0.5% ci vogliono ben altri sensori! emilio
--
emilio punto rapezzi chiocciola brasimone punto enea punto it
Reply to
emi

no ho un ntc e le temperature sono ambientali da -20 a +50

Reply to
merco

forse hai ragione, gle letture digitali ballano... ma xk=E8 il mio termostato casalingo non "balla" cos=EC di frequente ?

Reply to
merco

"merco" ha scritto

forse perche fa' una lettura al minuto.

Reply to
Pippo Baldo

"emi" ha scritto

Quello che dici te non e' l'errore ma la tolleranza del componente , poi la curva caratteristica e' sempre la solita quindi o fai una taratura nel soft o metti un trimmer.

certo ma se guardi la curva vedrai che esiste sempre una zona rettilinea

Per i progetti che mi interessavano misurare una temperatura dell'acqua di caldaia che invece di 60,0 mi segna 59,2 non mi cambia certo la vita. adesso mi dirai che l'errore non e' dello 0,5% ma del 1,3% va bene uguale .

Te puoi usare qualunque sensore e complicarti la vita con tutti i componenti che vuoi, a me va bene cosi'.

Reply to
Pippo Baldo

"emi" ha scritto nel messaggio news: snipped-for-privacy@brasimone.enea.it...

Le prendi da Lidl le NTC??? :-)

J.

Reply to
Regae

"merco" ha scritto nel messaggio news: snipped-for-privacy@g44g2000cwa.googlegroups.com...

Integra le letture o/e fai la media tra più letture.

J.

Reply to
Regae

Il giorno 26 Jan 2006 13:33:39 -0800, "merco" ha scritto:

Guarda caso anch'io sto facendo un po' di prove con i pic e le sonde di temperatura (tmp01, lm35 e simili). Faccio eseguire una lettura di temperatura ogni 250 ms, calcolando però la media su 16 letture, quindi complessivamente ho una lettura ogni 4 s.

Vista la risoluzione dell'A/D e delle sonde ho rinunciato a visualizzare i decimi di grado, che comunque per misurare la temperatura ambiente a mio avviso sono inutili.

Reply to
Luigi C.

[...]

domanda fuori tema....perché usare uno step-up per andare da 3 a 5 per poi tornare giù a 3.3? Mi sembra che tutto nello schema possa andare anche senza lo swtiching (rumore per nulla!). O forse hai altro che va a 5V che non c'è nello schema?

Ste

--
Feynman sarebbe riuscito a spiegare la meccanica quantistica a una
gallina, ma non sarebbe stato superficiale. [cit. Boiler, 21.01.2006]
Reply to
PeSte

perche quelle commerciali, ovvero quelle che trovi nei negozi tu che tolleranza hanno?

--
emilio punto rapezzi chiocciola brasimone punto enea punto it
Reply to
emi

guarda che se ai una ntc che ha una tolleranza del 5% e non fai nessuna taratura preventiva, l'errore che commetti è da considerarsi del 5%.

in una curva parabolica, o non, non esite nessuna zona significatamente rettilinea.esiste una zona ove la curva è meno accentuata

allora perchè ai detto che fai la lettura con un errore dello 0.5%?

no ,si tratta solamente di dire le cose che si sanno, altrimenti non tirare ad indovinare. ciao,emilio

--
emilio punto rapezzi chiocciola brasimone punto enea punto it
Reply to
emi

x peste : hai ragione, in effetti non ho altro che va a 5. La mia idea iniziale era per=F2 di usare 1 singola pila ricaricabile da

2500mAh (AA Energizer... tanto per la pubblicit=E0) Ma non riuscivo a garantire almeno 2.7V al sensore tmp36 a causa dello scaricarsi della pila. Quindi ho messo sucessivamente 2 pile sperando di ottenere una stabilit=E0 maggiore, ma mi sa che non ho concluso niente comunque. Il problema =E8 che 3 display a 7 segmenti , pur multiplexati, consumano .=2E. Voi come fate ? Non dico di farlii brillare, ma almeno che si vedano di giorno...
Reply to
merco

ieri sono andato un po' alla veloce...in realtà credo che non tutti i pic vadano a bassa tensione...alcuni modelli vanno solo a 5V...dipende da quello che hai tu...

[...]

multiplex di un display e consumo sono mele e pere...il multiplex fa risparmiare linee hardware, ma se vuoi la resa luminosa devi mandare correnti alte impulsate...quindi consumi

già presa in considerazione la soluzione ldc? quella si vede anche con il sole addosso

Ste

--
Feynman sarebbe riuscito a spiegare la meccanica quantistica a una
gallina, ma non sarebbe stato superficiale. [cit. Boiler, 21.01.2006]
Reply to
PeSte

beh, ti dico con tuo rammarico che ho quelli nanoWatt tecnology a bassa tensione..

Un LCD? volevo qualcosa di non troppo ingombrante...

Reply to
merco

"merco" ha scritto nel messaggio news: snipped-for-privacy@g43g2000cwa.googlegroups.com...

la tecnologi a nanoWatt penso sia riferita più ai consumi in sleep che altro. Comunque la differenza a cui accennavo è relativa al range del dispositivo. Ne ho uno sotto mano che nell'industrial va da 2V a 5.5V, nell'extended va da 4V a 5.5V. Tutto qua, niente rammarico...al limite brina il tuo micro, non il mio ;-)

non ho esperienza in merito, ma credo che nell'LCD classico ce ne siano per tutti i gusti....

Ste

--
Feynman sarebbe riuscito a spiegare la meccanica quantistica a una
gallina, ma non sarebbe stato superficiale. [cit. Boiler, 21.01.2006]
Reply to
PeSte

Wide operating voltage range: 2.0V to 5.5V quindi penso di poterlo alimentare (a discapito della velocit=E0) tra 2 e 5.

.=2E. tanto di questi tempi brina tutto, col freddo che fa !

Reply to
merco

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.