Con questo articolo si conclude la serie di articoli "Oggi i PIC consumano meno" della Rubrica Firmware Reload di Elettronica Open Source. In questa rubrica sono stati inseriti gli articoli facenti parte della precedente rivista cartacea Firmware.
SUGGERIMENTO 9: USO DELL’OPZIONE “TWO-SPEED START-UP”
Two-speed start-up è un’utile caratteristica di alcuni dispositivi nanoWatt e di tutti i dispositivi nanoWatt XLP che permette di ridurre i consumi dal momento che consente il wake–up e il ritorno alla modalità sleep più velocemente. Si può impostare una frequenza su un clock interno in fase di start-up tramite il registro OSCCON: la Figura 1 dà un esempio di come si può fare. Per maggiori dettagli ci si può riferire alla documentazione tecnica del dispositivo.
SUGGERIMENTO 10: “CLOCK SWITCHING”
Alcuni dispositivi nanoWatt e tutti i dispositivi nanoWatt XLP dispongono di sorgenti di clock interne ed esterne multiple. Ciò permette di risparmiare scegliendo di utilizzare clock differenti per differenti porzioni di codice. Per esempio, un’applicazione può utilizzare un oscillatore interno più lento durante l’esecuzione di codice non critico e poi tornare ad utilizzare un oscillatore a frequenza più elevata per il codice più dipendente da tempi e frequenze. Il Clock Switching permette di avere applicazioni più flessibili perché non si rimane vincolati ad una singola sorgente di clock. Le sequenze di clock switching variano in base alle famiglie dei dispositivi, così ci si riferisce ai fogli specifiche o ai manuali di riferimento della famiglia per maggiori dettagli.
SUGGERIMENTO 11: UTILIZZARE L’OSCILLATORE RC INTERNO
Se non è richiesta una precisione nella frequenza migliore del ± 5 %, è meglio utilizzare gli oscillatori RC interni presenti in tutti i dispositivi nanoWatt e nanoWatt XLP. Gli oscillatori interni RC possiedono una miglior stabilità in frequenza di oscillatori RC esterni, e consumano meno corrente di oscillatori esterni a cristallo. In più, il clock interno può essere configurato su molti intervalli di frequenza utilizzando il modulo PLL interno per aumentare la frequenza, il post-scaler per ridurla. Tutte queste opzioni si possono configurare tramite il firmware.
SUGGERIMENTO 12: CALIBRAZIONE DI UN OSCILLATORE INTERNO
Un oscillatore interno RC calibrato durante la fabbricazione può richiedere un’ulteriore calibrazione dovuta ai cambiamenti di temperatura o di VDD. Il Timer1/SOSC si può usare per calibrare l’oscillatore interno utilizzando un oscillatore a cristallo da 32.768 kHz come mostrato in Figura 2.
Si può consultare la documentazione presente sul sito della Microchip per i dettagli dell’applicazione, in particolare l’AN244, “Internal RC Oscillator Calibration”. Calibrare l’oscillatore interno permette di risparmiare, dal momento che permette di usare l’oscillatore interno RC in quelle applicazioni che richiedono normalmente cristalli di accuratezza maggiore. La calibrazione è basata sulla frequenza misurata dell’oscillatore interno RC. Per esempio, se la frequenza selezionata è di 4 MHz, sappiamo che il tempo d’istruzione è 1 μs (FOSC/4) e il Timer1 ha un periodo di 30,5 μs (1/32.768 kHz); ciò significa che entro un periodo del Timer1 il core può eseguire 30,5 istruzioni. Se il Timer1 è stato caricato con un valore noto, possiamo calcolare il numero di istruzioni che saranno eseguite prima di un overflow del timer. Questo numero calcolato va poi confrontato con il numero di istruzioni realmente eseguite dal core. Si può così stabilire se la ricalibrazione è necessaria e se la frequenza deve essere aumentata o diminuita.
SUGGERIMENTO 13: MODALITÀ “IDLE” E “DOZE”
I dispositivi nanoWatt e nanoWatt XLP dispongono di una modalità Idle nella quale il clock della CPU è disconnesso, mentre resta disponibile solamente per le periferiche. Nei PIC16 e PIC18 si può entrare in modalità Idle settando il bit corrispondente nel registro OSCON a 1 ed eseguendo l’istruzione SLEEP. Nei PIC 24, dsPIC® DSC e PIC32, la modalità Idle si ottiene eseguendo l’istruzione “PWR-SAV #1”. Tale modalità di funzionamento è preferibile quando la CPU è in attesa di un evento da parte di una periferica che non può operare in modalità Sleep. L’Idle mode può ridurre il consumo fino al 96% in numerosi dispositivi. Il Doze mode è un’altra modalità di basso consumo disponibile nei PIC24, dsPIC® DSC e PIC32; in tale modalità, il clock di sistema della CPU è ottenuto tramite un post-scaler, così la CPU funziona con un clock più basso rispetto a quello delle periferiche. Se il compito della CPU non è gravoso e le periferiche possono essere dotate di un clock più veloce, il modo Doze può essere usato per diminuire la frequenza del clock della CPU. Le modalità di funzionamento Idle e Doze possono essere impiegate quando le operazioni delle periferiche sono critiche e per la CPU si ha una funzionalità minima.
SUGGERIMENTO 14: MODALITÀ “NOP” E “IDLE”
All’esecuzione di un loop (per esempio, in attesa di un interrupt) si può porre il dispositivo in modalità Idle per disabilitare la CPU. L’interrupt della periferica sarà seguito dal wake-up del dispositivo. Il ciclo Idle consuma molto meno rispetto all’operazione di leggere costantemente la RAM o tornare indietro con l’esecuzione. Se la CPU non può essere disabilitata perché il loop richiede qualche calcolo come l’incremento di un contatore, si possono aggiungere delle istruzioni NOP al loop stesso, come mostra il Listato 1. Un’operazione NOP richiede meno corrente ad essere eseguita che leggere la RAM o ricorrere a qualche istruzione di branch. Il conteggio globale può essere aggiustato tenendo conto delle istruzioni NOPS aggiunte.
//Replace While(!_T1IF); //with Idle mode IEC0bits.T1IE=1; Idle (); // and replace: While(!_T1IF){; i++; } //with extra NOP instructions: While(!_T1IF){; i++; Nop(); Nop(); Nop(); Nop(); Nop(); }
Listato 1 |
SUGGERIMENTO 15: USO DEI BIT DI DISABILITAZIONE DEI MODULI DELLE PERIFERICHE (PMD)
I PIC24, dsPIC DSC e i PIC32 sono dotati di bit PMD che possono essere usati per disabilitare le periferiche che non vengono usate nell’applicazione. I bit PMD fanno sentire la loro influenza quando la frequenza di clock è elevata e fanno si che il consumo medio sia significativamente ridotto.
SUGGERIMENTI DI RIDUZIONE STATICA DEL CONSUMO
I suggerimenti che seguono permettono di ridurre il consumo di un dispositivo mentre è in modalità sleep; consentono di mantenere più a lungo tale modalità e di consumare meno corrente nel suo utilizzo.
SUGGERIMENTO 16: MODALITÀ “DEEP SLEEP”
In modalità Deep Sleep la CPU e tutte le periferiche (eccetto l’RTCC, DSWDT e LCD) non sono alimentate. Inoltre, in tale modalità di funzionamento, non vengono alimentate la memoria Flash e la SRAM. Ciò consente di avere il minor consumo rispetto a qualsiasi altro modo di funzionamento, con correnti tipiche inferiori a 50 nA. Per salvare dati critici per l’applicazione possono essere utilizzati quattro byte di dati nei registri DSGPRx. Nel modo Deep Sleep vengono mantenuti gli stati dei pin di I/O e l’oscillatore a 32 kHz (Timer1/SOSC). L’interrupt dell’RTCC, Ultra Low Power Wake-up, DSWDT time-out, External Interrupt 0 (INT0), MCLR o POR possono svegliare il dispositivo dalla modalità Deep Sleep. Lo svantaggio è che quando si esce dalla modalità Deep Sleep il firmware deve essere re-inizializzato. Perciò, questa viene di preferenza usata in quelle applicazioni che richiedono lunghi tempi di durata della batteria e sono caratterizzate da modalità sleep che perdurano a lungo.
SUGGERIMENTO 17: USO DEL “DEEP SLEEP WATCHDOG TIMER”
Un modo per uscire dalla modalità Sleep o Deep Sleep è di ricorrere al Watchdog Timer (WDT) o al Deep Sleep Watchdog Timer (DSWDT). Il WDT funziona in tutte le modalità eccetto la Deep Sleep; si fa perciò ricorso al DSWDT: questo consuma meno corrente del WDT e possiede un periodo di time-out più lungo rispetto a quello del WDT. Il periodo di time-out del WDT dipende dal dispositivo usato; esso può variare da pochi millisecondi a circa 2 minuti. Il DSWDT ha un periodo di time-out che può essere programmato da 2,1 ms a 25,7 giorni.
SUGGERIMENTO 18: LOW POWER TIMER1 E RTCC
I microcontrollori nanoWatt XLP dispongono di un Timer1 (SOSC sui PIC24) che richiede una corrente inferiore a 800 nA; la tecnologia nanoWatt offre un low power Timer1 che richiede 2-3 μa. Il contatore e oscillatore Timer1 può essere usato per generare interrupt in modo da avere il wake-up del dispositivo dalla modalità Sleep o altre modalità di basso consumo. Le opzioni di wake-up del TIMER1/SOSC variano a seconda del dispositivo. Molti microcontrollori nanoWatt XLP dispongono di un Real-Time Clock e Calendar (RTCC) che si può configurare per periodi di wake-up che vanno da 1 secondo a molti anni. Alcuni dei nanoWatt classici e tutti i dispositivi nanoWatt XLP possono anche utilizzare l’oscillatore Timer1/SOSC come sorgente di clock in luogo dell’oscillatore principale sui pin OSC1/OSC2.
SUGGERIMENTO 19: LAYOUT DEL LOW POWER TIMER1
Le applicazioni caratterizzate da correnti molto basse e che fanno uso del Timer1/ SOCS dei dispositivi nanoWatt e nanoWatt XLP possono richiedere considerazioni riguardanti il layout del contenitore del circuito (PCB). Il Timer1/SOCS è un oscillatore che assorbe una corrente estremamente ridotta, ciò rende alcune volte il circuito dell’oscillatore sensibile ai circuiti vicini. Il circuito dell’oscillatore (cristallo e condensatori) vanno collocati il più vicino possibile al microcontrollore e opportunamente isolati per evitare l’interazione con circuiti ad alta frequenza vicini (vedi Figura 3).
SUGGERIMENTO 20: USO DI LVD PER RILEVARE LA BATTERIA SCARICA
L’interrupt associato al Low Voltage Detect (LVD) è importante in molte applicazioni basate su batteria. È necessario per due ragioni. La prima è che molti dispositivi non possono funzionare alla massima frequenza quando la tensione di alimentazione è minima. In questi casi, l’interrupt LVD indica quando la tensione di alimentazione della batteria sta scendendo, cosicché il clock della CPU possa essere rallentato evitando errori nell’esecuzione. La seconda è di permettere alla MCU di stabilire quando la batteria è quasi scarica e di entrare così in una modalità di basso consumo per massimizzare la durata di vita della batteria stessa. L’LVD permette di implementare tali funzioni senza dover ricorrere ad ulteriori circuiti analogici per misurare il livello di carica della batteria.
SUGGERIMENTO 21: USO DEL FIFO E DEL DMA DELLE PERIFERICHE
Alcuni dispositivi possiedono periferiche con FIFO e DMA dedicati; questi ultimi possono essere impiegati per ridurre il consumo. Le periferiche che possiedono solo un buffer richiedono alla CPU il controllo per evitare l’overflow dello stesso. Con un FIFO o DMA dedicati, la CPU può passare in modalità sleep o idle, mentre il FIFO si riempie o i trasferimenti DMA si completano.
SUGGERIMENTO 22: PERIFERICA DI ULTRA LOW-POWER WAKE-UP
I dispositivi più recenti possiedono una modifica alla PORTA che crea un Ultra Low-Power Wake-Up (ULPWU). Sono stati aggiunti un piccolo dissipatore di corrente e un comparatore che permettono di utilizzare un condensatore esterno come una sorgente per creare un wake-up timer che dipende dal tempo di scarica del circuito RC esterno (vedi Figura 4).