Indice |
Sommario
Costruiamo un termometro come scusa per parlare degli accorgimenti (EMC ma non solo) che mi piace seguire progettando qualcosa.
Tempo fa, ThEnGi chiedeva qui come approcciamo il tema della compatibilità elettromagnetica in circuiti hobbystici. Avevo risposto che prendevo le stesse precauzioni che prendo sul lavoro. La risposta era piaciuta.
Poi, qualche mese fa le batterie del termometro/igrometro che ho in casa si sono scaricate. Avendo comprato in un mercatino dell'usato un piccolo strumento con scala analogica in gradi (semplicemente perché lo trovavo esteticamente bello), ho deciso che invece di sostituire le batterie era giunto il momento di sostituire l'elettronica dell'acquisto compulsivo per trasformarlo in un termometro ambientale.
Ho deciso di documentare il processo decisionale che ho seguito per svilupparlo e produrlo. Il tema va oltre alle sole considerazioni di EMC.
Questo termometro è quindi una scusa. Una scusa per illustrare quello che mi passa per la testa quando sviluppo elettronica e quello che mi passa per la testa quando inveisco contro certi approcci faciloni e contro tanti prodotti cinesi.
Gli obbiettivi da raggiungere
Voglio:
- che il termometro indichi la temperatura ambiente del locale in cui si trova
- che possa essere alimentato via USB e non consumi troppo
- che abbia una durata di vita che ecceda la mia, in modo da non dovermi occupare di sostituirlo
- che sia preciso
- che non generi disturbi elettromagnetici e che non si lasci disturbare facilmente
Vediamo di analizzare questi obbiettivi (in linguaggio progettuale requirements) e ricavarne una strategia da seguire (specifications). Ce ne sono un paio sui quali vorrei spendere un paio di parole per spiegare la strada scelta. Il resto verrà commentato piú sotto.
Durata di vita
Il circuito non verrà sottoposto a condizioni ambientali gravose (temperature, vibrazioni, transienti di tensione...) quindi la longevità è un obbiettivo abbastanza facilmente raggiungibile. Decido di non usare né microcontroller (la memory retention è limitante) né condensatori elettrolitici (si seccano).
Precisione
La temperatura ambiente in un locale ha facilmente differenze di diversi gradi. Cercare la precisione estrema non ha senso. Però quello che indica deve essere corretto. Come si vede, lo strumento ha una divisione di mezzo grado. Diciamo che voglio una precisione che sia mezza divisione, quindi l'obbiettivo è di stare entro 0.25° C da quella che è la reale temperatura del sensore. Il sensore che ho a disposizione è un Pt1000 in classe 1/10, quindi con un errore massimo di 0.04° C a temperatura ambiente. Andatevi a vedere quanto costa uno di questi sensori e vedrete subito come la voglia di precisione vi passa. Vediamo il resto del circuito come un esercizio di stile e cerchiamo di ottenere il miglior risultato possibile.
Il circuito
Nei prossimi paragrafi vi illustro come ho realizzato il circuito, suddividendolo in blocchi funzionali. Gli schemi sono realizzati nell' ECAD che ho usato per sviluppare il PCB. Ci sono due principali motivi per questa scelta: il modo in cui un circuito è disegnato, la leggibilità dello stesso ha per me un'importanza quasi paragonabile alla correttezza circuitale. E qui se ne vedono di tutti i colori. Penso di fare schemi molto leggibili e ci tengo. Poi ovviamente è anche una questione di gusto personale. Il secondo motivo è che convertirlo in FidoCad mi prenderebbe comunque un po' di tempo. Se a qualcuno dovesse servire, chiedetelo nei commenti: lo disegno e lo metto a disposizione. Gli screenshot dello schema sono ad alta risoluzione, cliccate sulle immagini per vederle interamente.
Il cuore del circuito
La parte probabilmente piú importante è la linearizzazione del Pt1000 che sembra esserlo, ma se ci prefiggiamo un obbiettivo di precisione tale non lo è! Il circuito è preso da un'application note di TI che potete leggervi qui. I componenti passivi sono stati adattati per coprire l'intervallo di temperature che serve a me.
Un paio di commenti veloci prima di entrare nei dettagli:
- L'alimentazione per l'opamp c'è, è un po' piú sotto. È collegato tra 3.3V e GND. C'è anche un condensatore di bypass da 100n.
- Il Pt1000 è saldato ad un filo che è poi collegato al PCB via J102.
- 1V024 e 2V048 sono tensioni di riferimento il cui drift entra direttamente nel calcolo dell'errore, devono quindi essere precise.
La scelta dell'opamp è sempre un tema interessante. Le fonti di errore qui sono la corrente di bias (che scorre in parte attraverso il Pt1000) e la tensione di offset. La banda è completamente irrilevante e il rumore non ci disturba piú di tanto. La scelta doveva quindi cadere su un chopper con elevata impedenza d'ingresso. E questo non è sempre facile perché un amplificatore di tipo chopper tende a fare charge injection sul suo ingresso. Questo ha posto un limite all'impedenza di sorgente. Vedrete infatti che le resistenze scelte sono relativamente basse.
Benvenuti nel magico mondo dei compromessi: aumento la corrente migliorando la situazione da un punto di vista della precisione, ma peggioro il consumo del circuito. E poi, benché sono piú preciso, con piú corrente aumento l'auto-riscaldamento del sensore. Domande e domande, qual è la risposta giusta? Non c'è. Dipende dalle priorità, dai limiti che si hanno eccetera.
L'OPA387 offre un'eccellente precisione DC (corrente di bias e offset) su tutto il range di temperatura che mi serve ad un prezzo onestissimo. Uno dei pensieri di cui parlavo è il seguente. Ed è un pensiero che spesso mi passa per la testa leggendo qui o anche altrove: sì, l'OPA387 costa venti (!) volte piú di un LM328. Ma stiamo parlando di 1.80 $ e me ne serve uno solo. Questi 1.60 $ che risparmio mi cambiano davvero la vita? Eppure nel mondo hobbystico si usa solo l'LM328 (magari comprato su AliExpress, così invece di avere 3 mV di offset ne ha 20).
I resistori per le reti di feedback sono multipli per poter ottenere i valori strambi che mi servono usando solo la serie E24. Su DigiKey avrei probabilmente trovato anche i resistori di valore strambo. Limitandomi alla serie E24, però, posso scegliere resistori di precisione con basso drift termico (ovviamente il Pt1000 deve variare con la temperatura, tutto il reso assolutamente no!).
Senza pensarci troppo si potrebbe pensare che la strategia migliore sia l'acquisto di ogni resistore con il minor coefficiente termico possibile. Invece è meglio comprarli tutti con lo stesso coefficiente, in modo da realizzare (a meno dell'inevitabile varianza dello stesso) un effetto raziometrico: i due rami del partitore resistivo driftano proporzionalmente allo stesso modo e il rapporto di divisione non cambia.
D101 è un TVS bidirezionale che si occupa di assorbire i transienti ESD ai quali il sensore (che si trova fuori dalla scatola) potrebbe essere esposto.
Un altro obbiettivo di cui abbiamo parlato è l'immunità a disturbi radiati. Il cavetto che collega il Pt1000 al circuito è una piccola antenna che alla frequenza giusta porterà un sacco di immondizia nel circuito. Questo tipo di disturbo è sempre di modo comune, ma alla prima asimmetria o non linearità nel circuito viene raddrizzato e può diventare visibile in DC. L'approccio tipico è di usare una common-mode choke, che però è in serie al segnale e introduce una resistenza anche in DC. Questa, nella nostra applicazione, causerebbe un errore. La soluzione in questo caso (e che spesso ha una performance migliore di una common-mode choke!) è un condensatore X2Y. Questi condensatori hanno una ESL bassissima e sono inerentemente simmetrici. Essendo messi tra le linee da proteggere e non in serie ad esse, non causano una caduta di tensione in DC. Sono anche ottimi per bypass in applicazioni pesanti ad alta velocità (FPGA & co).
Lo stadio d'uscita
Adesso che abbiamo un segnale in tensione proporzionale alla temperatura del sensore, vediamo di pilotare il bellissimo strumento analogico che abbiamo. Quando ho dimensionato lo stadio di linearizzazione l'ho fatto già con questo stadio in mente: l'uscita, come indicato sullo schema (sono questi i piccoli dettagli che secondo me separano schemi mal fatti da schemi di piacevole lettura) varia da 1024 mV a (1024 + 2000) mV passando da 16 a 41 gradi.
Questo significa che ho una tensione di 2 V da trasformare in una corrente di 100 µA (il fondoscala dello strumento). La cosa ovviamente è facilissima: dividiamo per 20'000 Ω. Inoltre vuol dire che il riferimento è a 1024 mV, che "guardacaso" è una delle nostre tensioni di riferimento e "guardacaso" il componente che ho scelto (vedi oltre) è in grado di assorbire corrente, non solo di emetterla.
L'OPA320 qui è stato scelto per un motivo molto banale: ce l'avevo in un cassetto e ce l'avevo (visto che l'ho già usato) già come simbolo della biblioteca dell'ECAD. Come prestazioni basta e avanza, le condizioni d'uso sono meno stringenti (che visto che comunque è un Signor Opamp, assume un tono quasi ironico). Attorno a questo opamp è stata realizzata una classica sorgente di corrente. Il carico è induttivo, ma ci sono in serie 20k è mi sono permesso di sperare che non sarebbe stato un problema. Ho avuto fortuna, ma avevo una soluzione nel caso di instabilità: avrei potuto collegare in parallelo all'uscita, direttamente sul morsetto dello strumento, una componente RC per compensare l'induttanza.
R107 e C107 servono a filtrare eventuale rumore che fosse riuscito ad intrufolarsi nel circuito. Inoltre rallenta il movimento dell'ago dello strumento, rendendolo piú piacevole da vedere (questione di gusti).
Il TPS3701 nella parte bassa del circuito sorveglia la tensione di controllo e disattiva l'uscita, portando l'OPA320 ad uno stato di alta impedenza in uscita, se la temperatura esce dall'intervallo indicabile. Serve ad evitare che a temperature sotto i 16° C o sopra i 41° C l'ago venga schiacciato contro il fondoscala. Un problema simile può essere causato dal distacco del sensore (rottura del cavo). Quando questo elemento di protezione si attiva, le uscite open-drain abbassano il segnale di shutdown a logica negativa sul pin 5 dell'OPA320. In condizioni normali questo segnale è tenuto alto da un pull-up costituito da un LED con la sua resistenza. In questo modo quando la lancetta è a 16° C e il LED è spento, so che questa è la temperatura effettiva. Se invece il LED è acceso, allora non abbiamo 16° C ma un'altra temperatura al di fuori dell'intervallo indicabile.
Il TPS3701 mi realizza questa funzione in maniera elegante, portandosi dietro la sua tensione di riferimento a 400 mV. Spesso vale la pena vedere cosa c'è sul mercato. I comparatori si sono evoluti dai tempi dell'LM311.
Alimentazione e riferimenti
L'alimentazione è molto semplice:
Da sinistra a destra:
- il connettore sul quale saldo due fili collegati alla presa USB (di tipo C, con i due resistori per le linee CC saldati direttamente sulla presa)
- common-mode (e anche differential-mode anche se qui irrilevante) choke per la soppressione dei disturbi radiati
- TVS per la soppressione di eventi ESD
- condensatore di ingresso. 1µ può sembrare poco, ma il circuito ha un consumo infimo puramente in DC
- un regolatore lineare che mi porta a 3.3 V (anche questo scelto perché già ce l'avevo)
- condensatore di bulk per l'alimentazione di tutto il circuito
Anche il circuito che genera le tensioni di riferimento è banalissimo, copiato di sana pianta dal datasheet dei componenti:
Condensatori di bypass e resistori
Vicino ad ogni IC c'è un condensatore di bypass da 100n. Se parlassimo di un circuito a frequenze maggiori forse avremmo anche avuto condensatori multipli, con valori a salire man mano che ci allontaniamo dal pin di alimentazione. Qui vale la pena parlare del fatto che non tutti i condensatori nascono uguali. Il dielettrico ha un'importanza fondamentale nel decidere se il condensatore fa il suo lavoro come si deve o meno. Nel contesto dei condensatori di bypass ci limitiamo a dielettrici di tipo ceramico. Questi si suddividono in classi. E ci sarebbe da scriverci un articolo intero. Per farla breve diciamo che per valori piccoli (fino alle decine, forse centinaia di pF) s'hanno da usare i CGO o NP0. Al di sopra di queste capacità si passa a X7R (quando possibile) o X5R (altrimenti). Tutto il resto va evitato (o usato se si sa esattamente a cosa si va incontro). E per quel che riguarda gli X7R/X5R, vanno usati fino ad un massimo della metà della loro tensione nominale (io mi fermo ad un terzo perché sono un rompipalle pedante). Se c'è interesse possiamo parlarne dettagliatamente in un altro articolo.
Per quel che riguarda i resistori la cui precisione ha un effetto sulla misura, ho optato per la serie RG di Susumu, con una precisione dello 0.05% e un coefficiente di temperatura di 10 ppm/K. Sono inoltre in tecnologia thin-film NiCr che ne garantisce un drift dovuto a temperatura ed età molto basso (vi ricordate, non voglio mai piú doverci mettere le mani). Anche qui vale lo stesso discorso. Sì, a 50 cent il resistore sono costosi, ma me ne servono una manciata e mi servono una volta sola.
L'errore
Miiii... quanto se la mena questo per un termometro! Sì, ne sono consapevola, ma come detto è anche un po' una scusa per poi poter scrivere questo articolo.
E tutte queste menate a cosa servono? In teoria ad evitare gli errori ed ottenere un circuito perfetto al primo tentativo. La realtà però è un'altra. Anche qui ci ho messo un errore. Lo avete trovato. Se volete, tornate indietro e cercate di scoprire cosa c'è di sbagliato.
Serve un suggerimento? In stato stazionario il circuito funziona bene, è quando cambia qualcosa che c'è un problemino.
L'avete trovato? O vi arrendete?
Beh, ecco la soluzione: all'accensione del circuito, quando i 3.3 V salgono da 0 al loro valore nominale, gli opamp si attivano. Anche l'OPA320 e inizia a fare quello che è il suo lavoro. Le tensioni di riferimento sono anche loro belle rapide a raggiungere il loro valore nominale. Quello che invece è molto lento è l'ingresso dell'OPA320, che si trova dietro un mastodontico passa-basso con una 𝜏 di 1 secondo! Il risultato è che l'ago viene fiondato contro il fondoscala negativo per tutto il tempo che l'ingresso ci impiega a raggiungere 1024 mV. Esattamente quello che volevo evitare. Quanto imbarazzante è un errore del genere? Stendiamo un velo pietoso...
Fortunatamente è anche facile da risolvere: ho ridotto drasticamente il valore del filtro RC. Un'altra opzione sarebbe stata inserire un ritardo simile all'ingresso del pin di shutdown dell'opamp.
E così si impara: il power sequencing riguarda anche i segnali, non solo le alimentazioni. Si spera che in futuro me ne ricordi.
Dallo schema al layout
Il posizionamento dei componenti sul PCB e il successivo routing (collegamento tramite piste, poligoni, via e piani) sono qualcosa che secondo me ha un che di artistico. Quando in ditta faccio una review di un PCB so chi l'ha disegnato, senza bisogno di chiedere. Questo perché ognuno ha la sua mano, la sua calligrafia, il suo stile. Ed è bene che sia così, a patto di rispettare alcuni accorgimenti sui quali non s'ha da discutere. Sono tanti e si acquisiscono con l'esperienza professionale. Ve ne elenco un paio che mi vengono in mente, la lista non è completa:
Il piano di massa
È sacrosanto e intoccabile. Non mettercelo è un pessimo inizio, interromperlo sotto ad una traccia è un peccato mortale. Non voglio tediarvi, ma molto brevemente, il motivo è questo: la corrente che scorre in una pista deve richiudersi verso la sorgente. Di solito questo avviene attraverso il piano di massa. Questa corrente, perlomeno in AC, non prende il percorso piú breve (che è quello che molti credono), ma si incolla e concentra sotto alla pista di andata. Se il piano di massa è interrotto, si genera un loop, fonte di un disadattamento di impedenza, di possibile accoppiamento di disturbi e di induttanze parassite che causano quell'inspiegabile ringing in uscita all'amplificatore e altre gioie simili.
La distribuzione dell'alimentazione
L'alimentazione deve essere a bassa impedenza, a tutte le frequenze utili. Questo si ottiene con una generosa distribuzione della stessa (grosse superfici: poligoni, piani, piste larghe) e con un sostegno locale dato dai condensatori di bypass. In un mondo ideale useremmo almeno 4 layers e ne avremmo uno dedicato per l'alimentazione. In ambito hobbystico spesso vogliamo restare a 2 per motivi di prezzo. Si po fare, ma se si vogliono fare le cose per bene, lo sforzo si decuplica! Avevo scritto un paio di paragrafi sul tema, ma mi sono accorto che mi sto dilungando troppo. Se interessa possiamo parlare di queste tecniche in un articolo a sè stante.
Considerare l'impedenza dei nodi
L'impedenza di una parte di circuito, rispetto al riferimento, detta dove piazzare i componenti. Da un punto di vista dello schema questi due circuiti sono completamente equivalenti. La netlist è de facto la stessa:Passando al layout, però, introduciamo gli effetti legati alla geometria del circuito. Se lo realizziamo come disegnato in alto, la parte lunga della pista che collega i due amplificatori si trova collegata direttamente all'uscita dell'opamp: è un nodo a bassa impedenza. Nonostante sia lungo, è difficile (ma non impossibile!) che un disturbo radiato possa influenzarlo. In basso invece la parte lunga è un nodo ad alta impedenza ed è piú facile che faccia da antenna per disturbi vari. N.B.: non si tratta di un circuito ad impedenza controllata, altrimenti dovremmo considerare anche gli effetti di terminazione e a volte una source termination può essere necessaria.
Il caso concreto
Qui vediamo una parte del circuito del nostro termometro, che ci permette di concretizzare i punti di cui sopra:
- Il piano di massa è quello in blu semitrasparente, sullo strato inferiore. Ci sono due tracce che lo tagliano. Come scritto sopra, non è buona prassi. Qui mi permetto di farlo perché non credo che mi dia problemi: quelle tracce vanno a connettori a bordo PCB. Se fossi stato sul layer superiore avrei tagliato quello, che però è quello che oltre al routing mi porta i 3.3V di alimentazione. I segnali che salgono su quelle tracce sono (a) non riferiti a GND e (b) escono dal PCB (verso lo strumento e verso il LED), quindi il loop esteso già c'è e non sono quei 15 mm che mi fanno una differenza. Ogni regola può essere infranta, nessuna regola può essere ignorata (non mi ricordo dove l'ho letta, ma è una massima che apprezzo molto!).
- Come già accennato, l'alimentazione è distribuita sul top layer con un poligono che copre tutto quello che non è occupato da altra roba (rosso semitrasparente). Inoltre si vede come i condensatori di bypass sono piazzati vicinissimi ai pin di alimentazione: pin 6 e il condensatore appena sopra per l'IC a sinistra nonché pin 5 e il condensatore appena sopra per quello a destra. Anche le via che effettuano il collegamento a GND sono tenute ben vicine alle piazzole.
- Il collegamento del pin 3 a sinistra alla resistenza che ci sta sotto è un esempio di nodo ad alta impedenza (è l'ingresso dell'OPA320, dopo il passabasso). Come vedete la resistenza è messa vicina all'ingresso dell'OPA320, non all'uscita dell'OPA387 (che è un po' piú in basso, al di fuori dell'immagine).
Un commento sulle tracce: come vedete sono arrotondate. La prima domanda che mi viene fatta è se è per motivi di alta frequenza. No, è semplicemente perché mi piace da un punto di vista estetico. La differenza tra un angolo retto e un segmento a 45° si comincia a vedere da una decina di GHz (!) a salire. Figuriamoci una curva rispetto i 45°!
Possiamo vedere il risultato finale del nostro lavoro nel rendering del PCB (e qui si vede uno dei molti motivi per cui mi creo io tutti i componenti nella mia library, non scarico modelli pronti che spesso fanno acqua da tutte le parti):
I due fori grossi sono fatti per montare il PCB direttamente sul retro dello strumento analogico.
Non preoccupatevi, il Pt1000 non verrà collegato con quel connettore. Salderò i terminali direttamente sul PCB.
Forse si vede che attorno ai fori per lo strumento c'è una miriade di via. Quei fori dovranno resistere ad un moderato sforzo meccanico quando stringerò i dadi. La presenza di quelle via aumenta enormemente la resistenza meccanica delle piazzole. È un trucco da tenere a mente per tutti i pad sottoposti a sforzi o sui quali salderete insistentemente.
Sono solito mettere un po' di informazioni cruciali all'uso del PCB sullo stesso, sul silkscreen. Forse tra 10 anni dovrò farci un lavoretto (spero di no!) e sapere qual è la tensione di alimentazione, quale ne è la polarità e dove possono esserci i problemi (per esempio in LED non collegato perché non ci si ricorda che è funzionale, fa parte del pull'up!) è utile.
E sì, documento tutto in inglese. Ormai è la lingua della tecnica. I datasheet sono in inglese. I termini tecnici sono in inglese. Perché dovrei saltare da una lingua all'altra?
Se aguzzate la vista, sulla scheda si vede un secondo errore. I componenti passivi sono tutti 0603 (roba diffusissima e ancora ben saldabile a mano). In un momento di rincitrullimento ho però importato le due resistenze di shunt da 10k dalla libreria 0402, sono quindi piú piccole. Vabbè, fossero tutti così semplici da risolvere i problemi, sarebbe troppo facile!
Collaudo
Dopo aver acquistato i PCB su JLCPCB e i componenti su DigiKey, mi sono assemblato il circuito. Eccolo qui, ancora pieno di flussante, scusate per la qualità della foto:
E finalmente possiamo rispondere alla fatidica domanda: ma funziona? Fortunatamente in ditta abbiamo un simulatore di Pt1000: posso dargli una temperatura e lui mi simula la resistenza corrispondente. Come si comporta a quella che probabilmente è la temperatura media che ho in casa?
Non male, non male! Potete immaginare la felicità di un risultato del genere! È un sollievo vedere che funziona e funziona bene!
Salendo, la precisione peggiora. A 38°C siamo forse 0.3-0.4°C in difetto:
È fuori dall'obbiettivo che ci eravamo prefissati. Cosa può aver causato l'errore?
- Come si vede sul display, il simulatore ha una tolleranza di 0.2°C di suo
- La misura avviene con tecnica a 2 fili, ma è un Pt1000 e la resistenza dei fili è bassa, inoltre porterebbe ad un errore positivo. Probabilmente il problema non è qui.
- A queste precisioni, il fatto che il P1000 non sia né lineare, né quadratico comincia a farsi sentire. Abbiamo realizzato una compensazione quadratica, quello che vediamo, in parte, potrebbe essere la componente cubica della curva.
- Offset, tolleranze e imprecisioni.
Non mi cruccio troppo: è fuori dal punto di lavoro normale (non vivo in una sauna) e come detto in un locale abitativo ci sono spesso differenze pari a 10 volte tanto tra un angolo e l'altro della stanza. Posso accettare l'errore. Non lo ignoro però, se fosse un prodotto professionale, sarei fuori specifica.
Sono soddisfatto ed è quello che conta!
Eccolo qui in salotto ad indicarmi la temperatura, di fianco all'accrocchio a cui si sono scaricate le batterie.

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)
