Parliamo di consumi di chip in standalone

Voglio aprire un thread apposito per parlare di una questione che secondo me necessita di chiarimenti e di dati rilevati con strumenti.

Partiamo dagli inizi. Usando un chip in standalone spesso la prima richiesta di chi sviluppa circuiti è quella di ridurre i consumi. Si studia molto lo sleep ed altri metodi per ridurre il consumo "interno" ma non ci si dedica molto al consumo "esterno". Mi spiego. Un micro come l'Atmega328 possiede 28 pin, di cui buona parte usati come GPIO, pin di input/output. Spesso non tutti vengono usati nei propri progetti, e molti progetti fanno vedere pin non collegati, cioè lasciati flottanti. Un micro dovrebbe invece avere gli stati dei pin sempre ben definiti. Su alcuni siti ho letto tutto ed il contrario di tutto su come abbattare il consumo dando degli stati definiti ai pin.

Le 2 "correnti di pensiero" più in voga vedo che sono: 1) attivare le pull-up interne sui pin lasciati non collegati 2) attivare i pin liberi come output con segnale LOW.

Secondo i sostenitori della prima... "corrente di pensiero", la corrente che scorre sulla pull-up interna (ricordo che si deve impostare il pin come INPUT e poi scrivere un segnale HIGH sullo stesso pin) sarebbe inferiore a quella consumata dallo stesso pin lasciato flottante. Secondo i sostenitori della seconda, invece, un pin impostato come SINK, ossia come "assorbente" di corrente (pin in modalità OUTPUT e segnale LOW), permette di risparmiare corrente.

Siccome non ho strumenti professionali per poter misurare correnti molto basse, chiedo a chi ha la possibilità di verificare quale delle 2 configurazioni dei pin consuma meno corrente, in modo da avere un dato CERTO ed incontrovertibile su come sia meglio impostare i pin di un micro per ridurre i consumi derivati dagli stati indefiniti dei pin.

Grazie a tutti della collaborazione.

leo72: Siccome non ho strumenti professionali per poter misurare correnti molto basse, chiedo a chi ha la possibilità di verificare quale delle 2 configurazioni dei pin consuma meno corrente, in modo da avere un dato CERTO ed incontrovertibile su come sia meglio impostare i pin di un micro per ridurre i consumi derivati dagli stati indefiniti dei pin.

La risposta è molto semplice e non serve nessuna misura perché è già presente sul data sheet. Se ti vai a vedere la tabella dei consumi nelle varie modalità di sleep puoi vedere che per tutte c'è il riferimento alla nota 3 che cita:

3. The current consumption values include input leakage current.

Ovvero le misure sono state fatte con le pull up attive sui pin non connessi, e per i loro test di laboratorio lo sono tutti, il che risponde automaticamente alla tua domanda su quale sia il modo migliore per non consumare corrente durante lo sleep. Tenere un pin in condizione out, non importa se 0 o 1, richiede un consumo maggiore di corrente perché devono essere polarizzati più gate, sto parlando dei mos interni del micro, rispetto ad un input. Da notare che l'input leakage current può arrivare fino a 1 uA per ogni pin, però questo è un valore massimo in assoluto riportato dal datasheet, mentre non esiste un valore minimo in assoluto che comunque è tipicamente di pochi nA, ciò non toglie che su MCU con valori prossimi alle tolleranze massime il consumo in sleep power down può arrivare fino a qualche uA invece di solo 0.1 uA, però sono casi limite ben lontani dalla norma.

Ti ringrazio per la spiegazione.
Quindi era corretto ed aveva una logica ciò che avevo letto tempo fa circa il fatto che attivare appunto una pull-up porta sempre ad un consumo inferiore.

Mi confermi comunque che lasciare un pin flottante NON si deve fare, è corretto?
Valgono le stesse regole di un qualunque integrato CMOS, cioè che si deve sempre dare uno stato definito ad ogni piedino dell’integrato, fosse anche solo connesso a massa?
Ecco, relativamente a questo aspetto: si può lasciare un pin NON collegato e con pull-up interna attiva o conviene collegarlo magari a GND anche se si attiva la pull-up?

leo72: Mi confermi comunque che lasciare un pin flottante NON si deve fare, è corretto?

Lasciare un pin di input flottante non conviene per due semplicissimi motivi, prima di tutto per via dell'alta impedenza capta tutti i disturbi emi presenti con il rischio di falsare la lettura di un port se non la fai bit a bit, in secondo luogo è a rischio per le eventuali extratensioni causate sia dalla emi che dalla statica, tenerlo con la pull up a 1 logico risolve entrambe le cose. In realtà il modo migliore per tenere lontano dai disturbi e dai pericoli è collegarlo a GND tramite una pull down da 100 ohm se è un input oppure tenerlo a 0 logico se è un output, ma sono cose che portano a consumi maggiori in condizione di sleep power down, ovviamente se non ci sono vincoli dovuti al contenimento estremo dei consumi questo è il modo migliore per procedere.

Valgono le stesse regole di un qualunque integrato CMOS, cioè che si deve sempre dare uno stato definito ad ogni piedino dell'integrato, fosse anche solo connesso a massa?

Si, gli input non dovrebbero mai essere lasciati flottanti.

Ecco, relativamente a questo aspetto: si può lasciare un pin NON collegato e con pull-up interna attiva o conviene collegarlo magari a GND anche se si

Se lo colleghi a GND non serve a nulla la pullup, anzi aumenti drasticamente i consumi perché su 20k, con 5V, scorrono ben 250 uA. Nel caso di contenimento dei consumi conviene di più tenere la pull up attiva, su input flottanti, perché la corrente di leakage è minore per l'1 logico rispetto a quella per lo 0 logico.

grazie ad entrambi.

perche' non e' stata prevista anche una pull-down integrata ? nessun micro la continene ?

Testato: perche' non e' stata prevista anche una pull-down integrata ? nessun micro la continene ?

Probabilmente perché una pull-up, rendendo il pin ad alta impedenza, "chiude" il GPIO al mondo esterno rispetto ad una pull-down.

ma ad esempio collegarli fisicamente alla massa ? cosa comporta?

Testato: perche' non e' stata prevista anche una pull-down integrata ? nessun micro la continene ?

Ci sono molti micro che hanno anche la pull down integrata, ma non è una necessità primaria, la pull up integrata copre la stragrande maggioranza dei casi in cui serve tenere un pin appeso ad uno stato logico.

Voglio aggiungere solo un'esperienza che ho già citato nel Thread di Garinus sullo sleep. Come ha già scritto Astrobeed le pull-up interne sono da 20K, per la verità mi pare di aver letto che i valori in realtà sono variabili in un range tra 20K e 50K; se parliamo, come mi pare di capire, di pin inutilizzati, allora penso che sia la migliore soluzione possibile anche se, francamente, sui miei nanetti non l'ho applicata; poiché devo aggiornare ancora il firmware con quello che ho riscritto di recente, non mi costa nulla mettere i pin non usati in INPUT ed attivare le pull-up interne; purtroppo ancora non sono riuscito ad attrezzarmi e quindi posso solo andare "a occhio", disponendo di una risoluzione strumentale di 100nA: finora in assenza di segnale ho 0 stabile e con la misura vedo 0/1 circa al 50%, so che è estremamente empirico ma deduco circa 50nA; forse potrei notare una variazione a favore dello 0. Invece se il pin è usato con un sensore (ON/OFF) collegato a massa, le pull-up incidono notevolmente sui consumi; infatti nelle prove iniziali arrivavo, con alimentazione di 3,6V, a consumi variabili (per un solo sensore su un solo pin) intorno ai 150µA; a quel punto ho messo una pull-up esterna da 180K e tali consumi si sono ridotti a 20µA. Astrobeed mi pare mi dicesse che potevo arrivare anche a 330K (poi confermerà/smentirà lui) ma nel mio caso già a 220K il micro mi entrava in autooscillazione, credo a motivo delle centinaia di rimbalzi provocate dal sensore rotativo meccanico; con sensori di qualità invece 330K significherebbero un consumo di 11µA circa. Ho finito.

menniti: a quel punto ho messo una pull-up esterna da 180K e tali consumi si sono ridotti a 20µA. Astrobeed mi pare mi dicesse che potevo arrivare anche a 330K (poi confermerà/smentirà lui)

Il valore massimo per la pull up dipende da molte cose ed è quasi impossibile darne uno generico, a seconda delle condizioni di funzionamento può bastare 1 Mohm come possono essere pochi 20k. Nel tuo caso c'era il problema che il sensore, un contatto puro, poteva trovarsi sia aperto che chiuso in condizione di riposo e con la pull up interna attiva se l'input rimane chiuso a GND ovviamente scorrono molti uA sulla resistenza.

astrobeed:

menniti: a quel punto ho messo una pull-up esterna da 180K e tali consumi si sono ridotti a 20µA. Astrobeed mi pare mi dicesse che potevo arrivare anche a 330K (poi confermerà/smentirà lui)

Il valore massimo per la pull up dipende da molte cose ed è quasi impossibile darne uno generico, a seconda delle condizioni di funzionamento può bastare 1 Mohm come possono essere pochi 20k. Nel tuo caso c'era il problema che il sensore, un contatto puro, poteva trovarsi sia aperto che chiuso in condizione di riposo e con la pull up interna attiva se l'input rimane chiuso a GND ovviamente scorrono molti uA sulla resistenza.

Infatti il problema era proprio il fatto che non posso prevedere mai lo stato del sensore, quindi dovevo trovare il modo di risparmiare il più possibile qualora si fermasse in posizione chiuso verso massa; tant'è che, secondo i casi, i nanetti a risposo consumano o 20µA o 50nA circa. Infatti ora sono curioso di misurare lo stato delle batterie dopo circa 4 mesi di funzionamento, per capire se effettivamente il calcolo medio che ho fatto ha un significato oppure no.

astrobeed: Il valore massimo per la pull up dipende da molte cose ed è quasi impossibile darne uno generico, a seconda delle condizioni di funzionamento può bastare 1 Mohm come possono essere pochi 20k

Ma tornando alla mia domanda iniziale ed agganciandomi a questo tuo ragionamento, rielaboro la questione così: I 20K delle pull-up interne sono sufficienti per "isolare" il pin? Oppure conviene usare una R esterna di valore superiore (tenendo sempre il pin in INPUT)?

Domanda probabilmente da Niubbissimo.

Come si attiva la resistenza di Pull-Up?

Grazie.

Penso di sì Leo, il problema si porrebbe se usi qualcosa collegato all'esterno, ma qui stiamo parlando di pin inutilizzati.

@ Fabrizio: metti il pin in INPUT e poi gli dai un digitalWrite(HIGH)

leo72: Ma tornando alla mia domanda iniziale ed agganciandomi a questo tuo ragionamento, rielaboro la questione così: I 20K delle pull-up interne sono sufficienti per "isolare" il pin? Oppure conviene usare una R esterna di valore superiore (tenendo sempre il pin in INPUT)?

Semmai ti serve una R esterna di valore minore, superiore peggiori solo le cose, normalmente i 20-50k della pull up interna sono più che sufficienti, ma in caso di ambienti molto rumorosi dal punto di vista emissioni elettromagnetiche, o con molto rumore sulla alimentazione, possono risultare pochi, in casi estremi si agganciano gli input direttamente a V+, o GND, con una R da 5-100 ohm.

Sì, ovviamente se uso una R esterna il pin lo devo per forza agganciare a qualcosa.