ADC Sigma Delta su PIC 16F628

Non ricorda da vicino il progetto del Tiny Therm?
Forse perchè per molti versi è la sua evoluzione. Con ordine: tempo fa mi contatta Mauri, interessato a costruirsi una versione personalizzata del termometro, chiedendomi di aiutarlo con le modifiche al firmware. Dal momento che non utilizzavo il PicBasicPro da diversi anni avrei dovuto togliermi un bel po' di ruggine, ma accetto. L'obiettivo finale era uno strumento orientato all'automotive per il monitoraggio delle temperature di acqua e olio. Dunque occorreva implementare la gestione di un secondo sensore di temperatura, modificando di conseguenza la grafica del display. Nel periodo successivo io e Mauri ci siamo dedicati a vari test a distanza e, come spesso accade, l'appetito vien mangiando: una soglia di allarme di massima temperatura, un buzzer per attirare l'attenzione.. Superato il limite dei pin disponibili sul PIC 12F683 abbiamo deciso di migrare tutto il progetto sul 16F628: stessa ROM ma con diversi pin disponibili per ulteriori espansioni. Bè stessa ROM ma metà EEPROM, condizione che ha comportato la riscrittura di buona parte del codice per la corretta generazione del font di visualizzazione dei valori. Step successivo: monitorare lo stato di carica della batteria. Il PIC 16F628 non ha un convertitore analogico-digitale, ma Mauri ha recuperato in rete alcune informazioni in cui si accenna alla implementazione di un fantomatico ADC denominato Sigma Delta (o Delta Sigma? boh..) utilizzando i comparatori interni al PIC unitamente ad un apposito algoritmo di calcolo. Perfino una nota di Microchip, per la precisione la AN700 ne spiega il funzionamento. Interessante... Cerchiamo di capirne di più. In effetti la documentazione disponibile in rete non sembra molta.. Ci sta, in fondo sarebbe molto più semplice ripartire da zero e usare un PIC con ADC a bordo o un sistema diverso (arduino, ESP..). Ma ormai ero affascinato dal poter avere una lettura analogica da un PIC senza questa funzione e senza ricorrere ad integrati dedicati. Ulteriori ricerche hanno rintracciato questo documento. Stesso PIC, risultato raggiunto. E c'è pure il listato del firmware. Dunque "cocciadecaprasarda_mode ON" e si prosegue... A questo punto la difficoltà era data dal fatto che, analizzato il funzionamento della routine di acquisizione della lettura analogica, era chiaro che dovesse essere inserita nel resto del firmware direttamente in assembler per poter gestire rigidamente in maniera adeguata i tempi (in cicli macchina) dedicati alla generazione del clock, comparazione dei valori, iterazione delle letture. Purtroppo nè io nè Mauri avevamo molta confidenza con l'assembler dunque non è stata una passeggiata: un conto è inserire una linea di codice ASM e un altro una intera funzione, con passaggio di variabili dall'ambiente PicBasic a quello ASM e viceversa. Ci sono voluti diversi giorni di lockdown e molte imprecazioni, ma alla fine del tunnel.. LA LUCE! Finalmente il codice generava dei valori in qualche modo legati alla tensione in ingresso al circuito.

Cosa abbiamo imparato: il codice effettua una serie di iterazioni (2^ bit di risoluzione del ADC) in cui confronta la tensione presente ai capi di C1 con la tensione di riferimento (programmabile) generata internamente dal PIC tramite il pin RA0. Se questa è maggiore genera un impulso basso al pin RA3 che integrato dal gruppo R2-C1 abbassa leggermente la tensione su RA0, viceversa genera un impulso alto con effetto opposto. Al termine del loop (1024 iterazioni nel nostro caso ovvero 10 bit) il rapporto tra gli impulsi alti/bassi è correlato a quello fra la tensione in ingresso e quella di riferimento. Questo almeno nel caso di un circuito simmetrico (R1=R2) e senza polarizzazioni particolari con cui è possibile variare il range di lettura. Abbiamo dunque apportato qualche aggiustamento allo schema e, con una piccola "furbata", ottenuto una scala di lettura da 0 a 25.5 volt con risoluzione 100mV. Come accennato il codice genera una risoluzione a 10 bit, pertanto la funzione ADC restituisce un valore fra 0 e 1023 per tensioni fra lo zero e il fondoscala/Vcc. Per eliminare le inevitabili incertezze di lettura vengono scartati gli ultimi due bit e, magicamente, il risultato finale assume valori fra 0 e 255. Un banale partitore resistivo con trimmer di regolazione permette di far coincidere il risultato della funzione con la tensione in esame, in unità di 100mV. Nelle prove eseguite la linearità e la precisione delle letture hanno superato le attese e sono sicuramente più che adeguate allo scopo del progetto.

Schema elettrico

Partendo dal basso a sinistra troviamo la sezione di alimentazione realizzata con un regolatore lineare AMS1117 a 3.3 volt circondato dalle capacità necessarie al livellamento e filtraggio delle tensioni di ingresso e uscita. La sezione superiore costituisce il front end del circuito ADC: trimmer multigiri per la taratura, condensatore di livellamento, gruppo R-C-R visto in precedenza connesso alle linee RA0 e RA3 del PIC. Il diodo D1 è di protezione per inversioni di polarità o spikes negativi potenzialmente generati dal circuito elettrico dell'auto. In alto un optoisolatore costituisce un ingresso ausiliario che, collegato al circuito luci, porta a massa il pin di controllo della retroilluminazione del display. In questo modo accendendo i fari si attiva la retroilluminazione per l'uso notturno. Il jumper JP8 forza questa condizione in modo permanente. Sulla destra, oltre alle connessioni verso il display troviamo il jumper JP4 che attiva la modalità "reverse" del display; infine, la sezione in basso costituisce un amplificatore push-pull che serve a irrobustire il segnale del buzzer nel caso in cui il livello sonoro fosse insufficiente.

Lato rame della basetta Layout componenti
Raytrace lato rame Raytrace lato componenti
Basetta fresca di CNC Progetto ultimato

Firmware

Al termine delle numerose revisioni seguite alla implementazione delle varie funzioni (e ai maldestri tentativi miseramente falliti di far funzionare la routine ADC) la versione finale del firmware gestisce:

Attualmente le soglie di allarme sono di 12.2 volt per la minima tensione di batteria, 95 gradi per l'acqua e 110 per l'olio, facilmente modificabili dal listato picbasic come pure le soglie di attivazine delle barrette sull'iconcina della batteria. Alla attivazione di un allarme il valore interessato è evidenziato mediante sottolineatura ed il buzzer emette una nota intermittente; dopo qualche secondo la nota viene tacitata. La nota acustica è inibita per qualche secondo anche alla accensione del circuito per dar modo di accendere il motore senza essere infastiditi dal "bip" che segnala l'ovvio calo di tensione. Dal punto di vista grafico è stato mantenuto il termometro sulla destra che indica la temperatura acqua; al centro le icone in stile automotive per olio acqua e batteria, infine sulla sinistra i valori rilevati con, ultima chicca, l'iconcina animata stile telefonino che indica il livello di carica della batteria.

La versione compatta

Per quanto mi riguarda ho deciso di realizzare il circuito con componenti thru hole "vecchio stile" riciclando quasi tutto l'occorrente ad eccezione del display; il risultato è una basetta quadrata di qualche millimetro più grande delle dimensioni del display. Mauri ha più dimestichezza di me con gli SMD e quindi la sua versione è ben più compatta. Lo schema differisce per l'utilizzo di un diverso fotoaccoppiatore, regolatore di tensione e per la mancanza del finalino audio; per il resto schema e firmware sono identici. Ecco il link con schema elettrico e pcb per la "Mauri's SMD version".

Per gli audaci del SMD: lato componenti.. e lato rame
Il circuito accoppiato al display.. e la SONTUOSA installazione nella vaschetta sul tunnel dell'auto

Montaggio

Nel suo utilizzo in auto la scheda ed il display devono ovviamente essere posizionati in maniera tale da non distrarre chi guida, cosa non sempre facile sui cruscotti delle auto moderne. Per contro non servono particolari accorgimenti relativi alla protezione dei componenti. Discorso diverso per le sonde di temperatura che sono posizionate nel vano motore e devono essere a contatto termico con i fluidi del motore. Una possibile soluzione è questa

in cui il DS1820 è sigillato dentro un raccordo filettato (pozzetto) che a sua volta sarà inserito nel circuito di raffreddamento o dell'olio. Il 1820 è disponibile, fake compresi, anche in versione stagna con già un tratto di cavo collegato. Sta ad ognuno individuare la soluzione meccanica più opportuna, a seconda della quale potrebbe essere necessario realizzare un manicotto "custom" sul circuito di raffreddamento in cui inserire la sonda, un tappo modificato per la coppa dell'olio (per le macchine che ancora ce l'hanno, il tappo!) e via dicendo. Le cose si fanno più semplici nell'ipotesi di installare il circuito su macchine operatrici, macchine agricole, motogeneratori e simili. Una bella scatola stagna e via di trapani chiavi e cacciaviti!

Conclusioni

Grande soddisfazione per i risultati ottenuti "a quattro mani" e per aver avuto una ulteriore conferma del fatto che la cocciutaggine spesso paga. Il sigma delta si è rivelato un osso duro ma alla fine ne siamo venuti a capo. Citare Manfred Von Richtofen, il leggendario Barone Rosso è decisamente esagerato, fatto sta che sul coperchio del portatile (prebellico) su cui ho sviluppato il codice è spuntata un nuovo pittogramma:

Colpito e affondato.

praz2004 chiocciola libero punto it