MODULO RTC CON DS3231

Tutorial sul Modulo Real Time Clock con Integrato DS3231 per Realizzare degli Orologi Digitali o altri Dispositivi…

 

 

 

 




 

INTRO

In commercio esistono molti integrati detti RTC ovvero real time clock, ovvero orologi a tempo reale, che misurano il tempo in modo accurato con errori bassissimi. In particolare essi contano solitamente ore, minuti e secondi oltre che la data e trasmettono questi dati con protocollo SPI o I2C. In questo tutorial verrà illustrato un modulo RTC che al suo interno ha un integrato DS3231.

Questi moduli sono a bassa costo e dispongono di un alloggiamento per batteria in modo tale che se il circuito con il microcontrollore viene spento essi possono continuare a tenere il tempo. Questi integrati possono essere usati come orologi digitali, per contare periodi di tempo lunghi, per sistemi di irrigazione o altri scopi se abbinato ad un microcontrollore come PIC18 o PIC16 oppure Arduino.

In questo tutorial verranno illustrate le caratteristiche dell’integrato e le connessioni del modulo.

 




 

L’INTEGRATO DS3231

Questo integrato è un RTC estremamente accurato che comunica con protocollo I2C e che dispone di un oscillatore a cristallo di quarzo integrato, con compensazione della temperatura per evitare che la frequenza vari con la temperatura.  L’integrato ha due diversi pin per l’alimentazione, una per l’alimentazione generale l’altro per l’alimentazione a batteria utile quando manca l’altra fonte di alimentazione. L’integrato mantiene ora, minuti e secondi oltre che la data con la modifica per i mesi che durano 30 o 28 giorni e anche la modifica per anni bisestili con validità fino al 2100 (oltre al 2100 funzionerà ma non aggiusterà la data per gli anni bisestili).

La comunicazione è I2C a 400KHz. Lo schema di connessione è il seguente:

Tutte le resistenze usate sono resistenze di pull-up visto che le linee sono tutte open collector. I valori di RPU dipendono dalla dimensione della linea e in particolare dalla sua capacità. Le altre due resistenze di pull-up possono essere di valore fisso interno i 2.2KOhm. RPU deve essere di 820 Ohm per linee di comunicazione molto lunghe, mentre per linee corte basta anche un valore di 2.2KOhm.

La batteria può essere di qualsiasi tipo (Litio, alcaline, Ni-Cd) l’importante che il valore massimo non sia superiore a 5.5V. La tensione VCC al massimo deve essere 5.5V mentre il valore minimo di tutte e due le tensioni, per garantire il funzionamento è 2.3V.

Quando il bus I2C è attivo l’integrato assorbe 200uA con VCC=3.6V e al massimo 300uA con VCC=5.5V. Se il bus I2C è inattivo allora l’integrato è in standby e assorbe 110uA o al massimo 170uA. Con la batteria invece i consumi vanno da un minimo di 70uA ad un massimo di 150uA facendo durare una batteria al litio da 2200mA circa tre anni.

Il contatto RST avverte se la tensione della batteria è troppo bassa e fornisce un livello logico basso quando la tensione è minore a 2.5V circa. SDA e SCL sono i pin della comunicazione I2C, il pin 32KHz fornisce un clock con questo valore di frequenza mentre INT/SQQ è il pin di interrupt, infatti l’integrato può avere due allarmi settabili, quando si raggiunge l’orario dell’allarme va a livello basso.

 

COMUNICAZIONE CON L’INTEGRATO

Per le operazioni di scrittura e lettura dell’integrato DS3231 vi sono dei registri ognuno codificato con un indirizzo:

Il primo registro contiene i secondi, quelli successivi in ordine successivo poi si hanno minuti, ore, giorni, mesi e anni. Dal registro 7 al registro 10 si hanno i secondi, minuti, ore giorni e date del primo allarme mentre dal registro 11 al 13 si hanno minuti ore giorni e data del secondo allarme.

Il registro 0Eh ovvero il registro 14 è lo special-purpose registeters con i bit che hanno le seguenti funzioni:

  • EOSC che abilita il clock se settato a 0 e lo spegne se settato a 1.
  • BBSQW se settato a 1 abilita l’onda quadra sul pin INT/SQQ se VCC è minore di 2.5V, se settato a 1 invece fa si che sul pin INT/SQQ vi sia un livello alto.
  • CONV abilita la conversione del sensore di temperatura interno all’integrato e quindi permette anche di misurare la temperatura. Si avvia la conversione settando questo bit a 1.
  • RS2/RS1 sono i bit per settare la frequenza dell’onda quadra su INT/SQQ e si avrà 1Hz quando RS1=0, RS2=0, 1.024KHz se RS1=1, RS2=0, 4.096KHz se RS1=0, RS2=1 e infine 8.192KHz se RS1=1, RS2=1.
  • INTCN controlla il pin di interrupt, se settato a 1 allora si avrà un segnale basso quando il tempo contato è uguale a uno dei due allarmi, se settato a 0 allora questo pin non funziona come interrupt.
  • A2IE e A1IE abilitano gli allarmi 1 e 2 sono settati a valore logico 1.

 

Il registro 0Fh è il registro stato e i bit hanno la seguente funzione:

  • OSF se settato a 1 significa che l’oscillatore è stoppato o è stato stoppato quindi l’orario potrebbe essere non valido. Un 1 logico potrebbe essere causato da una tensione troppo bassa, la modalità i funzionamento è stato impostata con oscillatore spento, rumori o perdite dell’oscillatore.
  • EN32KHZ controlla lo stato del pin di clock, se settato a 1 si ha il clock in uscita, se 0 invece il pin di clock sta sempre a livello logico alto.
  • BSY se settato a 1 indica che l’integrato sta facendo la calibrazione del clock.
  • A2F e A1F sono i flag che se settati indicano che vi è stato l’allarme.

 

Il registro 10h serve per la calibrazione del clock, il bit sette indica se sottrare o sommare capacità all’array del clock e si sommano o sottraggono un numero di capacità indicato dal numero scritto negli altri bit. Questo registro calibra il clock per avere il minore errore possibile.

I registri 11h e 12h contengono il valore convertito della temperatura.

L’allarme può essere settato allo scattare di ogni secondo, solo sui secondi, su secondi e minuti, su secondi minuti e ore, su secondi minuti ore e data, oppure su secondi minuti ore e giorno. Per settare quando avviene l’allarme bisogna settare i bit 7 dei registri degli allarmi secondo la seguente tabella.

Come detto in precedenza la comunicazione è I2C che ha il seguente timing:

Il bus è libero se entrambi sono a livello alto e la comunicazione inizia sul fronte di discesa. Poi prima viene inviato l’indirizzo del registro, poi vi è un segnale R/W che indica se si scrive nel registro o si legge da esso, poi vi è un ACK di controllo e infine il dato o i dati con un ACK alla fine di ognuno di esso.

 




 

MODULO RTC

Il modulo ha il seguente aspetto:

Il modulo porta all’esterno tutti i pin dell’integrato DS3231 e oltre a questo integrato vi sono altri componenti. Vi è un LED ed una resistenza di protezione per segnalare la presenza della tensione di alimentazione, due condensatori sulla tensione di alimentazione come filtro per i rumori e le resistenze di pull-up da 4.7KOhm per le linee SDA, SCL e 32KHz.

Il porta batteria è per batterie di modello CR2032 o anche LIR2032 al litio da 3.6V.

Altre all’integrato DS3231 vi è una memoria EEPROM da 32Kbit con sigla AT24C32 il cui pinout è il seguente:

Gli indirizzi A0, A1 e A2 sono gli indirizzi della EEPROM, non della cella di memoria, servono per abilitare o no il chip, questi indirizzi non sono subito accessibili visto che non ci sono i pin esterni ma vi si possono saldare tre pin sulle piazzole stagnate denominate A0, A1 e A2. Anche questo integrato comunica con I2C e usa la stessa linea dell’altro integrato. WP viene mantenuto a livello logico basso perché non si vuole nessuna protezione di scrittura, questo pin non è accessibile se non con una modifica non semplice da fare.

Questa memoria non ha uno scopo ben preciso ma può essere usata come la si vuole all’interno del progetto, ad esempio per memorizzare la temperatura rilevata dal DS3231 o per memorizzare una data particolare, oppure può essere usata per dati che non provengono dal DS3231.




 

[Voti Totali: 0 Media Voti: 0]
Segui la Nostra Pagina Facebook: Facebook

4 pensieri su “MODULO RTC CON DS3231

  1. Salve, bellissima guida e spiegata molto bene…
    Volevo sapere come programmare l’allarme del modulo RTC per far mandare un’impulso e svegliare Arduino/Raspberry.
    Su come svegliarli ho già risolto, mi serviva poter programmare l’rtc per settare il suo allarme interno ogni ora.
    Grazie in anrianticipo

    • Salve Pietro.
      bisogna settare i registri da 07h a 0Ah con il valore di data e ora quando vuoi che la “sveglia suoni” poi configuri “alarm 1 register” in modo tale da farlo suonare ogni volta che i secondi combaciano con quello che tu hai scritto nei registri, o secondi e minuti ecc ecc ad esempio scrivi in 07h il valore di 30 secondi e nel “alarm 1 register” A1M4:A1M1 scrivi 1110 dunque il modulo ti da un impulso ogni minuto quando i secondi saranno 30

  2. Salve. Lì dove vi è scritto che “Il porta batteria è per batterie di modello CR2032” andrebbe fatta una correzione. Il modulo è progettato per batterie ricaricabili. Inserendo la CR2032, che non è ricaricabile, si può arrivare a un surriscaldamento della stessa. Volendo usare le CR2032, va dissaldato il diodo alla sinistra della resistenza 201. Oppure va interrotta la pista. Le batterie ricaricabili sono molto più difficili da trovare

    • Ciao Antonio,
      non ci avevo fatto caso, sul sito del venditore non dice niente nello specifico e ai tempi di questo articolo non ero riuscito a trovare uno schema del modulo.

      La tua osservazione è molto interessante, non capisco perchè abbiamo inserito però quel diodo con la resistenza, all’inizio avevo pensato ad una corrente di mantenimento per prevenire l’autoscarica, ma una corrente di circa 6.5mA è elevata.

      ho provato a cercare se fosse possibili caricarle ma nulla. in ogni caso ho trovato un documento che dice che è possibile avere una corrente inversa nella batteria fino ad un massimo di 10mA.

      Inserirò il tuo suggerimento nell’articolo il prima possibile, per ora ti ringrazio e ti lascio il link al documento sopracitato (http://www.maxell.com.tw/images/uploads/2014/10/Cy_CR_13e.pdf pagina 2)

Rispondi a Antonio Annulla risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *