DS3231 RTC-Modul

Ein Uhrenmodul ist ein elektronisches Modul, das in der Regel zur Messung von Uhrzeit und Datum verwendet wird. Es enthält normalerweise einen Quarzoszillator zur Erzeugung einer genauen Zeitreferenz und verfügt über einige Steuerkreise zum Einstellen und Anpassen der Uhrzeit.

Bei hohen Anforderungen an die Uhr können die Uhrmodule DS1302 und DS3231 die grundlegenden Anforderungen erfüllen. Im Folgenden stelle ich Ihnen die Definition, das Pin-Diagramm, die Parameter, Funktionen und die Programmierung des Uhrmoduls DS3231 vor.

Was ist das DS3231 RTC-Modul?

Das DS3231 RTC-Modul ist ein beliebtes Echtzeit-Uhrmodul (RTC), das häufig in Elektronikprojekten verwendet wird. Es handelt sich um ein kleines, kostengünstiges Gerät, das genaue Zeitmessungs- und Kalenderfunktionen bietet. Das DS3231-RTC-Modul basiert auf dem DS3231-Chip, einem äußerst genauen RTC mit integriertem temperaturkompensierten Quarzoszillator. Es kann Zeit- und Datumsinformationen mit einer Genauigkeit von bis zu ±2 ppm liefern.

Das DS3231 RTC-Modul wird häufig in Anwendungen wie Datenprotokollierung, Zeitstempelung und Alarmsystemen eingesetzt. Es wird auch häufig in elektronischen Geräten verwendet, die eine präzise Zeitmessung erfordern, wie z. B. Kameras, Audiorecorder und industrielle Steuerungen. Das Modul ist einfach zu bedienen und kann mit Mikrocontrollern wie Arduino und Raspberry Pi verbunden werden.

Insgesamt ist das DS3231 RTC-Modul ein zuverlässiges und genaues Uhrenmodul, das in verschiedenen elektronischen Projekten weit verbreitet ist.

DS3231 RTC-Modul-Parameter

ParameterValue
Size38mm (length), 22mm (width), 14mm (height)
Weight8g
Working voltage3.3-5.5V
Clock accuracy±2ppm from 0°C to +40°C; ±3.5ppm from 40°C to +85°C
Calendar alarm clocks2 programmable
Square wave outputYes
Real-time clock outputSeconds, minutes, hours, weekdays, dates, months and years
Leap year compensationUp to 2100
Temperature sensorBuilt-in with ±3°C accuracy
Memory chipAT24C32, 32K storage capacity, IIC bus interface
Memory chip featuresMaximum transmission speed 400KHz, address can be modified
Battery backupYes, for continuous timing
Operating temperatureCommercial: 0°C to +70°C; Industrial: -40°C to +85°C
Power consumptionLow
Other featuresAging correction register, RST output, push button reset input
UL approvedYes

DS3231-Taktgeberchip-Struktur

Der DS3231-Taktgeberchip besteht aus acht Modulen, die in vier Funktionsgruppen unterteilt sind: TCXO, Leistungssteuerung, Reset-Taste und RTC.

DS3231 RTC Chip Schematic Diagram
DS3231 RTC Chip Schematic Diagram

DS3231 TCXO

Der TCXO umfasst einen Temperatursensor, einen Oszillator und eine Steuerlogik. Der Controller liest den Ausgang des Temperatursensors auf dem Chip, ermittelt anhand einer Nachschlagetabelle die erforderliche Kapazität, fügt die Alterungskorrektur aus dem AGE-Register hinzu und stellt dann das Kapazitätsauswahlregister ein. Neue Werte, einschließlich Änderungen am AGE-Register, werden nur geladen, wenn sich die Temperatur ändert oder wenn die vom Benutzer initiierte Temperaturumwandlung abgeschlossen ist. Der Temperaturwert wird beim Einschalten der VCC-Spannung und anschließend alle 64 Sekunden ausgelesen.

DS3231 Leistungssteuerung

Die Leistungssteuerungsfunktion wird durch die temperaturkompensierte Referenzspannung (VPF) und eine Komparatorschaltung bereitgestellt, die den VCC-Pegel überwacht. Wenn VCC höher als VPF ist, wird der DS3231 über VCC mit Strom versorgt. Wenn VCC niedriger als VPF, aber höher als VBAT ist, wird der DS3231 weiterhin über VCC mit Strom versorgt. Wenn VCC niedriger als VPF und niedriger als VBAT ist, wird der DS3231 über VBAT mit Strom versorgt. Um die Batterie zu schützen, startet der Oszillator nicht, wenn VBAT zum ersten Mal an das Gerät angelegt wird, es sei denn, VCC ist geladen oder eine gültige I2C-Adresse wird in das Gerät geschrieben. Die typische Startzeit des Oszillators beträgt weniger als 1 Sekunde. Nach dem Einschalten von VCC oder dem Schreiben einer gültigen I2C-Adresse misst das Gerät einmalig die Temperatur und kalibriert den Oszillator nach etwa 2 Sekunden anhand des berechneten Korrekturwerts. Sobald der Oszillator läuft, bleibt er in Betrieb, solange die Stromversorgung (VCC oder VBAT) gültig ist. Das Gerät misst alle 64 Sekunden die Temperatur und kalibriert die Oszillatorfrequenz.

DS3231 Reset-Taste

Der DS3231 verfügt über eine Tastenschalterfunktion, die mit dem RST-Ausgangspin verbunden ist. Befindet sich der DS3231 nicht in einem Reset-Zyklus, überwacht er kontinuierlich die fallende Flanke des RST-Signals. Wird ein Flankenübergang erkannt, schließt der DS3231 die Entprellung des Schalters ab, indem er RST auf Low zieht. Nach Ablauf des internen Timers überwacht der DS3231 weiterhin das RST-Signal. Bleibt das Signal auf einem niedrigen Pegel, überwacht der DS3231 weiterhin die Signalleitung, um eine steigende Flanke zu erkennen. Sobald die Taste losgelassen wird, zwingt der DS3231 RST auf einen niedrigen Pegel und hält tRST aufrecht. RST kann auch zur Anzeige von Stromausfallalarmen verwendet werden. Wenn VCC niedriger als VPF ist, wird ein internes Stromausfallalarmsignal erzeugt und RST auf Low gezogen. Wenn der Oszillator bei geladenem VCC nicht funktioniert, wird tREC übersprungen und RST wird sofort auf High gesetzt.

DS3231 Uhr und Kalender RTC

Uhr- und Kalenderinformationen können durch Auslesen der entsprechenden Registerbytes abgerufen werden. Uhr- und Kalenderdaten können durch Schreiben der entsprechenden Registerbytes eingestellt oder initialisiert werden. Der Inhalt der Uhr- und Kalenderregister liegt im binärcodierten Dezimalformat (BCD) vor. Der DS3231 läuft im 12-Stunden- oder 24-Stunden-Modus. Das sechste Bit des Stundenregisters definiert die Auswahl des 12- oder 24-Stunden-Modus. Wenn dieses Bit hoch ist, wird der 12-Stunden-Modus ausgewählt. Im 12-Stunden-Modus ist das fünfte Bit das AM/PM-Indikatorbit, das für PM logisch hoch ist.

DS3231 Interne Register und Funktionen

Die Registeradressen des DS3231 sind 00h bis 12h und dienen zur Speicherung von Sekunden, Minuten, Stunden, Wochen, Datumsangaben und Alarmeinstellungen. Bei einem Mehrbyte-Zugriff kommt es zu einer Umschaltung, wenn die Adresse am Ende des RAM-Speicherplatzes 12h erreicht. In diesem Fall wird die Startposition 00h angefahren.

Die Zeit- und Kalenderinformationen des DS3231 werden durch Lesen der entsprechenden Register eingestellt und initialisiert. Der Benutzer-Hilfspuffer wird verwendet, um mögliche Fehler bei der Aktualisierung der internen Register zu vermeiden. Beim Lesen der Zeit- und Kalenderregister befindet sich der Benutzerpuffer in einem beliebigen START-Zustand. Oder synchronisieren Sie ihn mit dem internen Register, wenn der Registerzeiger auf Null zurückkehrt.

Die Zeitinformationen werden aus diesen Hilfsregistern gelesen, und die Uhr läuft zu diesem Zeitpunkt weiter, so dass ein erneutes Lesen der Register vermieden werden kann, wenn die Aktualisierung des Hauptregisters während des Lesevorgangs erfolgt. Am Beispiel des Steuerregisters (Adresse 0EH) kann es die Echtzeituhr, den Wecker und die Rechteckwellenausgabe steuern.

DS3231 Pinbelegung

DS3231 Pin Diagram
DS3231 Pin Diagram
Pin NameFunction
32 kHz32 kHz frequency output
VCCUsed for the DC pin of the main power supply
/INT/SQWLow-level active interrupt or square wave output
RSTReset pin
N.C.Indicates no connection; the external must be grounded
GNDGround
VBATBackup power input
SDASerial data input and output
SCLSerial clock input

DS3231 Blockdiagramm

DS3231 Block Diagram
DS3231 Block Diagram

Programm DS3231 RTC-Modul mit Arduino Uno

Erforderliche Werkzeuge:

  • Arduino Uno x1
  • DS3231 RTC-Modul x1
  • Jumper (DuPont-Leitung)

Anweisungen zur Verkabelung

Connect DS3231 RTC Module with Arduino Uno
Pin on DS3231 RTC ModulePin on Arduino Uno
SCLA5
SDAA4
VCC5V
GNDGND

Installation der RTClib-Bibliothek

Die in diesem Beispiel verwendete Bibliothek ist RTClib von Adafruit. Bitte installieren Sie diese Bibliothek zuerst.

Projekt – Bibliotheken laden – Bibliotheken verwalten – Geben Sie „RTClib” in das Suchfeld ein.

Programmierung des DS3231

Zunächst müssen Sie die soeben installierte RTClib-Bibliothek laden.

				
					#include "RTClib.h"
				
			

Danach können Sie eine DS3231-Instanz mit dem Namen rtc erstellen und die Funktion von RTC_DS3231 aufrufen.

				
					RTC_DS3231 rtc;
				
			

Die Funktionen zum Einstellen der Zeit sind rtc.adjust, zum Beispiel:

				
					rtc.adjust(DateTime(to_year, to_month, to_day, to_hours, to_minute, to_second));
				
			

Es wird verwendet, um mit rtc.now() die Zeit von DS3231 abzurufen. Die zurückgegebenen Daten sind vom Typ DateTime und enthalten die Daten für Jahr, Monat, Tag, Stunde, Minute und Sekunde, zum Beispiel:

				
					DateTime now = rtc.now();

  // Display the current time of DS3231 through the serial port output
  Serial.print(now.year(), DEC); // display the year in decimal
  Serial. print('/');
  Serial.print(now.month(), DEC);// Display the month in decimal
  Serial. print('/');
  Serial.print(now.day(), DEC);// Display the day in decimal
  Serial. print(" (");
  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  Serial. print(") ");
  Serial.print(now.hour(), DEC);// display in decimal
  Serial. print(':');
  Serial.print(now.minute(), DEC);// Display minutes in decimal
  Serial. print(':');
  Serial.print(now.second(), DEC);// Display seconds in decimal
  Serial. println();
				
			

Vollständiger Programmcode

				
					// by lingshunlab.com

// Load the library of DS3231
#include "RTClib.h"

// create rtc instance
RTC_DS3231 rtc;

String input_string; // Declare the variable input_string to store the data input by the serial port

// Declare a two-dimensional array variable daysOfTheWeek, which is used to match the corresponding week name through the index (index) of the array
char daysOfTheWeek[7][12] = {"Sunday",
                              "Monday",
                              "Tuesday",
                              "Wednesday",
                              "Thursday",
                              "Friday",
                              "Saturday"};

// get serial port data function
void GetSerialStuff(String& input_string) {
   String temp_string = ""; // Declare the variable temp_string to temporarily store the data input by the serial port
   while(Serial.available()) { // When the serial port has data, loop execution
     temp_string += (char)Serial.read(); // Combine the read serial data into the inStr variable one by one
     delay(2);
   }
   input_string = temp_string; // Assign the reference pointer variable to tempStr
}

void setup() {
   Serial.begin(9600);

   // Initialize rtc,
   if (! rtc.begin()) { // If initialization fails, then
     Serial.println("Couldn't find RTC");
     Serial. flush();
     abort(); // program stops
   }
}

void loop() {

   GetSerialStuff(input_string); // Get the data of the serial port
   if(input_string != "") { // If the serial port is not empty, then
     int to_year = input_string.substring(0, 4).toInt(); // Intercept year data from string and convert to int data type
     int to_month = input_string.substring(5, 7).toInt(); // Intercept the month data from the string and convert it to int data type
     int to_day = input_string.substring(8, 10).toInt(); // Intercept the day data from the string and convert it to int data type
     int to_hours = input_string.substring(11, 13).toInt(); // Intercept the hour data from the string and convert it to int data type
     int to_minute = input_string.substring(14, 16).toInt(); // Intercept minute data from the string and convert it to int data type
     int to_second = input_string.substring(17, 19).toInt(); // Intercept the second data from the string and convert it to int data type

     // Reset the time of the DS3231 module
     rtc.adjust(DateTime(to_year, to_month, to_day, to_hours, to_minute, to_second));
     delay(100);
   }

   // Get the time of DS3231
   DateTime now = rtc.now();

   // Display the current time of DS3231 through the serial port output
   Serial.print(now.year(), DEC); // display the year in decimal
   Serial. print('/');
   Serial.print(now.month(), DEC);// Display the month in decimal
   Serial. print('/');
   Serial.print(now.day(), DEC);// Display the day in decimal
   Serial. print(" (");
   Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
   Serial. print(") ");
   Serial.print(now.hour(), DEC);// display in decimal
   Serial. print(':');
   Serial.print(now.minute(), DEC);// Display minutes in decimal
   Serial. print(':');
   Serial.print(now.second(), DEC);// Display seconds in decimal
   Serial. println();

   // Display the temperature sensor data of DS3231 through the serial port output
   Serial. print("Temperature: ");
   Serial.print(rtc.getTemperature());
   Serial. println("C");

   delay(1000);
}
				
			

DS3231 Anwendung

  • Datenerfassungssysteme
  • Industrielle Steuerungssysteme
  • Batterie-Backup
  • Temperaturüberwachung
  • Zugangskontrollsysteme
  • Medizinische Geräte

Teilen auf:

Nach oben scrollen

Instant Quote