Den Arduino Quarztakt auf 3ppm genau bestimmen mit der DS3231 RTC

Der Arduino Uno hat einen 16MHz Quarz für den Prozessortakt.

Diese Quarzfrequenz ist von der Temperatur abhängig, typisch +-30ppm oder 480 Hz über normale Temperaturen und Herstellungsbedingt fehlerhaft in der Größenordnung von typisch +-30ppm oder 480Hz. Das ergibt zusammen einen Fehler von +-960Hz oder 60ppm. Bei einer Frequenzmessung kann das zu großen Fehlern führen sodaß die 4. Stelle schon falsch sein kann. Bessere Angaben liefert das Datenblatt vom Quarz oder der Aufdruck.

Das läßt sich verbessern auf unter 3ppm oder 48 Hz Fehler mit der RTC DS3231. Dazu wird der 1Hz Ausgang des DS3231 verwendet um bei steigender Flanke einen Interrupt im Arduino auszulösen. Bei jedem 4. Interrupt (4 Sekunden) wird die vergangene Prozessorzeit mit der Funktion micros() in Mikrosekunden ermittelt. Daraus kann nun der Prozessortakt genauer bestimmt werden.

Die aktuelle Quarzfrequenz wird alle 4 Sekunden ermittelt und seriell ausgegeben. Sie kann zur Verbesserung von Zeit und Frequenzmessungen so in anderen Programmen eingesetzt werden. Durch die Interrupt Steuerung läuft sie losgelöst von einem anderen Hauptprogramm.

Die Verkabelung ist wie hier beschrieben.
Plus eine Leitung vom SQW Ausgang an den Digital PIN2 des Arduino Uno für den Interrupt 0. Bei anderen Platinen kann der Interrupt 0 an anderen Pins liegen, siehe hier.

Hier das Programm:

// Die Mikrosekunden zählen und den Arduino Quarz Takt daraus ermitteln
// RTC DS3231 SQW Ausgang auf 1 Hz einstellen mit +-2ppm.
// Der 1Hz Takt löst dann einen Messinterrupt aus.
//
// Bei 16 MHz Pozessortakt sind 2ppm RTC Fehler +-32Hz.
//
// micros() zählt auf 4ms genau das sind 4ppm bei 1 Sekunde und nur 
// noch 1ppm bei 4 Sekunden langen Messungen oder +-16Hz Fehler.
//
// Der Messfehler liegt bei 3ppm oder +-48Hz für ein 16MHz Quarz.
//
// Matthias Busse 10.11.2016 Version 1.0

#include "Wire.h"
#define DS3231_ADDRESSE 0x68
#define messungSekunden 4 // eine Messung dauert 4 Sekunden

unsigned long microsAlt=0, microsNeu=0;
int count;

void setup() {
  Wire.begin();
  Serial.begin(38400);
  sqw1HzDS3231();
  pinMode(2, INPUT); // Pin 2 ist INT0
  attachInterrupt(0, interruptRoutine, RISING); // Interrupt 0 auf steigende Flanke
}

void loop() {
  // nix zu tun
}

void interruptRoutine() {
  count++;
  if(count < messungSekunden) {
   return;
  }
  else { // nur jede n. Sekunde messen
    microsNeu=micros();
    Serial.print(" Quarz: ");
    Serial.print(16000000.0 * (microsNeu-microsAlt) / 1000000.0 / messungSekunden);
    Serial.println(" MHz");
    microsAlt=microsNeu;
    count=0;
  }
}

void sqw1HzDS3231() {
  // 1 Hz Rechteck ausgeben am SQW Ausgang  
  Wire.beginTransmission(DS3231_ADDRESSE);
  Wire.write(0x0e); // DS3231 Register zu 0Eh
  Wire.write(B01100011); // Register schreiben
  Wire.endTransmission();
}

Verwendet wurden:
Arduino Uno
Arduino Software 1.6.5
RTC DS3231 ZS-042

Dadurch läßt sich z.B. dieser Frequenzzähler deutlich in der Genauigkeit steigern.

Die erste Messung beim Start der Schaltung ist falsch, da hier die Zeit zwischen 2 Interrupts noch nicht richtig bestimmt werden kann. Diese erste Messung sollte bei einem zukünftigen Programm ausgeklammert werden.

Weitere Beiträge zum DS3231:
Von der RTC DS3231 die Temperatur auslesen mit dem Arduino
Rechteck 1Hz (+-2ppm) ausgeben mit dem RTC DS3231 und dem Arduino
Die Uhrzeit des RTC DS3231 Modul vom Arduino einstellen
Die Uhrzeit des RTC DS3231 Modul vom Arduino auslesen

von Matthias Busse

5 Gedanken zu „Den Arduino Quarztakt auf 3ppm genau bestimmen mit der DS3231 RTC

  1. Pingback: Von der RTC DS3231 die Temperatur auslesen mit dem Arduino | Shelvin – Elektronik ausprobiert und erläutert

  2. Pingback: Rechteck 1Hz (+-2ppm) ausgeben mit dem RTC DS3231 und dem Arduino | Shelvin – Elektronik ausprobiert und erläutert

  3. Pingback: Die Uhrzeit des RTC DS3231 Modul vom Arduino einstellen | Shelvin – Elektronik ausprobiert und erläutert

  4. Pingback: Die Uhrzeit des RTC DS3231 Modul vom Arduino auslesen | Shelvin – Elektronik ausprobiert und erläutert

  5. Pingback: Den Frequenzzähler mit LCD Display auf der Platine aufgebaut. | Shelvin – Elektronik ausprobiert und erläutert

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.