Rilevare calo tensione su AtMega328p

Ciao a tutti, Ho letto nel datasheet che per lavorare tra 0 e 20 Mhz bisogna disporre di almeno 4.5 - 5.5V Volevo sapere cosa succedeva se la tensione cala sotto questa soglia, il micro si danneggia? C'è un modo nel micro per capire se la tensione sta calando in modo da aver tempo per salvare i dati o bisogna fare un circuito che rilevi la tensione?

Ciao e grazie a tutti

In teoria funziona come quando overclocki un pc senza alzare la tensione del core, diventa instabile, sbaglia i dati si frizza, poi non so , non ho mai provato :)

Se usi un comparatore che controlla la tensione di alimentazione e quando scende sotto una certa soglia inesca un interrupt puoi eseguire del codice per salvare dei dati. È da vedere dove li salvi e se quel dispositivo regge un calare della tensione.

Ciao Uwe

flz47655: Volevo sapere cosa succedeva se la tensione cala sotto questa soglia, il micro si danneggia?

Non si rompe nulla, semplicemente il micro diventa instabile se lavori ad una frequenza troppo alta rispetto alla tensione. Sul data sheet del 328 c'è un grafico che ti fa vedere la dipendenza tra tensione di lavoro e massima frequenza ammessa, fino a che lavori con Vdd > 4.5V puoi utilizzare tutto il range di frequenze ammesse, sotto i 4.5V scende la frequenza ammessa. Se da un lato hai vari modi di rilevare la Vdd applicata al micro, p.e. tramite ADC, in realtà serve a ben poco per prendere provvedimenti contro eventuali cali di tensione perché quelli che creano problemi sono sempre molto più rapidi di quanto ci metti a rilevarli e prendere provvedimenti, infatti uno dei punti più critici nell'uso dei micro è proprio lo stadio di alimentazione che se non ben progettato porta a sicuri malfunzionamenti e/o reset indesiderati. Il micro ha un sistema di protezione hardware contro i cali eccessivi di tensione, è il cosidetto BOR o BOD (Brown Out reset), ovvero un reset hardware automatico se Vdd scende sotto un certo livello prestabilito. In caso di Brown Out il micro viene tenuto in reset fino a che la tensione non torna a livelli accettabili e la condizione di errore, il BOR, viene scritta in un apposito flag che, se consultato al riavvio, permette di prendere le dovute misure per ripristinare il corretto funzionamento, il classico hot start. Non credo Arduino, inteso come wiring, preveda un hot start, però è sicuramente possibile scriverne uno proprio anche se non è semplice da fare perché va integrato a livello di core.

Un sistema potrebbe essere quello di impostare sul micro il BOD (Brown-out) ad un valore altino, tipo 4,3V che mi pare sia il massimo impostabile. Poi usare un supercondensatore come "batteria di backup" per fornire una riserva d'energia di qualche secondo d'autonomia, sufficienti a salvare su qualche dispositivo non proprio lento (esempio EEPROM interna, una scrittura prende 3,3ms) eventuali dati critici prima che poi intervenga il BOD. Disporre un qualche sistema esterno che porti a low un pin su cui abbiamo collegato un interrupt hardware: alla lettura del calo di tensione, salvare immediatamente i dati. Intervenuto il BOD, il micro è messo in reset finché la tensione di alimentazione non torna a livelli accettabili (>4,3V). So che è un po' complesso ma se la cosa è di vitale importanza, è fattibile.

Sarebbe stato utile avere un interrupt gestibile quando la tensione cala da 5 a 4.8 volt o meno (tanto per essere sicuri), per avere il tempo di fare qualcosa senza usare comparatori etc.. le batterie ricaricabili mi sembra che quando stanno per scaricarsi inizino a calare ma non in impennata rapidissima e quindi un pò di tempo per fare qualcosa c'è. Utile il BOD, peccato non sia impostabile a un livello più alto...

Grazie a tutti Ciao

leo72: Poi usare un supercondensatore come "batteria di backup" per fornire una riserva d'energia di qualche secondo d'autonomia, sufficienti a salvare su qualche dispositivo non proprio lento (esempio EEPROM interna, una scrittura prende 3,3ms) eventuali dati critici prima che poi intervenga il BOD.

Non serve un supercondensatore, basta progettare bene la parte di alimentazione del micro con i corretti disaccoppiamenti dopo di che un semplice condensatore ceramico, di quelli buoni, da 10 uF ti garantisce abbastanza autonomia per disattivare tutti gli out, che consumano corrente, chiudere il lavoro e salvare eventuali dati in EEPROM. In tutti i casi il vero problema è sempre a monte, ovvero lo stadio di alimentazione che cede, se è progettato male c'è ben poco da fare, se è progettato bene non devono esserci eventi BOD salvo eventuali spegnimenti indesiderati dell'alimentazione, p.e. una batteria che è arrivata a fine carica. Per farla breve, se il tutto è ben progettato il BOD non dovrebbe mai entrare in funzione salvo casi particolari e previsti in fase di progetto, se il sistema viene progettato male o utilizzato fuori specifiche, p.e. collegare dei servo all'alimentazione di Arduino, allora c'è ben poco da fare e malfunzionamenti sono più che certi :grin: