Pic Micro, Arduino, Atmel, Microchip, Freescale, Texas Instrument, ecc. Strumenti di sviluppo, firmware e progetti.
#3958
ciao voglio realizzare unTERMOMETRO CON PIC 16F877A, SENSORE TEMPERATURA LM35 E DISPLAY 16x2.
Il progetto ha un messaggio iniziale con shift verso destra.
Funziona su un range di temperatura da 0 - 100 °C con step di temperatura ogni 0.5°C.
Dopo i 100°C viene visualizzato un messaggio lampeggiante Tc>100°C.

ORA VORREI AGGIUNGERE ANCHE LE TEMPERATURE NEGATIVE...MA NON RIESCO!!! HELP!

GRAZIE

Immagine.png


Codice: Seleziona tutto;TERMOMETRO CON PIC16F877A, SENSORE LM35, DISPLAY 16x2
;RANGE DA 0 - 100 °C, STEP TEMPERATURA DI 0.5°C CON MISURAZIONE OGNI 5 MINUTI


            PROCESSOR   16F877A
            RADIX       DEC
            INCLUDE     "P16F877A.inc"
;------------------------------------------------------------------
   org      32
   cblock 0x20
   count1
   count2
   count3
   count4   
   sample
   shift
   DATOH
   DATOL
   POINT
   POINT0
   endc

;---------------------------------CONTROLLO COMANDI LCD---------------------------------
#define      RS      PORTC,2
#define      E      PORTC,1
 
portlcd      equ      PORTD
CLEAN       equ    b'00000001'       ;CLEAR DISPLAY
SELECT_ROW1 equ    b'10000000'       ;SELECT ROW 1
SELECT_ROW2 equ    b'11000000'       ;SELECT ROW 2
shiftdl    equ    b'00011100'       ;MOVE DISPLAY TO LEFT
shiftdr    equ    b'00011000'       ;MOVE DISPLAY TO RIGHT
shiftcl    equ    b'00010100'       ;MOVE CURSOR TO LEFT
shiftcr    equ    b'00010000'       ;MOVE CURSOR TO RIGHT
 
   org    0x00                   ;VETTORE RESET
   GOTO   INIT
   org    0x04                   ;VETTORE INTERRUPT

INIT
   bsf    STATUS,RP0             
   clrf    TRISD                   ;PORTD OUT
   bcf    TRISC,1                ;PORTC,1 OUT (E)
   bcf    TRISC,2                ;PORTC,2 OUT (RS)
   bcf    STATUS,RP0             
   clrf    PORTD                   ;AZZERO PORTD
   clrf    PORTC                   ;AZZERO PORTC
   call    INIT_CONFIG_ADC             
   call    INIT_LCD             

;---------------------------------SCRIVI TESTO INIZIALE + MOVIMENTO E TEMPERATURA---------------------------------
;SCRIVI TESTO INIZIALE
START
   CLRF   POINT
   call    MESS                   ;CALL START MESSAGE
   movlw    .11                     ;NUMBER LETTER TO MOVE (SHIFT)
   movwf    shift                   ;COPY NUMBER ROW TO "SHIFT"
   
;MOVIMENTO   
ROTATE
   call    DELAY
   movlw    shiftdr                ;COMMAND ROTAZIONE
   call    cmd
   decfsz    shift,F
   goto    ROTATE

   movlw    CLEAN                   ;COMMAND CLEAN DISPLAY
   call    cmd
   GOTO   OPERA0                  ;SALTA IL DELAY5MIN E MISURA SUBITO LA TEMPERATURA
   
;SCRIVI GRADI MISURATI
OPERA
   call   DELAY_5MIN               ;DELAY5MIN - TEMPO DI OGNI MISURAZIONE
OPERA0
   movlw    SELECT_ROW1             ;SCRIVI SU 1 RIGA
   call    cmd                
   call    ACQUISIZIONE_ADC         ;CALL ACQUISIZIONE DATO DALL ADC
;SCRIVI TESTO TEMPERATURA
   movlw    "T"
   call    dato
   movlw    "e"
   call    dato
   movlw    "m"
   call    dato
   movlw    "p"
   call    dato
   movlw    "e"
   call    dato
   movlw    "r"
   call    dato
   movlw    "a"
   call    dato
   movlw    "t"
   call    dato
   movlw    "u"
   call    dato
   movlw    "r"
   call    dato
   movlw    "a"
   call    dato
   movlw    ":"
   call    dato
   
   movlw    SELECT_ROW2             ;scrivi su 2 riga
   call    cmd
   
   CALL   CONVERS                  ;SCRIVI NUMERO GRADO
   
OPERA1
;SCRIVI PUNTO " . "   
   movlw    '.'                   ;SCRIVI PUNTO
   call    dato

;SCRIVI DECIMI
   BTFSS    ADRESH,0               ;SE IL BIT O DEL REGISTRO ADRESH (NUMERO BINARIO DELLA CONVERSIONE DI T) VALE:
   goto    SCRIVI_ZERO             ;VALE 1 SCRIVI 0 ALTRIMENTI SKIP
   MOVLW   '5'                     ;SCRIVI 5 DECIMI
   CALL   dato
   GOTO   OPERA2
SCRIVI_ZERO
   MOVLW   '0'                     ;SCRIVI 0 DECIMI
   CALL   dato
   
OPERA2   
;SCRVI SIMBOLO " °C "

   movlw    B'11011111'             ;SIMBOLO DEL GRADO " ° "
   call    dato
   movlw    'C'                     ;" C " DI GRADI CELSIUS
   call    dato
   goto    OPERA    

;---------------------------------CONVERTITORE DA NUMERO BINARIO A NUMERO DECIMALE---------------------------------
CONVERS                           ;CONVERTE NUMERO DA BINARIO A DECIMALE

   MOVF   ADRESH,W               ;MUOVI CODICE BINARIO(CONVERSIONE) IN W
   MOVWF   POINT                  ;MUOVI W IN POINT
INCRE
   INCF   POINT,F                  ;INCREMENTA POINT FINO AD ARRIVARE ALLA DECINA INTERESSATA PER CAPIRE CHE TEMPERATURA MISURA
                              ;ES. (POINT= 8°C)-CONTINUA AD INCREMENTARE FIN QUANDO NON ARRIVA A 10-PER POI ANDARE ALLA SUBROUTINE DEL 10
;0-9
   MOVLW   20                     ;W=20 (20 PERCHE' CALCOLANDO ANCHE I DECIMALI DI 0.5  (0°C = 0 , 10°C = 20)
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   ZERO                  ;0-9
;10-19
   MOVLW   40                        ;W=40
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   TEN                     ;10-19
;20-29
   MOVLW   60                     ;W=60
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   TWENTY                  ;20-29
;30-39
   MOVLW   80                     ;W=80
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   THIRTY                  ;30-39
;40-49
   MOVLW   100                     ;W=100
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   FOURTY                  ;40-49
;50-59
   MOVLW   120                     ;W=120
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   FIFTY                  ;50-59
;60-69
   MOVLW   140                     ;W=140
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   SIXTY                  ;60-69
;70-79
   MOVLW   160                     ;W=160
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   SEVENTY                  ;70-79
;80-89
   MOVLW   180                     ;W=180
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   EIGHTY                  ;80-89
;90-99   
   MOVLW   200                     ;W=200
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   NINETY                  ;90-99
;T>100   
   MOVLW   250                     ;W=220
   XORWF   POINT,W                  ;compara VALORED con W
   BTFSC   STATUS,Z               ;se diverso skip
   GOTO   ONE_HUNDRED               ;T>100   

   GOTO   INCRE

;SCRIVI "Tc>100 °C" E LAMPEGGIA   
ONE_HUNDRED
   
   MOVLW   'T'
   CALL   dato
   MOVLW   'c'
   CALL   dato
   MOVLW   '>'
   CALL   dato
   MOVLW   '1'
   CALL   dato
   MOVLW   '0'
   CALL   dato
   MOVLW   '0'
   CALL   dato
   
   movlw    B'11011111'             ;SIMBOLO DEL GRADO " ° "
   call   dato
   movlw   'C'                   ;" C " DI GRADI CELSIUS
   call   dato

   CALL   DELAY1S
   CALL   CLEAN_ROW
   GOTO   OPERA
;------------------------------------------------------------------   
ZERO
;DEC
   MOVLW   '0'                     ;SCRIVI DECINA " 0 "
   CALL   dato
;UNITA   
   MOVF   ADRESH,W               ;COPIA CONVERSIONE BINARIA IN W
   SUBLW   20                     ;20-W
   BTFSC   STATUS,Z               ;SE ZERO VAI A OPERA ALTRIMENTI SKIP
   GOTO   OPERA                  ;RICALCOLA
   CALL   TAB                     ;SCRIVI UNITA
   CALL   dato
   GOTO   OPERA1                  ;PROCEDI
   
TEN   
;DEC   
   MOVLW   '1'
   CALL   dato
;UNI
   MOVF   ADRESH,W
   SUBLW   40
   BTFSC   STATUS,Z
   GOTO   OPERA
   CALL   TAB
   CALL   dato
   GOTO   OPERA1   
   
TWENTY
;DEC   
   MOVLW   '2'
   CALL   dato
;UNI
   MOVF   ADRESH,W
   SUBLW   60
   BTFSC   STATUS,Z
   GOTO   OPERA
   CALL   TAB
   CALL   dato
   GOTO   OPERA1
   
THIRTY
;DEC   
   MOVLW   '3'
   CALL   dato
;UNI
   MOVF   ADRESH,W
   SUBLW   80
   BTFSC   STATUS,Z
   GOTO   OPERA
   CALL   TAB
   CALL   dato
   GOTO    OPERA1
   
FOURTY   
;DEC   
   MOVLW   '4'
   CALL   dato
;UNI
   MOVF   ADRESH,W
   SUBLW   100
   BTFSC   STATUS,Z
   GOTO   OPERA
   CALL   TAB
   CALL   dato
   GOTO   OPERA1   
   
FIFTY
;DEC   
   MOVLW   '5'
   CALL   dato
;UNI
   MOVF   ADRESH,W
   SUBLW   120
   BTFSC   STATUS,Z
   GOTO   OPERA
   CALL   TAB
   CALL   dato
   GOTO   OPERA1
   
SIXTY
;DEC   
   MOVLW   '6'
   CALL   dato
;UNI
   MOVF   ADRESH,W
   SUBLW   140
   BTFSC   STATUS,Z
   GOTO   OPERA
   CALL   TAB
   CALL   dato
   GOTO   OPERA1

SEVENTY   
;DEC   
   MOVLW   '7'
   CALL   dato
;UNI
   MOVF   ADRESH,W
   SUBLW   160
   BTFSC   STATUS,Z
   GOTO   OPERA
   CALL   TAB
   CALL   dato
   GOTO   OPERA1   
   
EIGHTY
;DEC   
   MOVLW   '8'
   CALL   dato
;UNI
   MOVF   ADRESH,W
   SUBLW   180
   BTFSC   STATUS,Z
   GOTO   OPERA
   CALL   TAB
   CALL   dato
   GOTO   OPERA1
   
NINETY
;DEC   
   MOVLW   '9'
   CALL   dato
;UNI
   MOVF   ADRESH,W
   SUBLW   200
   BTFSC   STATUS,Z
   GOTO   OPERA
   CALL   TAB
   CALL   dato
   GOTO   OPERA1

   
TAB                            ;TAB UNITA
   addwf    PCL,F
   retlw   '9'                     ;9.5
   retlw    '9'
   retlw    '9'
   retlw    '8'
   retlw    '8'
   retlw    '7'
   retlw    '7'
   retlw    '6'
   retlw    '6'
   retlw    '5'
   retlw    '5'
   retlw    '4'
   retlw    '4'   
   retlw    '3'
   retlw    '3'
   retlw    '2'
   retlw    '2'
   retlw    '1'
   retlw    '1'
   retlw    '0'
   retlw    '0'

;------------------------------------------------------------------
CLEAN_ROW                        ;CLEAN ROW 2
   movlw    SELECT_ROW2
   call    cmd
   movlw    " "
   call    dato
   movlw    " "
   call    dato
   movlw    " "
   call    dato
   movlw    " "
   call    dato
   movlw    " "
   call    dato
   movlw    " "
   call    dato
   movlw    " "
   call    dato
   movlw    " "
   call    dato
   movlw    " "
   call    dato
   movlw    " "
   call    dato
   movlw    " "
   call    dato
   movlw    " "
   call    dato
   movlw    " "
   call    dato
   movlw    " "
   call    dato
   movlw    " "
   call    dato
   movlw    " "
   call    dato
   return
   
;---------------------------------CONFIGURAZIONE ADC---------------------------------
INIT_CONFIG_ADC:
   bsf    STATUS,RP0
   bsf    TRISA,0                ;SETTA POTRA,0 IN
   bcf    STATUS,RP0
   movlw    b'11000001'             ;FRC, AN0, GO/DONE=0, ADON=1
   movwf    ADCON0
   banksel   ADCON1                  ;SELEZIONA BANCO
   movlw   b'00001000'               ;LEFT JUSTIFIED, FRC, ALL ANALOGIC (PORTA) AND VREF- VREF+
   movwf   ADCON1
   banksel   ADCON0                  ;SELEZIONA BANCO
   return
   
;---------------------------------ACQUISIZIONE DELL' ADC---------------------------------
ACQUISIZIONE_ADC
   call    SAMPLETIME                ;RITARDO DEI ACQUISIZIONE
   bsf    ADCON0,GO_DONE             ;INIZIA CONVERSIONE
   btfsc    ADCON0,GO_DONE            ;TERMIN CONVERSIONE E CONTROLLA L'ESITO
   goto    $-1                   ;NON ANCORA TERMINATA....QUINDI RICONTROLLA
   banksel   ADRESH                   ;TERMINATA E CONTINUA
   movf    ADRESH,W                ;MUOVI I BIT PIU SIGNIFICATIVI IN W
   movwf    DATOH                   ;DATOH = W
   banksel   ADRESL
   movf    ADRESL,W                ;MUOVI I BIT MENO SIGNIFICATIVI IN W
   movwf    DATOL                   ;DATOL = W
   banksel   PORTB                   ;CAMBIO BANCO
   bcf    STATUS,C                ;SELEZIONA REGISTRO
   rrf    DATOH,F                ;RUOTA VERSO DESTRA I BIT DI DATOH E DATOL DEL REGISTRO F PASSANDO ...
   rrf    DATOL,F                ; ... PER IL CARRY ED ELIMINANDO IL BIT MENO SIGNIFICATIVO
   return    
   
;---------------------------------SETTAGGIO COMANDI LCD (RS=0)---------------------------------
INIT_LCD
   movlw    b'00110000'             
   call    cmd
   movlw    b'00110000'             
   call    cmd    
   movlw    b'00110000'             
   call    cmd
   movlw    b'00111100'             
   call    cmd
   movlw    b'00001000'               
   call    cmd
   movlw    b'00000001'               
   call    cmd    
   movlw    b'00000110'             
   call    cmd
   movlw    b'00001100'               
   call    cmd
   movlw    b'00000010'
   call    cmd
   return
;---------------------------------INVIA CARATTERI A DISPLAY (E, RS)---------------------------------
dato
   movwf    portlcd
   bsf    RS
   nop
   nop
   nop
   bsf    E
   call    DELAY_5
   bcf    E
   return
   
cmd
   movwf    portlcd
   bcf    RS
   nop
   nop
   nop
   bsf    E
   call    DELAY_5
   bcf    E
   return

;---------------------------------MESSAGGIO INIZIALE---------------------------------
MESS
   movlw    "T"
   call    dato
   movlw    "E"
   call    dato
   movlw    "R"
   call    dato
   movlw    "M"
   call    dato
   movlw    "O"
   call    dato
   movlw    "M"
   call    dato
   movlw    "E"
   call    dato
   movlw    "T"
   call    dato
   movlw    "R"
   call    dato
   movlw    "O"
   call    dato
   
   movlw    SELECT_ROW2
   call    cmd
   
   movlw    "I"
   call    dato
   movlw    "L"
   call    dato
   movlw    "A"
   call    dato
   movlw    " "
   call    dato
   movlw    " "
   call    dato
   movlw    "&"
   call    dato
   movlw    " "
   call    dato
   movlw    " "
   call    dato
   movlw    "I"
   call    dato
   movlw    "L"
   call    dato
   movlw    "O"
   call    dato
   return
   
;---------------------------------RITARDI---------------------------------
SAMPLETIME
   movlw    .225    
   movwf    sample
SAMPLETIME1
   nop
   nop
   decfsz    sample,F
   goto    SAMPLETIME1
   return
;------------------------------------------------------------------
DELAY_5                         ;DELAY 5ms
   movlw    d'1'
   movwf    count3
DEL25A
   movlw    d'100'
   movwf    count2
DEL15A
   movlw    d'166'
   movwf    count1
DEL5A
   decfsz    count1,F    
   goto    DEL5A
   decfsz    count2,F
   goto    DEL15A
   decfsz    count3,F
   goto    DEL25A
   return
;------------------------------------------------------------------
DELAY
   movlw    d'3'
   movwf    count3
DEL25B
   movlw    d'200'
   movwf    count2
DEL15B
   movlw    d'166'
   movwf    count1
DEL5B
   decfsz    count1,F
   goto    DEL5B
   decfsz    count2,F
   goto    DEL15B
   decfsz    count3,F
   goto    DEL25B
   return
;------------------------------------------------------------------
DELAY1S                           ;delay 1 secondo
   movlw   d'7'
   movwf   count1
   movlw   d'47'
   movwf   count2
   movlw   d'3'
   movwf   count3
del_1s
   decfsz   count1,F
   goto    $+2
   decfsz    count2,F
   goto    $+2
   decfsz    count3,F
   goto    del_1s
   goto    $+1
   goto    $+1
   goto    $+1
   return
;------------------------------------------------------------------   
DELAY_5MIN
   movlw   0x54
   movwf   count1
   movlw   0xA1
   movwf   count2
   movlw   0xFD
   movwf   count3
   movlw   0x02
   movwf   count4
Delay_0
   decfsz   count1, f
   goto   $+2
   decfsz   count2, f
   goto   $+2
   decfsz   count3, f
   goto   $+2
   decfsz   count4, f
   goto   Delay_0
   goto   $+1
   goto   $+1
   nop
   return


   END
#3959
Hai postato nella sezione sbagliata. Sposto il topic ma sei pregato di spendere due parole e salutare gli utenti.

Saluti.
#3960
Come si può vedere bene dal foglio dati, per avere letture di temperature sotto lo 0 occorre una tensione negativa (foglio dati http://www.ti.com/lit/ds/symlink/lm35.pdf pagina iniziale)
In alternativa si può usare un ADC con ingresso differenziale (figura 18)
oppure un condizionamento con un paio di opamp.

In ogni caso va aggiunta qualcosa e il vantaggio del costo limitato del LM35 va perso.

Molto meglio usare altri sensori, come MCP9700/9701 di Microchip.
#3975
Visto che già usi un PIC che fa i conti prova ad usare un LM34 invece dell'LM35 http://www.ti.com/lit/ds/symlink/lm34.pdf
Lo LM34 è calibrato in gradi Fahrenheit e lavora da 0°F a circa 300°F che corrispondono a -17.7 °C e 149°C.
La conversione fra °F e °C è F = ((C-32) x 10 )/ 18) così usi solo variabili intere, usa i gradi moltiplicati per dieci (così ci metti il decimale) e verifica i troncamenti!
Se il range di temperatura (-17°C) è sufficiente tieni presente che costo, precisione ed uscita (10mv/°) sono gli stessi fra LM34 ed LM35.
#3976
Perchè insistere ad usare componenti vecchiotti?

LM34 costa 2.46+ IVA da Mouser; 3.90 ivato su eBay.
MCP9700 costa 0.245 +IVA da Mouser e 1.20 su eBay.

MCP9700 rende 10mV/°C con un uscita di 500mV a 0°C, il che consente la lettura diretta fino a -50°C.

Non mi pare ci sia dubbio nella scelta (a meno che uno abbia in casa LM34 e voglia provare quello).
#3978
mars ha scritto:[CUT] Perchè insistere ad usare componenti vecchiotti? [CUT] MCP9700 rende 10mV/°C con un uscita di 500mV a 0°C, il che consente la lettura diretta fino a -50°C [CUT]


Vero, tuttavia non sempre il nuovo è migliore del vecchio. MPC9700 in TO92 ha una accuratezza di +/- 4°C (!)mentre MPC9700A in smd scende a +/- 2°C.
http://ww1.microchip.com/downloads/en/D ... 21942e.pdf
Per misure realistiche serve una calibrazione su due punti per ogni singolo pezzo con memorizzazione della correzione su EPROM. L'accuratezza di LM35 e LM34 è invece di +/1°C o +/- 2°F , il doppio migliore e spesso sufficiente ad usi amatoriali: dovrebbe bastare una calibrazione a punto singolo.

Volendo usare un componente più recente e più accurato degli LM34-35 tanto vale usare un LMT70 che ha una accuratezza di +/- 0.5°C , lavora fra -55°C e +150°C con una uscita di -5.19 mv/°C (l'uscita è NTC e non PTC) ed un offset a 0°C di 1.098 mV. E' un smd di 1x1 mm e dovrebbe costare un paio di euro al pezzo.
http://www.ti.com/lit/ds/symlink/lmt70a.pdf
#3980
Però, se osservi i fogli dati di LM35, fig 15, vedi che, come ogni altro componente lowcost, c'è una dispersione di parametri. Ovvero, c'è sempre da effettuare una correzione se si vuole approssimare l'uscita ideale.
Peraltro, la stessa Microchip offre un interessante esempio di procedura per ottenere la massima precisione da MCP9700 (AN1001).

Ma in ogni caso si deve essere onesti nel dire che una "uscita ideale" non è possibile ottenerla comunque da un ADC
integrato che usi la Vdd come riferimento.


Occorre una alimentazione a basso rumore e un riferimento esterno, altrimenti le ultime cifre del risultato a 10bit non hanno senso. E con esse se ne va la precisione "ideale".

Tanto peggio se si usano solo gli 8 bit di ADRESH. In una applicazione a basso livello come quella in oggetto, una precisione di un paio di gradi è già una buona approssimazione.

In applicazioni professionali le misure di temperatura in cui è richiesta precisione si fanno con altri sensori ed altri metodi.
La misura della temperatura ad alta precisione non è uno scherzo.

Piuttosto, una soluzione possibile e consigliabile, se si vuole avere precisione senza troppi impegni hardware e software è quella di usare
sensori con uscita digitale, che evitano il problema della conversione AD. Ce ne sono un mare, da MCP9800 a DS18B20, TC72/74, STS30/31, TMP100, ecc. Che, comunque, per rendere il massimo possono necessitare di una calibrazione sul range di misura.

In relazione allo schema e al sorgente, però, c'è da dire che non è stato mai realizzato praticamente, ma solo simulato in uno di quegli orridi e inutili simulatori che tanto danno fanno ai principianti, dato che non insegnano proprio niente.

Solo ad uno sguardo rapido abbiamo:
- la resistenza da 1M in serie all'ingresso analogico, che non ha alcuna funzione. Serve solo a richiedere un tempo di acquisizione spropositato, aumentando l'impedenza della sorgente. Questo l'inutile simulatore non lo dice...
- MCLR che è pull up con 10k e va a massa col pulsante con altri 10k, in modo che a pulsante chiuso si trovi nella condizione "ideale"
di 1/2Vdd . Resetta forse per gratia dei...
- l'assegnazione della Vref esterna al modulo ADC per poi collegare la Vref- alla Vss con un collegamento esterno, sicuramente meno valido di quello interno, che è possibile programmare
- e la Vref+ che non è realizzata con un riferimento di tensione che assicuri una precisone nel risultato, ma dipende da un partitore della Vdd e quindi assume non solo la sua non-precisione, ma anche quella delle resistenze del partitore.
- non ho approfondito il sorgente, ma c'è da capire il senso delle istruzioni finali della ACQUISIZIONE_ADC che riducono ulteriormente i bit di risultato della conversione.

Quindi, in conclusione, ripeto quanto ho detto prima: volendo procedere con sensori analogici, MCP9700 è il consiglio hobbistico, dato che la sua uscita tra l'altro non richiede calcoli particolari per essere trasformata in temperatura, come invece è richiesto da altri sensori.

Poi, ognuno è libero di fare quello che vuole. Dipende da cosa vuole ottenere.
#3982
mars ha scritto: [CUT] La misura della temperatura ad alta precisione non è uno scherzo. [CUT]

Condivido pressochè tutto quello che hai detto nel post, soprattutto l'uso di tensioni come capita per il riferimento dlel'ADC: non è un caso che molti sensori analogici siano ratiometrici fornendo in uscita un valore non assoluto ma in percentuale della tensione di alimentazione del sensore (e si spera del riferimento dell ADC). Come hai evidenziato, l'uso di sensori digitali , quando sia possibile, elimina del tutto il problema.

Le mie considerazioni volevano evidenziare la necessità di valutare tutte le caratteristiche di un sensore: linearità, accuratezza, ageing, necessità di calibrazione, sensibilità all'alimentazione, ecc per trovare un equo compromesso nell'ambito richiesto, amatoriale o professionale che sia.

Temo che ora Ilario abbia più dubbi di prima, il che certamente è più un bene che un male!
Dimmer su aspirazione

Ciao a tutti ho una ventola di aspirazione in came[…]

Visita il nostro canale telegram