Svenska ElektronikForumet
https://elektronikforumet.com/forum/

Min första Arduino - test av DS3231
https://elektronikforumet.com/forum/viewtopic.php?f=3&t=94377

Författare:  rvl [ 01.29 2019-03-04 ]
Inläggsrubrik:  Min första Arduino - test av DS3231

Åkte till Kjell och köpte en Kjell Academy klon av Arduino Uno R3 samt en RTC breakoutmodul med DS3231. Den senare var det ont om i Stockholmsbutikerna, men jag lyckades reservera en, med bara ett absolut minimum av signalerna anslutna. Den hade dock batteri(?) till skillnad från modulen som jag hade föredragit.

Använd pollande testkod hittills (får själv försöka löda in mig på 32kHz och/eller fyrkantsvågpinnen, om jag vill åt dem):
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1. // Include the libraries
  2. #include <RtcDS3231.h>
  3. //Open the Library Manager and search for "Rtc by Makuna" and install
  4.  
  5. #include <Wire.h>
  6.  
  7. // Create new RTC module
  8. RtcDS3231<TwoWire> Rtc(Wire);
  9.  
  10. // Create variables for time
  11. byte hours;
  12. byte minutes;
  13. byte seconds;
  14. byte old;
  15. byte oldM;
  16. uint16_t year;
  17. byte month;
  18. byte day;
  19.  
  20. void setup() {
  21.   // put your setup code here, to run once:
  22.   Serial.begin(115200);
  23.   Rtc.Begin();
  24.  
  25.   // Update RTC module time to compilation time
  26.   RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
  27.   compiled += 7;  //transfer time
  28.   //Already set, comment this out:
  29.   //Rtc.SetDateTime(compiled);
  30.   //set 2019-03-03 ~15 EET
  31.  
  32.   old = 0;
  33.   oldM = 0;
  34. }
  35.  
  36. void loop() {
  37.   // put your main code here, to run repeatedly:
  38.   delay(10);
  39.   updateTime();
  40.   if(minutes != oldM){
  41.     printDate();
  42.   }
  43.   else if(seconds != old){
  44.     printTime();
  45.   }
  46. }
  47.  
  48. void updateTime() {
  49.    RtcDateTime now = Rtc.GetDateTime();
  50.    hours = now.Hour();
  51.    minutes = now.Minute();
  52.    seconds = now.Second();
  53.    year = now.Year();
  54.    month = now.Month();
  55.    day = now.Day();
  56. }
  57.  
  58. #define countof(a) (sizeof(a) / sizeof(a[0]))
  59.  
  60. void printTime(){
  61.     char timestring[9];
  62.     snprintf_P(timestring,
  63.             countof(timestring),
  64.             PSTR("%02u:%02u:%02u"),
  65.             hours,
  66.             minutes,
  67.             seconds );
  68.     Serial.println(timestring);
  69.     old = seconds;
  70. }
  71.  
  72. void printDate(){
  73.     oldM = minutes;
  74.     char datestring[12];
  75.     snprintf_P(datestring,
  76.             countof(datestring),
  77.             PSTR("%04u-%02u-%02u "),
  78.             year,
  79.             month,
  80.             day );
  81.     Serial.print(datestring);
  82.     printTemperature();
  83.     printTime();
  84. }
  85.  
  86. void printTemperature(){
  87.     RtcTemperature temp = Rtc.GetTemperature();
  88.     Serial.print(temp.AsFloatDegC());
  89.     Serial.println("°C");
  90. }
  91.  


På datorn (vars klocka jag inte litar på alltför mycket, men som regelbundet synkas från nätet) prövade jag att sätta tidsstämplar med python:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1. import serial
  2. import time
  3. import datetime
  4.  
  5. ser = serial.Serial(
  6.     port='COM18',\
  7.     baudrate=115200,\
  8.     parity=serial.PARITY_NONE,\
  9.     stopbits=serial.STOPBITS_ONE,\
  10.     bytesize=serial.EIGHTBITS,\
  11.         timeout=0)
  12.  
  13. print("connected to: " + ser.portstr)
  14.  
  15. size = 10
  16. while (size > 0):
  17.     line = ser.readline()
  18.     if(line!=""):
  19.         timestamp = str(time.time())
  20.         print timestamp + ": " + line
  21.         size -= 1
  22.  
  23. ser.close()


Resultaten ser hyfsade ut tillsvidare. Får ta till bättre metoder eller vänta längre, för att kunna uttala mig hur klockan ligger i frekvens.

Inledande "mätning":
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
connected to: COM18
1551640907.06: 2019-03-03 26.50┬║C

1551640907.06: 21:21:46
1551640907.06:

1551640907.18: 21:21:47

1551640908.19: 21:21:48

1551640909.18: 21:21:4
1551640909.19: 9

1551640910.18: 21:21:50

1551640911.19: 21:21:51

1551640912.19: 21:21:52

...och nästan fem timmar senare:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
connected to: COM18
1551658807.0: 2019-03-04 26.25┬░C

1551658807.0: 02:20:06

1551658807.23: 02:20:07

1551658808.22: 02:20:08

1551658809.23: 02:20:09

1551658810.23: 0
1551658810.23: 2:20:10

1551658811.23: 02:20:11

1551658812.22: 02:20:12

1551658813.23: 02:20:13

Som väl blir ca 2 ppm, men vilken del av det datorn står för låter jag tillsvidare vara osagt.

Projekt? ...tja vi får se hur det utvecklar sig, om jag deltar i Kjells tävling. Ligger här i "öppen tråd" oavsett.

Författare:  rvl [ 21.00 2019-03-04 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Så har klockan gått ett dygn. 0.19 s på 24 h => +2.2 ppm eller ~70 s / år.
Specen säger +/- 2 ppm mellan 0°C och 40°C, så det "duger" om man avrundar. Fortfarande påstår jag inte att den här datorns klocka är rätt, men nu tog jag med den inbyggda GPS:n som dock inte hade fix, men trackade ett par satelliter litet tidigare och hade haft fix när jag öppnade fönstret ännu tidigare.

Dagens officiella sampel:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
connected to: COM6
1551727204.76: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1551727205.76: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1551727206.76: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1551727207.77: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1551727208.77: $GPGSA,A,1,,,,,,,,,,,,,,,*1E

connected to: COM18
1551727213.95: 2019-03-04 26.00┬░C

1551727213.95: 21:20:13

1551727214.37: 21:20:14

1551727215.38: 21:20:15

1551727216.37: 21:20:16

1551727217.37: 21:20:17
1551727217.37:

1551727218.38: 21:20:
1551727218.38: 18

1551727219.38: 21:20:19

connected to: COM6
1551727224.77: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1551727225.77: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1551727226.77: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1551727227.77: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1551727228.77: $GPGSA,A,1,,,,,,,,,,,,,,,*1E

Författare:  rvl [ 22.39 2019-03-05 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Senaste bud: +3 ppm jämfört med gårdagens mätning: 1000000 * ((.70-.37)-(.82-.77))/(25.33*3600)
Blir snart dags att använda bättre referens, än den här datorn, men tillsvidare har jag varit lat.
Bilaga:
DS3231_1.jpg
Modulen i närbild.

Dagens data:
connected to: COM6
1551818559874: 204239.8
1551818560827: $GPGSA,A,3,07,13,27,30,,,,,,,,,326.0,178.1,273.0*3F
1551818561827: $GPGSA,A,3,07,13,27,30,,,,,,,,,666.6,666.6,666.6*31
1551818562825: $GPGSA,A,3,07,13,27,30,,,,,,,,,338.2,184.8,283.2*35
1551818563826: $GPGSA,A,3,07,13,27,30,,,,,,,,,666.6,666.6,666.6*31
1551818564826: $GPGSA,A,3,13,27,30,,,,,,,,,,666.6,666.6,666.6*36

connected to: COM18
1551818577520: 2019-
1551818577524: 03-05 22.75┬░C
1551818577525: 22:42:56
1551818577700: 22:42:57
1551818578696: 22:42:58
1551818578700:
1551818579703: 22:42:
1551818579707: 59
1551818580703: 2019-03-05 23.00┬░C
1551818580704: 22:43:00

connected to: COM6
1551818587847: 204307.8
1551818588824: $GPGSA,A,3,07,13,27,30,,,,,,,,,614.4,336.9,513.8*36
1551818589828: $GPGSA,A,3,07,13,27,30,,,,,,,,,639.4,350.6,534.7*3C
1551818590824: $GPGSA,A,3,07,13,27,30,,,,,,,,,655.0,359.2,547.7*3B
1551818591824: $GPGSA,A,3,07,13,27,30,,,,,,,,,685.8,376.2,573.5*36
1551818592824: $GPGSA,A,3,07,13,27,30,,,,,,,,,709.6,389.3,593.3*34

Författare:  rvl [ 23.03 2019-03-06 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Insåg att förtecknet blev fel, minus ska det va när modulen går för långsamt, eftersom datorns tidsstämplar ökar jämfört med modulens sekundomslag.

Dagens rådata:
connected to: COM6
1551908686833: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1551908686878: 214446.8
1551908687832: $GPGSA,A,3,08,13,15,,,,,,,,,,666.6,666.6,666.6*3C
1551908688832: $GPGSA,A,3,08,13,15,,,,,,,,,,666.6,666.6,666.6*3C
1551908689830: $GPGSA,A,3,08,15,,,,,,,,,,,666.6,666.6,666.6*3E
1551908690837: $GPGSA,A,3,08,15,,,,,,,,,,,666.6,666.6,666.6*3E
1551908691830: $GPGSA,A,3,08,15,,,,,,,,,,,666.6,666.6,666.6*3E
1551908692830: $GPGSA,A,3,08,15,30,,,,,,,,,,666.6,666.6,666.6*3D
1551908693837: $GPGSA,A,3,08,15,30,,,,,,,,,,666.6,666.6,666.6*3D
1551908694831: $GPGSA,A,3,08,15,30,,,,,,,,,,666.6,666.6,666.6*3D
1551908695831: $GPGSA,A,3,08,15,30,,,,,,,,,,666.6,666.6,666.6*3D

connected to: COM18
1551908707614: 2019-03-06 24.75┬░C
1551908707617:
1551908707618: 23:45:06
1551908707970: 23:45:07
1551908708965: 23:45:08
1551908709973: 23:45:09
1551908709976:
1551908710972: 23:45:10
1551908711967: 23:45:11
1551908712975: 23:45:12

connected to: COM6
1551908719882: 214519.8
1551908720838: $GPGSA,A,3,08,15,,,,,,,,,,,666.6,666.6,666.6*3E
1551908721833: $GPGSA,A,3,08,15,,,,,,,,,,,666.6,666.6,666.6*3E
1551908723833: $GPGSA,A,3,08,15,,,,,,,,,,,666.6,666.6,666.6*3E
1551908725837: $GPGSA,A,3,08,15,27,30,,,,,,,,,365.7,221.7,290.8*3A
1551908727834: $GPGSA,A,3,08,13,15,27,30,,,,,,,,16.8,9.8,13.6*30
1551908729832: $GPGSA,A,3,08,13,15,27,30,,,,,,,,16.8,9.9,13.6*31
1551908731832: $GPGSA,A,3,08,13,15,30,,,,,,,,,16.8,9.9,13.6*34
1551908732834: $GPGSA,A,3,08,13,15,30,,,,,,,,,666.6,666.6,666.6*3F
1551908733833: $GPGSA,A,3,08,15,30,,,,,,,,,,666.6,666.6,666.6*3D
1551908734835: $GPGSA,A,3,08,15,30,,,,,,,,,,666.6,666.6,666.6*3D


Tar en till i samma inlägg, så blir det inte så mycket spammande.
connected to: COM6
1551969614886: 144014.8
1551969615832: $GPGSA,A,3,03,14,19,22,32,,,,,,,,12.9,7.0,10.8*39
1551969616827: $GPGSA,A,3,03,14,19,22,32,,,,,,,,12.9,7.0,10.8*39
1551969617832: $GPGSA,A,3,03,14,19,22,32,,,,,,,,12.9,7.0,10.8*39
1551969618832: $GPGSA,A,3,03,14,19,22,32,,,,,,,,12.9,7.0,10.8*39
1551969619832: $GPGSA,A,3,03,14,19,22,32,,,,,,,,12.9,7.0,10.8*39
1551969620828: $GPGSA,A,3,03,14,19,22,32,,,,,,,,12.9,7.0,10.8*39
1551969621833: $GPGSA,A,3,03,14,19,32,,,,,,,,,12.9,7.0,10.8*39
1551969622833: $GPGSA,A,3,03,14,19,32,,,,,,,,,14.1,7.3,12.1*3F
1551969623832: $GPGSA,A,3,03,14,19,32,,,,,,,,,14.1,7.3,12.1*3F
1551969624828: $GPGSA,A,3,03,14,19,32,,,,,,,,,14.1,7.3,12.1*3F

connected to: COM18
1551969628996: 2019-03-07 25.50┬░C
1551969628997: 16:40:27
1551969629139: 16:40:28
1551969630147: 16:40:29
1551969631147: 16:40:30
1551969632142: 16:40:31
1551969633138: 16:40:32
1551969634145: 16:40:33
1551969635145: 16:40:34
1551969636140: 16:40:35

connected to: COM6
1551969639858: 144039.8
1551969640829: $GPGSA,A,3,03,12,14,19,22,24,32,,,,,,2.5,1.3,2.1*3E
1551969641829: $GPGSA,A,3,03,12,14,19,22,24,32,,,,,,2.6,1.3,2.3*3F
1551969642829: $GPGSA,A,3,03,12,14,19,24,32,,,,,,,2.6,1.3,2.3*3F
1551969643830: $GPGSA,A,3,03,12,14,19,24,32,,,,,,,2.6,1.3,2.3*3F
1551969644838: $GPGSA,A,3,03,12,14,19,24,32,,,,,,,2.6,1.3,2.3*3F
1551969645830: $GPGSA,A,3,03,12,14,19,24,29,32,,,,,,1.8,1.0,1.5*3F
1551969646829: $GPGSA,A,3,03,12,14,19,24,29,32,,,,,,1.9,1.1,1.5*3F
1551969647834: $GPGSA,A,3,03,12,19,24,29,32,,,,,,,1.9,1.1,1.5*3A
1551969648828: $GPGSA,A,3,03,12,19,24,29,32,,,,,,,1.9,1.1,1.5*3A
1551969649828: $GPGSA,A,3,03,12,19,24,29,32,,,,,,,1.9,1.1,1.5*3A


Enligt data där GPS är med, så ser datorklockan tillräckligt tillförlitlig ut för hundradelar, förutsatt att internetsladden är kopplad, annars sticker den i väg minst ett par sekunder över en natt. Mer upplösnig än så är inte meningsfull just nu när Arduinon samplar klockam med ca 100 Hz.

RTC frekvensfel uträknat från hela tidsperioden med data: -2.89 ppm ( 1000000*(0.18-1.13)/(1551969632-1551640909) )
Börjar bli dags att snegla på kretsens Aging Offset register, som ska kunna kalibrera i steg motsvarande 0.1 ppm, men jag är rädd att det kan kosta större fel, om temperaturen blir långt från de ca 25°C där jag ligger nu. Ett annat sätt är att köra korrigeringar i mjukvara, men hur som helst speccade +/-2ppm borde jag ha fått kunna vänta mig.

Författare:  rvl [ 00.04 2019-03-08 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Då ska vi se om klockan börjar gasa på litet mer än nödvändigt, när jag satte Ageing Offset till -32.

Utgångsläge, med nya inställningen:
connected to: COM6
1551999144898: 225224.8
1551999145848: $GPGSA,A,3,08,15,27,28,32,,,,,,,,3.5,2.0,2.9*3F
1551999146849: $GPGSA,A,3,08,15,27,28,32,,,,,,,,3.5,2.0,2.9*3F
1551999147849: $GPGSA,A,3,08,15,27,32,,,,,,,,,3.5,2.0,2.9*35
1551999148849: $GPGSA,A,3,08,15,27,32,,,,,,,,,11.1,6.5,9.0*01
1551999149849: $GPGSA,A,3,08,15,27,32,,,,,,,,,666.6,666.6,666.6*3A
1551999150847: $GPGSA,A,3,15,27,28,32,,,,,,,,,4.0,2.1,3.4*38
1551999151848: $GPGSA,A,3,15,27,28,32,,,,,,,,,4.0,2.1,3.4*38
1551999152843: $GPGSA,A,3,15,27,28,32,,,,,,,,,4.0,2.1,3.4*38
1551999153843: $GPGSA,A,3,15,27,28,32,,,,,,,,,4.0,2.1,3.4*38
1551999154844: $GPGSA,A,3,15,27,28,32,,,,,,,,,4.0,2.1,3.4*38

connected to: COM18
1551999161750: 2019-03-08 26.25┬░
1551999161753: C
1551999161754: 00:52:40
1551999161755: The Aging Offset is set as: -32
1551999162241: 00:52:41
1551999163236: 00:52:42
1551999164232: 00:52:43
1551999165231: 00:52:44
1551999166239: 00:52:45
1551999167234: 00:52:46

connected to: COM6
1551999171900: 225251.8
1551999172848: $GPGSA,A,3,15,20,27,32,,,,,,,,,3.3,2.3,2.3*30
1551999173847: $GPGSA,A,3,15,20,27,32,,,,,,,,,3.3,2.3,2.3*30
1551999174846: $GPGSA,A,3,15,20,27,32,,,,,,,,,3.3,2.3,2.3*30
1551999175847: $GPGSA,A,3,15,20,27,32,,,,,,,,,3.3,2.3,2.3*30
1551999176847: $GPGSA,A,3,15,20,27,32,,,,,,,,,3.3,2.3,2.3*30
1551999177847: $GPGSA,A,3,15,27,32,,,,,,,,,,666.6,666.6,666.6*32
1551999178848: $GPGSA,A,3,15,27,32,,,,,,,,,,666.6,666.6,666.6*32
1551999179847: $GPGSA,A,3,15,27,32,,,,,,,,,,666.6,666.6,666.6*32
1551999180845: $GPGSA,A,3,15,27,32,,,,,,,,,,666.6,666.6,666.6*32
1551999181847: $GPGSA,A,3,27,32,,,,,,,,,,,666.6,666.6,666.6*36


Följande dag:
connected to: COM6
1552041866399: 104426.3
1552041867380: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552041868379: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552041869387: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552041870379: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552041871397: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552041872378: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552041873381: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552041874379: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552041875378: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552041876380: $GPGSA,A,1,,,,,,,,,,,,,,,*1E

connected to: COM18
1552041885063: 2019-03-08 25.50┬░C
1552041885063: 12:44:43
1552041885064: The Aging Off
1552041885066: set is set as: -32
1552041885242: 12:44:44
1552041886237: 12:44:45
1552041887232: 12:44:46
1552041888240: 12:44:4
1552041888244: 7
1552041889239: 12:44:48

connected to: COM6
1552041892396: 104451.3
1552041893385: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552041894378: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552041895379: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552041896379: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552041897378: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552041898377: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552041899377: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552041900376: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552041901377: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552041902377: $GPGSA,A,1,,,,,,,,,,,,,,,*1E


Då ska vi tro att den nu ligger på +0.72 ppm ( 1000 * ((1231 - (846.9-800)) - (1232 - (378.55-300))) / (1552041887 - 1551999165) )

...Nytt bud: +0.76 ppm ( 1000 * ((1231 - (846.9-800)) - (1143 - (324.11-300))) / (1552084807.143 - 1551999165) )
Från:
connected to: COM6
1552084786369: 223946.3
1552084787321: $GPGSA,A,3,11,20,27,32,,,,,,,,,2.7,1.5,2.2*35
1552084788326: $GPGSA,A,3,11,20,27,32,,,,,,,,,2.7,1.5,2.2*35
1552084789324: $GPGSA,A,3,11,20,27,32,,,,,,,,,2.7,1.5,2.2*35
1552084790323: $GPGSA,A,3,11,20,27,32,,,,,,,,,666.6,666.6,666.6*34
1552084791323: $GPGSA,A,3,11,20,27,32,,,,,,,,,666.6,666.6,666.6*34
1552084792322: $GPGSA,A,3,11,20,32,,,,,,,,,,666.6,666.6,666.6*31
1552084793323: $GPGSA,A,3,20,32,,,,,,,,,,,666.6,666.6,666.6*31
1552084794324: $GPGSA,A,3,20,32,,,,,,,,,,,666.6,666.6,666.6*31
1552084795322: $GPGSA,A,3,11,20,32,,,,,,,,,,666.6,666.6,666.6*31
1552084796326: $GPGSA,A,3,11,20,32,,,,,,,,,,666.6,666.6,666.6*31

connected to: COM18
1552084801827: 2019-03-09 24.75┬░C
1552084801828: 00:40:00
1552084801829: The Aging Offs
1552084801831: et is set as: -32
1552084802150: 00:40:01
1552084803145: 00:40:02
1552084804145: 00:40:03
1552084805152: 00:40:04
1552084806148: 00:40:05
1552084807143: 00:40:06
1552084808151: 00:40:07
1552084809151: 00:40:08
1552084810146: 00:40:09
1552084811154: 00:40:10
1552084812149: 00:40:11
1552084813149: 00:40:12
1552084814144: 00:40:13
1552084815152: 00:40:14
1552084816147: 00:40:15
1552084817146: 00:40:16

connected to: COM6
1552084821349: 224021.3
1552084822323: $GPGSA,A,3,08,11,15,28,32,,,,,,,,2.5,1.2,2.2*31
1552084823324: $GPGSA,A,3,08,11,15,28,32,,,,,,,,3.1,2.0,2.3*34
1552084824324: $GPGSA,A,3,08,11,15,28,32,,,,,,,,666.6,666.6,666.6*35
1552084825324: $GPGSA,A,3,08,11,28,32,,,,,,,,,666.6,666.6,666.6*31
1552084826329: $GPGSA,A,3,28,32,,,,,,,,,,,666.6,666.6,666.6*39
1552084827329: $GPGSA,A,3,28,32,,,,,,,,,,,666.6,666.6,666.6*39
1552084828323: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552084829323: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552084830326: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552084831348: $GPGSA,A,3,27,32,,,,,,,,,,,666.6,666.6,666.6*36

Författare:  rvl [ 15.12 2019-03-09 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Med den här takten (+ 0.84 ppm*) tar det ca två veckor att nå ikapp rätt tid.
*) 1000 * ((1231 - (846.9-800)) - (1140 - (371.899-300))) / (1552137554.140 - 1551999165.231)

connected to: COM6
1552137535404: 131855.3
1552137536373: $GPGSA,A,3,12,15,17,25,32,,,,,,,,2.8,1.3,2.4*3B
1552137537373: $GPGSA,A,3,12,15,17,32,,,,,,,,,2.8,1.3,2.4*3C
1552137538372: $GPGSA,A,3,12,15,17,32,,,,,,,,,2.8,1.3,2.4*3C
1552137539373: $GPGSA,A,3,12,15,17,32,,,,,,,,,666.6,666.6,666.6*32
1552137540372: $GPGSA,A,3,12,15,17,24,32,,,,,,,,2.5,1.5,2.0*35
1552137541373: $GPGSA,A,3,15,17,24,32,,,,,,,,,666.6,666.6,666.6*37
1552137542369: $GPGSA,A,3,15,24,32,,,,,,,,,,666.6,666.6,666.6*31
1552137543368: $GPGSA,A,3,15,24,32,,,,,,,,,,666.6,666.6,666.6*31
1552137544373: $GPGSA,A,3,15,24,32,,,,,,,,,,666.6,666.6,666.6*31
1552137545373: $GPGSA,A,3,15,24,32,,,,,,,,,,666.6,666.6,666.6*31

connected to: COM18
1552137551138: 2019-03-09 22.00┬░C
1552137551139: 15:19:09
1552137551140: The Aging Offset is set
1552137551141: as: -32
1552137551149: 15:19:10
1552137552145: 15:19:11
1552137552149:
1552137553144: 15:19:12
1552137554140: 15:19:13
1552137555147: 15:19:14
1552137556142: 15:19:
1552137556146: 15
1552137557142: 15:19:16
1552137558150: 15:19:17
1552137559145: 15:19:18
1552137560140: 15:19:1
1552137560144: 9
1552137561148: 15:1
1552137561152: 9:20
1552137562147: 15:19:21

connected to: COM6
1552137565384: 131924.3
1552137566366: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552137567388: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552137568366: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552137569368: $GPGSA,A,3,15,17,,,,,,,,,,,666.6,666.6,666.6*30
1552137570366: $GPGSA,A,3,15,17,,,,,,,,,,,666.6,666.6,666.6*30
1552137571366: $GPGSA,A,3,15,17,,,,,,,,,,,666.6,666.6,666.6*30
1552137572369: $GPGSA,A,3,15,17,,,,,,,,,,,666.6,666.6,666.6*30
1552137573365: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552137574365: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
1552137575368: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
Datorn har varit utan nät ett tag och är här på väg att mjukt söka sig till "nättid". Därav interpolation mellan GPS offseten före och efter samplet från RTC-modulen. För GPS tidstämplarna tar jag medelvärde (utan eventuella outliers, där datorn kanske varit upptagen med nåt annat). För samplen från RTCn tar jag helt enkelt den minsta offseten jag hittar. Den är ofta en hundradels sekund mindre än den största. Det stämmer bra överens med att den inte samplas oftare än så. Med den minsta offseten har Arduinon råkat sampla precis strax efter att sekunden stegat fram. Motsvarande maximalt lång offset blir det när föregående sampling sker strax före omslag och Arduinon tar 10 ms kaffepaus innan den gör nästa försök.

Kanske snart dags att löda en tråd från DS3231:s SQW-utgång, som alltså inte finns på break out kontakten på den modul jag nu har.

Författare:  rvl [ 18.06 2019-03-09 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Nu ha ja en löödi bygel ti SQW. (SV: Nu har jag lött en bygel till SQW.)
Bilaga:
bygel.jpg

Det fanns en NC i break out kontakten, som nu blev ~INT/SQW.

Författare:  rvl [ 21.47 2019-03-10 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Gick över till en linuxmaskin, nu när jag fått igång interrupt från RTCn på Arduinon. Arduinos serial monitor har tidsstämplar i ms, men jag kör på med pythonscriptet, som jag nu modifierat till python 3.
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1. import serial
  2. import time
  3. import datetime
  4.    
  5. ser = serial.Serial(
  6.     port='/dev/ttyACM4',\
  7.     baudrate=230400,\
  8.     parity=serial.PARITY_NONE,\
  9.     stopbits=serial.STOPBITS_ONE,\
  10.     bytesize=serial.EIGHTBITS,\
  11.         timeout=0)
  12.    
  13. print("connected to: " + ser.portstr)
  14.    
  15. size = 100
  16. while (size > 0):
  17.     line = ser.readline().decode('utf-8')
  18.     if(line!=""):
  19.         timestamp = str(time.time())
  20.         print(timestamp + ": " + line, end ="")
  21.         size -= 1
  22.    
  23. ser.close()


Arduinokoden ser för tillfället ut såhär:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1. // Include the libraries
  2. #include <RtcDS3231.h>
  3. //Open the Library Manager and search for "Rtc by Makuna" and install
  4.  
  5. #include <Wire.h>
  6.  
  7. // Create new RTC module
  8. RtcDS3231<TwoWire> Rtc(Wire);
  9.  
  10. const byte OFFSET = -32;
  11. const uint8_t INT_SECOND_TICK_PIN = 2; //2 or 3 on Uno. (Must have pin change interrupt.)
  12.  
  13. // Create variables for time
  14. byte hours;
  15. byte minutes;
  16. byte seconds;
  17. byte old;
  18. byte oldM;
  19. uint16_t year;
  20. byte month;
  21. byte day;
  22.  
  23. volatile int32_t _rtcTotalSecondsSince2000 = 0;
  24. volatile boolean _newSecond = false;
  25.  
  26. void secondInterupt() {
  27.   _rtcTotalSecondsSince2000++;
  28.   _newSecond = true;
  29.   digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  30. }
  31.  
  32. void setup() {
  33.   // put your setup code here, to run once:
  34.   //Serial.begin(115200);
  35.   pinMode(LED_BUILTIN, OUTPUT);
  36.   Serial.begin(230400);
  37.   //Serial.begin(2000000);
  38.   Rtc.Begin();
  39.  
  40.   // Set up 1Hz square wave
  41.   //Rtc.writeSqwPinMode(DS3231_SquareWave1Hz);
  42.   Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeClock);
  43.   Rtc.SetSquareWavePinClockFrequency(DS3231SquareWaveClock_1Hz);
  44.  
  45.   // Attach the interrupt and use the internal pull up
  46.   attachInterrupt(digitalPinToInterrupt(INT_SECOND_TICK_PIN), secondInterupt, FALLING);
  47.   digitalWrite(INT_SECOND_TICK_PIN, HIGH);
  48.  
  49.   // Update RTC module time to compilation time
  50.   RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
  51.   //compiled += 7;  //transfer time W7
  52.   compiled += 9;  //transfer time U18
  53.   //Already set, comment this out:
  54.   //Rtc.SetDateTime(compiled);
  55.   //re set 2019-03-10 ~11 EET
  56.   //set 2019-03-03 ~15 EET
  57.  
  58.   //Trying out Ageing Offset
  59.   //Rtc.SetAgingOffset(OFFSET);
  60.   //Set as -32 on 2019-03-08 00:20 EET
  61.  
  62.   old = 0;
  63.   oldM = 0;
  64. }
  65.  
  66. void loop() {
  67.   // put your main code here, to run repeatedly:
  68.   /*
  69.   delay(10);
  70.   updateTime();
  71.   if(minutes != oldM){
  72.     printDate();
  73.   }
  74.   else if(seconds != old){
  75.     printTime();
  76.   }
  77.   */
  78.   if(_newSecond) {
  79.     Serial.println("*");
  80.     _newSecond = false;
  81.     //delay(100);
  82.  
  83.     if(_rtcTotalSecondsSince2000 < 1000) {  
  84.       //_rtcTotalSecondsSince2000 = Rtc.now().secondstime();
  85.       _rtcTotalSecondsSince2000 = Rtc.GetDateTime();
  86.       //.GetDateTime()
  87.     }
  88.    
  89.     // Display the  time
  90.     /*    
  91.     int32_t dayTotalSecondsNow = _rtcTotalSecondsSince2000;
  92.     uint8_t hour = dayTotalSecondsNow / 3600 % 24;
  93.     uint8_t minute = dayTotalSecondsNow / 60 % 60;
  94.     uint8_t second = dayTotalSecondsNow % 60;
  95.  
  96.     Serial.print(hour);
  97.     Serial.print(":");
  98.     Serial.print(minute);
  99.     Serial.print(":");
  100.     Serial.println(second);
  101.     */
  102.     updateTime(_rtcTotalSecondsSince2000);
  103.     printTime();
  104.   }
  105. }
  106.  
  107. void updateTime(RtcDateTime now) {
  108.    //RtcDateTime now = Rtc.GetDateTime();
  109.    hours = now.Hour();
  110.    minutes = now.Minute();
  111.    seconds = now.Second();
  112.    year = now.Year();
  113.    month = now.Month();
  114.    day = now.Day();
  115. }
  116.  
  117. #define countof(a) (sizeof(a) / sizeof(a[0]))
  118.  
  119. void printTime(){
  120.     char timestring[9];
  121.     snprintf_P(timestring,
  122.             countof(timestring),
  123.             PSTR("%02u:%02u:%02u"),
  124.             hours,
  125.             minutes,
  126.             seconds );
  127.     Serial.println(timestring);
  128.     //old = seconds;
  129. }
  130.  
  131. void printDate(){
  132.     oldM = minutes;
  133.     char datestring[12];
  134.     snprintf_P(datestring,
  135.             countof(datestring),
  136.             PSTR("%04u-%02u-%02u "),
  137.             year,
  138.             month,
  139.             day );
  140.     Serial.print(datestring);
  141.     printTemperature();
  142.     printTime();
  143.     printAgingOffset();
  144. }
  145.  
  146. void printTemperature(){
  147.     RtcTemperature temp = Rtc.GetTemperature();
  148.     Serial.print(temp.AsFloatDegC());
  149.     Serial.println("°C");
  150. }
  151.  
  152. void printAgingOffset(){
  153.   int8_t ao = Rtc.GetAgingOffset();
  154.   Serial.print("The Ageing Offset is set as: ");
  155.   Serial.println(0+ao);
  156. }

Nån gång under/efter lödarbetet hade klockan nollats, så jag har fått ställa den i tid igen. Ageing Offset inställninged höll sig kvar på innställda -32 och där är den än, så klockan går litet för fort. Men hur mycket? ...det får tiden utvisa! :mrgreen: :mrgreen: :mrgreen:

Testdata i ny tappning, med en viss regelbunden osäkerhet på ett par ms, som kanske kan skyllas på Arduinofirmwaren eller datorns OS(?)
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
rvl@EB56:~/kod/py/egi$ ntptime
ntp_gettime() returns code 0 (OK)
  time e02fedae.66dedaec  Sun, Mar 10 2019 22:10:22.401, (.401838604),
  maximum error 264720 us, estimated error 425 us, TAI offset 37
ntp_adjtime() returns code 0 (OK)
  modes 0x0 (),
  offset 577.661 us, frequency 22.766 ppm, interval 1 s,
  maximum error 264720 us, estimated error 425 us,
  status 0x2001 (PLL,NANO),
  time constant 10, precision 0.001 us, tolerance 500 ppm,
rvl@EB56:~/kod/py/egi$ python3 sertest.py
connected to: /dev/ttyACM4
1552248627.853289: *
1552248627.85345: 22:10:28
1552248628.8528016: *
1552248628.8529553: 22:10:29
1552248629.8522816: *
1552248629.8524394: 22:10:30
1552248630.8516521: *
1552248630.851781: 22:10:31
1552248631.8511636: *
1552248631.8512971: 22:10:32
1552248632.8506377: *
1552248632.850785: 22:10:33
1552248633.850095: *
1552248633.8502288: 22:10:341552248633.854115:
1552248634.8495314: *
1552248634.8537061: 22:10:35
1552248635.853119: *
1552248635.853247: 22:10:36
1552248636.8525844: *
1552248636.8527138: 22:10:37
1552248637.8520672: *
1552248637.8521938: 22:10:38
1552248638.851573: *
1552248638.8517141: 22:10:39
1552248639.851043: *
1552248639.8511899: 22:10:40
1552248640.8505352: *
1552248640.8506837: 22:10:41
1552248641.8499706: *
1552248641.8500912: 22:10:1552248641.8540194: 42
1552248642.849398: *
1552248642.8535764: 22:10:43
1552248643.8530092: *
1552248643.8531356: 22:10:44
1552248644.8525133: *
1552248644.8526568: 22:10:45
1552248645.8519795: *
1552248645.8521237: 22:10:46
1552248646.8514516: *
1552248646.8515935: 22:10:47
1552248647.8509202: *
1552248647.8510642: 22:10:48
1552248648.850401: *
1552248648.8505435: 22:10:49
1552248649.8498106: *
1552248649.8498867: 22:1552248649.8539279: 10:50
1552248650.8534071: *
1552248650.853528: 22:10:51
1552248651.8529136: *
1552248651.853062: 22:10:52
1552248652.852369: *
1552248652.8524969: 22:10:53
1552248653.851837: *
1552248653.851965: 22:10:54
1552248654.8513167: *
1552248654.851445: 22:10:55
1552248655.8507917: *
1552248655.8509183: 22:10:56
1552248656.8502772: *
1552248656.850421: 22:10:57
1552248657.8497026: *
1552248657.8497627: 21552248657.8538618: 2:10:58
1552248658.8533037: *
1552248658.8534431: 22:10:59
1552248659.8527749: *
1552248659.8529022: 22:11:00
1552248660.852247: *
1552248660.8523746: 22:11:01
1552248661.8517342: *
1552248661.8518617: 22:11:02
1552248662.8511906: *
1552248662.8513184: 22:11:03
1552248663.8506732: *
1552248663.8508003: 22:11:04
1552248664.850169: *
1552248664.8503141: 22:11:05
1552248665.8495774: *
1552248665.853764: 22:11:06
1552248666.8532388: *
1552248666.8533676: 22:11:07
1552248667.8526905: *
1552248667.8528352: 22:11:08
1552248668.8522263: *
1552248668.85237: 22:11:09
1552248669.8516252: *
1552248669.8517663: 22:11:10
1552248670.8511865: *
1552248670.8513358: 22:11:11
1552248671.8505766: *
1552248671.8507183: 22:11:12
1552248672.8500473: *
1552248672.8501844: 22:11:131552248672.8541803:
1552248673.849458: *
1552248673.8536575: 22:11:14
rvl@EB56:~/kod/py/egi$ ntptime
ntp_gettime() returns code 0 (OK)
  time e02fede4.3052f7f4  Sun, Mar 10 2019 22:11:16.188, (.188766842),
  maximum error 291720 us, estimated error 425 us, TAI offset 37
ntp_adjtime() returns code 0 (OK)
  modes 0x0 (),
  offset 570.095 us, frequency 22.766 ppm, interval 1 s,
  maximum error 291720 us, estimated error 425 us,
  status 0x2001 (PLL,NANO),
  time constant 10, precision 0.001 us, tolerance 500 ppm,

851.429 ± 2.0 ms (Min: 849.398 Max: 853.4071) låg asteriskradernas tiddstämplar på där, utan hänsyn till datorn tidsoffset som var 578..570 µs enligt ntptime.

Författare:  rvl [ 23.11 2019-03-10 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Som sagt regelbunden:
Bilaga:
regelbunden.png

Författare:  rvl [ 19.21 2019-03-11 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

En klocka ska väl ha en "display" också! Kanske såhär?
https://youtu.be/KokWIfygoMs

Författare:  rvl [ 23.02 2019-03-11 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Nu blev det + 1.2475 ppm (849398 - 737067.7)/(1552338686.7370677 - 1552248642.849398) utan att orka beakta datorns offset, som åtminstone idag var obetylig jämfört med sågtandsavvikelsen, där jag valde minsta värde.

Ska skruva upp Ageing Offsetten tillbaka mot noll nu och se hur det går.

Utdrag ur kvällens data:
rvl@EB56:~/kod/py/egi$ ntptime
ntp_gettime() returns code 0 (OK)
time e0314d2b.f6f6a50c Mon, Mar 11 2019 23:10:03.964, (.964701972),
maximum error 169433 us, estimated error 452 us, TAI offset 37
ntp_adjtime() returns code 0 (OK)
modes 0x0 (),
offset 95.070 us, frequency 22.727 ppm, interval 1 s,
maximum error 169433 us, estimated error 452 us,
status 0x2001 (PLL,NANO),
time constant 7, precision 0.001 us, tolerance 500 ppm,

...
1552338678.737196: *
1552338678.7413683: 23:11:19
1552338679.7408328: *
1552338679.7409573: 23:11:20
1552338680.740308: *
1552338680.7404335: 23:11:21
1552338681.7397819: *
1552338681.7399077: 23:11:22
1552338682.7392573: *
1552338682.7393832: 23:11:23
1552338683.7387326: *
1552338683.7388577: 23:11:24
1552338684.7382228: *
1552338684.7383628: 23:11:25
1552338685.7376604: *
1552338685.7377274: 231552338685.7417574: :11:26
1552338686.7370677: *1552338686.7412124:
1552338686.7413354: 23:11:27
1552338687.740713: *
1552338687.7408383: 23:11:28
1552338688.7402194: *
1552338688.7403593: 23:11:29
1552338689.7396657: *
...
rvl@EB56:~/kod/py/egi$ ntptime
ntp_gettime() returns code 0 (OK)
time e0314d9d.74343b70 Mon, Mar 11 2019 23:11:57.453, (.453922738),
maximum error 226433 us, estimated error 452 us, TAI offset 37
ntp_adjtime() returns code 0 (OK)
modes 0x0 (),
offset 76.076 us, frequency 22.727 ppm, interval 1 s,
maximum error 226433 us, estimated error 452 us,
status 0x2001 (PLL,NANO),
time constant 7, precision 0.001 us, tolerance 500 ppm,

Författare:  rvl [ 21.54 2019-03-13 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Ageing 0ffset nu innställd till -21, som torde vara optimalt för min modul och temperatur. Efter ca 11 h med den inställningen har mina tidsstämplar vandrat en dryg millisekund. Motsvarar - 0.0266 ppm, eller dvs -27 ppb (utrikiska biljoner), som blir rätt nära en sekund per år, OM modulen och temperaturen är stabila.

En hel del osäkerhet i att mäta absoluta submillisekunder, med min nuvarande setup, så mätintervallet är fortfarande för kort för att ens definitivt uttala sig om frekvensfelets förtecken (de första timmarna verkade det gå åt andra hållet).

Författare:  Zhorts [ 07.26 2019-03-14 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Roligt och spännande - tid är statistik. :)

Nästa steg är väl då nu att lägga till en super-exakt temperatursensor och dynamiskt korrigera offset baserat på uppmätt temperatur?

Författare:  rvl [ 17.38 2019-03-14 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Ser man på. Första avbrottet i min monolog. 8) Kul. Nja, olika temperaturer börjar jag inte med än, även om modulen har sin egen temperatursensor. Inte kanske "precicions-sådan", men med bra termisk koppling till där temperaturen är av intresse. Och egentligen gör modulen redan allt det där, men inte ens med utlovad noggrannhet - inte min modul i alla fall - för att inte ens tala om de noggrannheter jag nu har med akttuell temperatur.

Har automatiserat mitt kalibreringshjälpscript:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1. import serial
  2. import time
  3. import datetime
  4. import subprocess
  5. import sys
  6.    
  7. def getOffset():
  8.     output = subprocess.check_output('ntptime|grep \ \ offset', shell=True)
  9.     print(output.decode("utf-8"))
  10.     output = output.split(b' ')
  11.     offs = (output[3].decode("utf-8"))
  12.     pntp = float((output[6].decode("utf-8")))
  13.     toff = float(offs)/1000000.0
  14.     return(toff,pntp)
  15.  
  16. SAMPLETRIES = 100
  17. SLEEPTIME = 30
  18.  
  19. t0 = time.time()
  20. o0,p0 = getOffset()
  21.  
  22. time.sleep(SLEEPTIME)
  23.  
  24. t1 = time.time()
  25. o1,p1 = getOffset()
  26.  
  27. ser = serial.Serial(
  28.     port='/dev/ttyACM0',\
  29.     baudrate=230400,\
  30.     parity=serial.PARITY_NONE,\
  31.     stopbits=serial.STOPBITS_ONE,\
  32.     bytesize=serial.EIGHTBITS,\
  33.         timeout=0)
  34.    
  35. print("connected to: " + ser.portstr)
  36.    
  37. size = SAMPLETRIES
  38. timestamps = []
  39. tsf = []
  40. while (size > 0):
  41.     line = ser.readline().decode('utf-8')
  42.     if(line!=""):
  43.         ts = time.time()
  44.         print(ts, ": " + line, end ="")
  45.         if '*' in line:
  46.             size -= 1
  47.             timestamps.append(ts)
  48.             tsf.append(ts%1)
  49.    
  50. ser.close()
  51.  
  52. t2 = time.time()
  53. o2,p2 = getOffset()
  54.  
  55. time.sleep(SLEEPTIME)
  56.  
  57. t3 = time.time()
  58. o3,p3 = getOffset()
  59.  
  60. raw = timestamps[tsf.index(min(tsf))]
  61. print('raw:')
  62. print(raw)
  63. '''
  64. print(t0,t1,t2,t3)
  65. print(o0,o1,o2,o3)
  66. print(p0,p1,p2,p3)
  67. '''
  68. if(p1==p2):
  69.     print('interpolating')
  70.     tsample = raw + o1 + (raw-t1)/(t2-t1)*(o2-o1)
  71.  
  72. elif(p2==p3):
  73.     print('extrapolating')
  74.     tsample = raw + o2 + (raw-t2)/(t3-t2)*(o3-o2)
  75.  
  76. elif(p1==p2):
  77.     print('extrapolating2')
  78.     tsample = raw + o0 + (raw-t0)/(t1-t0)*(o1-o0)
  79.  
  80. else:
  81.     print('else')
  82.     tsample = raw + (o0+o1+o2+o3)/4
  83. print(tsample)
  84.  
  85.  
  86. def s2ppm(t1, t2):
  87.     ppm = 1000000. * (t1%1-t2%1) / (t2-t1)
  88.     return ppm
  89.  
  90. if len(sys.argv)>1:
  91.     for i in range(1,len(sys.argv)):
  92.         ts_ref = float(sys.argv[i])
  93.         print(s2ppm(ts_ref,tsample), 'ppm (',datetime.datetime.fromtimestamp(ts_ref).strftime('%Y-%m-%d %H:%M:%S'),')')
  94.  

Koden har kända brister, då jag t.ex. ännu inte behövt bekymra mig om att sampel kan komma på både före och efter helsekund.

Exempeloutput, med Ageing Offset -21:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
...
1552578699.7788537 : 17:51:40
1552578700.7781558 : *
1552578700.7782788 : 17:51:41
1552578701.7776508 : *
1552578701.7777889 : 17:51:42
1552578702.776998 : *
1552578702.7770765 : 17:1552578702.7811046 : 51:43
1552578703.7764342 : *1552578703.780635 :
1552578703.7807496 : 17:51:44
1552578704.780148 : *
1552578704.7802725 : 17:51:45
1552578705.7796392 : *
1552578705.7797625 : 17:51:46
1552578706.7790623 : *
1552578706.779179 : 17:51:47
1552578707.778521 : *
1552578707.7786384 : 17:51:48
1552578708.7779927 : *
1552578708.7781105 : 17:51:49
1552578709.7774553 : *
1552578709.777609 : 17:51:50
1552578710.7768772 : *
1552578710.7810528 : 17:51:51
1552578711.7804687 : *
1552578711.7805789 : 17:51:52
1552578712.7799757 : *
  offset -421.499 us, frequency 22.819 ppm, interval 1 s,

  offset -418.422 us, frequency 22.819 ppm, interval 1 s,

raw:
1552578703.7764342
interpolating
1552578703.7760117
-0.028885766492609936 ppm ( 2019-03-13 11:25:58 )
-0.028539486322882897 ppm ( 2019-03-13 22:12:08 )
-0.06085233286533193 ppm ( 2019-03-14 11:03:16 )
0.5452317252919902 ppm ( 2019-03-14 17:22:47 )


Sista referensen där helt tydligt alldeles för nära, med onogrannhetem i datorns ntp-synkronisering med yttervärden. Kanske jag borde sätta upp en egen stratum-1 NTP-server med GPS-referens. ...eller kanske hellre köra bare metal med PPS signal från GPS:n istället för omvägar via datorer.

Författare:  rvl [ 08.48 2019-03-15 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Nu håller jag på att ställa tiden rätt genom att köra med minsta tillgängliga frekvens. Det borde ta ca tre timmar att "flytta tiden" de 0,2 s som den var var före sin tid.

Såhär går det med Ageing Offset 127:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
...
1552635419.8061888 : *
1552635419.8062787 : 09:371552635419.8106258 : :00
1552635419.8108048 : 2019-03-15 25.50°C
1552635419.8110638 : The Ageing Offset is set as: 127
1552635420.809746 :  *
1552635420.8098664 : 09:37:01
1552635421.8092697 : *
  offset -990.674 us, frequency 22.939 ppm, interval 1 s,

  offset -989.949 us, frequency 22.939 ppm, interval 1 s,

raw:
1552635405.805307 @ 2019-03-15 09:36:45
interpolating
1552635405.8043125
-17.42905691448558 ppm ( 2019-03-15 09:15:17 )
-17.479793609010446 ppm ( 2019-03-15 09:18:33 )
-17.39436081826314 ppm ( 2019-03-15 09:20:41 )
-17.783793090615617 ppm ( 2019-03-15 09:23:04 )
-17.911971635993904 ppm ( 2019-03-15 09:26:20 )
-17.669247372215736 ppm ( 2019-03-15 09:27:20 )
-17.633169374185233 ppm ( 2019-03-15 09:29:13 )
-17.780928539936834 ppm ( 2019-03-15 09:30:36 )

Författare:  rvl [ 12.56 2019-03-16 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Efter att ha ställt in klockan (nästan) rätt tog jag i bruk Ageing Offset -22, för att se hur mycket för fort klockan går då. Det ser ut att bli ca +60 ppb, medan AO=-21 ger ca -40 ppb. Nästa naturliga steg är att "pulsviddsmodulera" och låta -21 och -22 turas om i motsvarande förhållande. Till exepel använd värdet -22 de första 23 minuterna efter varje hel timme och sedan köra med -21 resten av tiden.

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
Ageing Offset -22
raw:
1552734751.9919305 @ 2019-03-16 13:12:31
interpolating
1552734751.990942
0.059109883481187314 ppm ( 2019-03-15 12:40:46 )
0.04983486337842655 ppm ( 2019-03-15 13:56:01 )
0.0495559195718034 ppm ( 2019-03-15 14:01:28 )
0.06734975180991905 ppm ( 2019-03-15 14:50:30 )
0.06866058739679064 ppm ( 2019-03-15 14:54:39 )
0.04959204462421243 ppm ( 2019-03-15 14:59:27 )
0.1129783889177277 ppm ( 2019-03-15 18:45:25 )
0.05328043273651608 ppm ( 2019-03-15 18:49:11 )
0.08201934320444369 ppm ( 2019-03-15 20:44:14 )
0.08730077865243993 ppm ( 2019-03-15 20:47:13 )
0.06509920227165386 ppm ( 2019-03-15 20:57:28 )
0.053431779949418015 ppm ( 2019-03-15 21:45:04 )
0.05058955421888551 ppm ( 2019-03-15 22:49:55 )
0.06278020651248781 ppm ( 2019-03-16 00:15:08 )
0.04589220984106157 ppm ( 2019-03-16 01:12:59 )
0.05802319455572466 ppm ( 2019-03-16 02:02:16 )
-0.1397625958018128 ppm ( 2019-03-16 13:01:53 )

Ageing Offset -21
raw:
1552633741.7798676 @ 2019-03-15 09:09:01
interpolating
1552633741.7789056
-0.03680948744384823 ppm ( 2019-03-13 11:25:58 )
-0.03905643076126826 ppm ( 2019-03-13 22:12:08 )
-0.055128954474344495 ppm ( 2019-03-14 11:03:16 )
-0.03430096324556602 ppm ( 2019-03-14 17:22:47 )
-0.052580481866543294 ppm ( 2019-03-14 17:51:43 )
-0.03610826761968876 ppm ( 2019-03-14 21:10:44 )
-0.015611318123120214 ppm ( 2019-03-15 00:58:01 )
-0.023384232215827895 ppm ( 2019-03-15 01:07:06 )
-0.043728802108601174 ppm ( 2019-03-15 02:01:12 )
-0.04217282231070747 ppm ( 2019-03-15 08:00:31 )
0.0765706939670939 ppm ( 2019-03-15 08:17:54 )
0.08227543582948371 ppm ( 2019-03-15 08:29:19 )
0.1370576492849555 ppm ( 2019-03-15 08:50:59 )

Författare:  rvl [ 13.08 2019-03-16 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Såhär låter klockan tillsammans med tidssignal från radion.
Bilaga:
miksei.mp3

Författare:  rvl [ 16.45 2019-03-16 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

"PWM"-version av Arduinokoden:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1. // Include the libraries
  2. #include <RtcDS3231.h>
  3. //Open the Library Manager and search for "Rtc by Makuna" and install
  4.  
  5. #include <Wire.h>
  6.  
  7. // Create new RTC module
  8. RtcDS3231<TwoWire> Rtc(Wire);
  9.  
  10. //const byte OFFSET = -32; // +1...
  11. //const byte OFFSET = -16; // -0.67
  12. //const byte OFFSET = -24; // +0.41
  13. //const byte OFFSET = -20; // -0.12
  14. //const byte OFFSET = -21; // -0.04
  15. const byte OFFSET = -22; // +0.06
  16. const byte OFFSET_MINUS = -21; // -0.04
  17. const byte OFFSET_PLUS = -22; // +0.06
  18.  
  19. // where to switch in addition to at 0
  20. const byte MAGIC_CONSTANT = 25; //minute based approach first...
  21.  
  22. //extremes test
  23. //const byte OFFSET = 127; // -17.8
  24. //const byte OFFSET = -128; // +
  25. //const byte OFFSET = 64; // -
  26. //const byte OFFSET = -64; // +
  27. const uint8_t INT_SECOND_TICK_PIN = 2; //2 or 3 on Uno. (Must have pin change interrupt.)
  28.  
  29. // Create variables for time
  30. byte hours;
  31. byte minutes;
  32. byte seconds;
  33. byte old;
  34. byte oldM;
  35. uint16_t year;
  36. byte month;
  37. byte day;
  38. byte currentSetting = 0;
  39.  
  40. volatile int32_t _rtcTotalSecondsSince2000 = 0;
  41. volatile boolean _newSecond = false;
  42.  
  43. void secondInterupt() {
  44.   _rtcTotalSecondsSince2000++;
  45.   _newSecond = true;
  46.   digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  47. }
  48.  
  49. void setup() {
  50.   // put your setup code here, to run once:
  51.   //Serial.begin(115200);
  52.   pinMode(LED_BUILTIN, OUTPUT);
  53.   Serial.begin(230400);
  54.   //Serial.begin(2000000);
  55.   Rtc.Begin();
  56.  
  57.   // Set up 1Hz square wave
  58.   //Rtc.writeSqwPinMode(DS3231_SquareWave1Hz);
  59.   //Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeClock);
  60.   //Rtc.SetSquareWavePinClockFrequency(DS3231SquareWaveClock_1Hz);
  61.  
  62.   // Attach the interrupt and use the internal pull up
  63.   attachInterrupt(digitalPinToInterrupt(INT_SECOND_TICK_PIN), secondInterupt, FALLING);
  64.   digitalWrite(INT_SECOND_TICK_PIN, HIGH);
  65.  
  66.   // Update RTC module time to compilation time
  67.   RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
  68.   //compiled += 7;  //transfer time W7
  69.   compiled += 9;  //transfer time U18
  70.   //Already set, comment this out:
  71.   //Rtc.SetDateTime(compiled);
  72.   //re set 2019-03-10 ~11 EET
  73.   //set 2019-03-03 ~15 EET
  74.  
  75.  
  76.   //Trying out Ageing Offset
  77.   //
  78.   //Rtc.SetAgingOffset(OFFSET);
  79.   //Rtc.ForceTemperatureCompensationUpdate(true);
  80.   // note!
  81.   //"The offset register is added to the capacitance
  82.   //array  during  a  normal  temperature  conversion,
  83.   //_if_the_temperature_changes_ !!!
  84.   //from the previous conversion, !!!
  85.   //or during a manual user conversion"
  86.   //
  87.   //Set as -32 on 2019-03-08 00:20 EET
  88.   //Set as -16 on 2019-03-12 00:20+ EET
  89.   // -24 ...-12 16:20
  90.   // -20 ...-12 21:40
  91.   // -21 ...-13 11:20 until ...-15 09:13
  92.  
  93.   old = 0;
  94.   oldM = 0;
  95. }
  96.  
  97. void loop() {
  98.   // put your main code here, to run repeatedly:
  99.   /*
  100.   delay(10);
  101.   updateTime();
  102.   if(minutes != oldM){
  103.     printDate();
  104.   }
  105.   else if(seconds != old){
  106.     printTime();
  107.   }
  108.   */
  109.   if(_newSecond) {
  110.     Serial.println("*");
  111.     _newSecond = false;
  112.     //delay(100);
  113.  
  114.     if(_rtcTotalSecondsSince2000 < 1000) {  
  115.       //_rtcTotalSecondsSince2000 = Rtc.now().secondstime();
  116.       _rtcTotalSecondsSince2000 = Rtc.GetDateTime();
  117.       //.GetDateTime()
  118.     }
  119.    
  120.     // Display the  time
  121.     /*    
  122.     int32_t dayTotalSecondsNow = _rtcTotalSecondsSince2000;
  123.     uint8_t hour = dayTotalSecondsNow / 3600 % 24;
  124.     uint8_t minute = dayTotalSecondsNow / 60 % 60;
  125.     uint8_t second = dayTotalSecondsNow % 60;
  126.  
  127.     Serial.print(hour);
  128.     Serial.print(":");
  129.     Serial.print(minute);
  130.     Serial.print(":");
  131.     Serial.println(second);
  132.     */
  133.     updateTime(_rtcTotalSecondsSince2000);
  134.     printTime();
  135.   }
  136. }
  137.  
  138. void updateTime(RtcDateTime now) {
  139.    //RtcDateTime now = Rtc.GetDateTime();
  140.    hours = now.Hour();
  141.    minutes = now.Minute();
  142.    seconds = now.Second();
  143.    year = now.Year();
  144.    month = now.Month();
  145.    day = now.Day();
  146. }
  147.  
  148. #define countof(a) (sizeof(a) / sizeof(a[0]))
  149.  
  150. void printTime(){
  151.     char timestring[9];
  152.     snprintf_P(timestring,
  153.             countof(timestring),
  154.             PSTR("%02u:%02u:%02u"),
  155.             hours,
  156.             minutes,
  157.             seconds );
  158.     Serial.println(timestring);
  159.     //old = seconds;
  160.     if(0==seconds){
  161.       printDate();
  162.       updateRuleCheck();
  163.     }
  164. }
  165.  
  166. void printDate(){
  167.     //oldM = minutes;
  168.     char datestring[12];
  169.     snprintf_P(datestring,
  170.             countof(datestring),
  171.             PSTR("%04u-%02u-%02u "),
  172.             year,
  173.             month,
  174.             day );
  175.     Serial.print(datestring);
  176.     printTemperature();
  177.     //printTime();
  178.     printAgingOffset();
  179. }
  180.  
  181. void printTemperature(){
  182.     RtcTemperature temp = Rtc.GetTemperature();
  183.     Serial.print(temp.AsFloatDegC());
  184.     Serial.println("°C");
  185. }
  186.  
  187. void printAgingOffset(){
  188.   int8_t ao = Rtc.GetAgingOffset();
  189.   Serial.print("The Ageing Offset is set as: ");
  190.   Serial.println(0+ao);
  191. }
  192.  
  193. void updateRuleCheck(){
  194.   if(!(0==minutes | MAGIC_CONSTANT==minutes)){
  195.     return;
  196.   }
  197.   if(0==currentSetting){
  198.     currentSetting = Rtc.GetAgingOffset();
  199.   }
  200.   if(0==minutes & currentSetting != OFFSET_PLUS ){
  201.     updateOffset(OFFSET_PLUS);
  202.   }
  203.   if(MAGIC_CONSTANT==minutes & currentSetting != OFFSET_MINUS ){
  204.     updateOffset(OFFSET_MINUS);
  205.   }
  206.   return;
  207. }
  208.  
  209. void updateOffset(byte offset){
  210.   Rtc.SetAgingOffset(offset);
  211.   Rtc.ForceTemperatureCompensationUpdate(true);
  212.   currentSetting = offset;
  213. }
  214.  
  215.  

Författare:  rvl [ 16.49 2019-03-16 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Tidsignal och klocktick med "billigt digitaloscilloskop" dvs dator+Audacity.
Bilaga:
audioTick.png

Författare:  rvl [ 20.55 2019-03-16 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Senaste optimistiska(?) bud: +2 ppb! (23 µs / 4 h). Detta räknat från hur mycket pulsen vandrat relativt tidssignalen på oscilllogrammen. Kanske jag tog i, när jag valde största sample raten i Audacity? Måste försöka se vad hårdvaran levererar och inte fylla i fantasisampel mellan de verkliga i onödan.
Bilaga:
samples.png


Ska jag ännu komma på nån annan udda metod att pröva, innan jag tar fram en GPS med PPS utgång och fånga klock- och GPS-pulser digitalt.

Författare:  rvl [ 09.54 2019-03-17 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Nu visar tidsignalmetoden -10 ppb och ntp+pythonscripmetoden -9 ppb (-10.2 och -8.6) jämfört med i går när jag startade "pwm-programmet".
Bilaga:
signal.png
Tidssignalen och klockpulsen som kommer drygt 20 ms före. Skriptmetoden låter förstå att skilnaden skulle var mindre, men det finns fördröjningar där.

Litet data från senaste skriptsampling, som också råkar visa byte av Ageing Offset in action.
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
rvl@EB56:~/kod/py/egi$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 ntp.dnainternet .POOL.          16 p    -   64    0    0.000    0.000   0.000
 0.fi.pool.ntp.o .POOL.          16 p    -   64    0    0.000    0.000   0.000
-ntp2.dnainterne 62.237.86.234    2 u    2  512  377   11.557    0.774   1.952
*ntp3.dnainterne 193.66.253.98    2 u   84  512  377    9.589    0.312   0.802
+ntp1.dnainterne 193.66.253.102   2 u  195  512  377    9.530    0.650   0.439
+lagoon.nisc.inf 95.216.71.38     3 u  244  512  377   10.368    0.264   0.573
-tick.katterno.f 192.168.52.42    2 u  200  512  377   15.039    0.012   1.241
-tock.katterno.f 193.11.166.18    2 u   57  512  377   16.579    0.953   2.436
+ardbeg.gw.com   192.36.144.23    2 u  174  512  377   10.356    0.505   0.386
-ukk0.internatio 189.141.160.61   2 u  208  512  377    8.634   -0.461   0.990
rvl@EB56:~/kod/py/egi$ ntptime
ntp_gettime() returns code 0 (OK)
  time e0388294.2623bff8  Sun, Mar 17 2019 10:23:48.148, (.148983892),
  maximum error 76481 us, estimated error 380 us, TAI offset 37
ntp_adjtime() returns code 0 (OK)
  modes 0x0 (),
  offset 385.326 us, frequency 22.642 ppm, interval 1 s,
  maximum error 76481 us, estimated error 380 us,
  status 0x2001 (PLL,NANO),
  time constant 9, precision 0.001 us, tolerance 500 ppm,
rvl@EB56:~/kod/py/egi$ python3 sertest2.py 1552749667.9903212 1552750056.9903197 1552752942.9902887 1552754537.9902184 1552755992.9898434 1552760287.9904182 1552766792.990618 1552782547.9906676 1552783006.990334 1552803963.9909348 1552804663.9905202 1552805013.9904478 1552805433.9903471 1552807222.990114
  offset 381.767 us, frequency 22.642 ppm, interval 1 s,

  offset 376.214 us, frequency 22.642 ppm, interval 1 s,

connected to: /dev/ttyACM3
1552811083.9934025 : *
1552811083.993575 : 10:24:44
1552811084.9928823 : *
1552811084.9930346 : 10:24:45
1552811085.9923272 : *
1552811085.9924607 : 10:24:46
1552811086.9918187 : *
1552811086.9919524 : 10:24:47
1552811087.9912853 : *
1552811087.99139 : 10:241552811087.995293 : :48
1552811088.9906647 : *
1552811088.9947968 : 10:24:49
1552811089.9942799 : *
1552811089.994428 : 10:24:50
1552811090.9937325 : *
1552811090.9938624 : 10:24:51
1552811091.9932108 : *
1552811091.9933662 : 10:24:52
1552811092.9926853 : *
1552811092.9928222 : 10:24:53
1552811093.9921758 : *
1552811093.9923215 : 10:24:54
1552811094.991659 : *
1552811094.9918594 : 10:24:55
1552811095.9910665 : *
1552811095.991149 : 101552811095.9951913 : :24:56
1552811096.9905138 : *1552811096.9946547 :
1552811096.994765 : 10:24:57
1552811097.994149 : *
1552811097.9942975 : 10:24:58
1552811098.993626 : *
1552811098.9937727 : 10:24:59
1552811099.9933176 : *
1552811099.9934635 : 10:25:00
1552811099.9936512 : 2019-03-17 25.00°C
1552811099.993747 : The Ag1552811099.997451 : eing Offset is set as: -22
1552811100.9925745 : *
1552811100.9927204 : 10:25:01
1552811101.9920433 : *
1552811101.9921901 : 10:25:02
1552811102.991519 : *
1552811102.9916651 : 10:25:03
1552811103.9909353 : *
1552811103.9951036 : 10:25:04
1552811104.994556 : *
1552811104.9946856 : 10:25:05
1552811105.994038 : *
1552811105.9941883 : 10:25:06
1552811106.993502 : *
1552811106.9936311 : 10:25:07
1552811107.9929855 : *
1552811107.9931571 : 10:25:08
1552811108.992459 : *
1552811108.9926116 : 10:25:09
1552811109.9919188 : *
1552811109.992049 : 10:25:10
1552811110.9913905 : *
1552811110.9953787 : 10:25:11
1552811111.9908051 : *
1552811111.9949822 : 10:25:12
1552811112.9944463 : *
1552811112.9945729 : 10:25:13
1552811113.9939275 : *
1552811113.9940453 : 10:25:14
1552811114.993402 : *
1552811114.9935274 : 10:25:15
1552811115.992868 : *
1552811115.9929936 : 10:25:16
1552811116.9923406 : *
1552811116.9924667 : 10:25:17
1552811117.9918036 : *
1552811117.9919312 : 10:25:18
1552811118.9912562 : *
1552811118.9913716 : 10:25:1552811118.995309 : 19
1552811119.9906814 : *
1552811119.9948795 : 10:25:20
1552811120.9943314 : *
1552811120.9944584 : 10:25:21
1552811121.9937897 : *
1552811121.9939158 : 10:25:22
1552811122.99328 : *
1552811122.9934068 : 10:25:23
1552811123.9927454 : *
1552811123.9928713 : 10:25:24
1552811124.9922183 : *
1552811124.9923475 : 10:25:25
1552811125.9916933 : *
1552811125.9918413 : 10:25:26
1552811126.9911468 : *
1552811126.991256 : 10:21552811126.9952173 : 5:27
1552811127.9946818 : *
1552811127.994808 : 10:25:28
1552811128.9941978 : *
1552811128.994317 : 10:25:29
1552811129.993675 : *
1552811129.9938102 : 10:25:30
1552811130.993145 : *
1552811130.993275 : 10:25:31
1552811131.992591 : *
1552811131.9927342 : 10:25:32
1552811132.9920983 : *
1552811132.992227 : 10:25:33
1552811133.991569 : *
1552811133.9916995 : 10:25:34
1552811134.991003 : *
1552811134.9910824 : 11552811134.9951508 : 0:25:35
1552811135.9946213 : *
1552811135.9947693 : 10:25:36
1552811136.9940746 : *
1552811136.9942055 : 10:25:37
1552811137.9935699 : *
1552811137.9936962 : 10:25:38
1552811138.9930472 : *
1552811138.9931996 : 10:25:39
1552811139.9925148 : *
1552811139.992658 : 10:25:40
1552811140.9919784 : *
1552811140.9921086 : 10:25:41
1552811141.9914637 : *
1552811141.9916117 : 10:25:42
1552811142.9908242 : *
1552811142.9950118 : 10:25:43
1552811143.9945095 : *
1552811143.9946468 : 10:25:44
1552811144.993979 : *
1552811144.9941049 : 10:25:45
1552811145.9934394 : *
1552811145.9935677 : 10:25:46
1552811146.9929223 : *
1552811146.9930506 : 10:25:47
1552811147.9923916 : *
1552811147.9925287 : 10:25:48
1552811148.9918733 : *
1552811148.992 : 10:25:49
1552811149.991335 : *
1552811149.9914446 : 10:25:501552811149.9953423 :
1552811150.990758 : *
1552811150.9949343 : 10:25:51
1552811151.994446 : *
1552811151.9945903 : 10:25:52
1552811152.9938629 : *
1552811152.9939895 : 10:25:53
1552811153.9934115 : *
1552811153.9935606 : 10:25:54
1552811154.9928162 : *
1552811154.992961 : 10:25:55
1552811155.9922931 : *
1552811155.9924324 : 10:25:56
1552811156.9917662 : *
1552811156.991893 : 10:25:57
1552811157.9911911 : *
1552811157.9912827 : 10:251552811157.995324 : :58
1552811158.990636 : *
1552811158.9948125 : 10:25:59
1552811159.9946446 : *
1552811159.9947705 : 10:26:00
1552811159.9949439 : 2019-03-17 25.00°C
1552811159.9951897 : The Ageing Offset is set as: -211552811159.998268 :
1552811160.9937513 : *
1552811160.9938972 : 10:26:01
1552811161.9932508 : *
1552811161.9933798 : 10:26:02
1552811162.9926832 : *
1552811162.9928095 : 10:26:03
1552811163.9922159 : *
1552811163.9923656 : 10:26:04
1552811164.9916494 : *
1552811164.9917946 : 10:26:05
1552811165.991076 : *
1552811165.9911518 : 10:1552811165.9951932 : 26:06
1552811166.9904912 : *1552811166.9946535 :
1552811166.9947643 : 10:26:07
1552811167.9941576 : *
1552811167.9942832 : 10:26:08
1552811168.9936247 : *
1552811168.993751 : 10:26:09
1552811169.9931164 : *
1552811169.9932637 : 10:26:10
1552811170.992575 : *
1552811170.9927223 : 10:26:11
1552811171.992075 : *
1552811171.9922144 : 10:26:12
1552811172.9915264 : *
1552811172.9916534 : 10:26:13
1552811173.9909296 : *
1552811173.9950993 : 10:26:14
1552811174.9945626 : *
1552811174.994691 : 10:26:15
1552811175.9940329 : *
1552811175.9941618 : 10:26:16
1552811176.9935098 : *
1552811176.9936366 : 10:26:17
1552811177.9929936 : *
1552811177.993118 : 10:26:18
1552811178.9924505 : *
1552811178.9925952 : 10:26:19
1552811179.9919355 : *
1552811179.9920847 : 10:26:20
1552811180.9914103 : *
1552811180.995396 :  10:26:21
1552811181.9908733 : *
1552811181.9949872 : 10:26:22
1552811182.9944434 : *
  offset 357.408 us, frequency 22.642 ppm, interval 1 s,

  offset 352.037 us, frequency 22.642 ppm, interval 1 s,

raw:
1552811166.9904912 @ 2019-03-17 10:26:06
interpolating
1552811166.9908514
-0.008621976216688615 ppm ( 2019-03-16 17:21:07 )
-0.008700268806591109 ppm ( 2019-03-16 17:27:36 )
-0.0096638472321062 ppm ( 2019-03-16 18:15:42 )
-0.011178041647193722 ppm ( 2019-03-16 18:42:17 )
-0.018270086164217617 ppm ( 2019-03-16 19:06:32 )
-0.008514447110576558 ppm ( 2019-03-16 20:18:07 )
-0.005260102485975115 ppm ( 2019-03-16 22:06:32 )
-0.0064230309691679826 ppm ( 2019-03-17 02:29:07 )
-0.018372454088958275 ppm ( 2019-03-17 02:36:46 )
0.01158496510513282 ppm ( 2019-03-17 08:26:03 )
-0.05092471005807625 ppm ( 2019-03-17 08:37:43 )
-0.06560094717042173 ppm ( 2019-03-17 08:43:33 )
-0.08795661092747566 ppm ( 2019-03-17 08:50:33 )
-0.1869747787222544 ppm ( 2019-03-17 09:20:22 )

Författare:  rvl [ 10.23 2019-03-17 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Från signalerna har jag bara plockat det sampel där signalens absolutvärde är maximalt. Brus kan flytta den punkten en del från det optimala, så det vore bättre att korrelera hela signalen (tidssignalen eller klockpulsen) med en ren teoretisk signal. Då kan man få fasen med subsampelnogrannhet och på köpet frekvensavvikelsen i ljudsamplingsfrekvensen.

Författare:  rvl [ 11.59 2019-03-17 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Att använda LED-pinnen på Arduinon som utgång till klockmotorn var kanske inte så smart... Bootloadern ger en kort blinkskur till LED:n.
Bilaga:
bootloader.png

Författare:  rvl [ 14.01 2019-03-17 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Flyttade utgången till Pin 12, men blinkar fortfarande även LED:n.
Vidare på samma tema. Öppning av serieporten sänder ut en DTR-signal som resettar Arduinon. Praktiskt i många fall, men långt ifrån önskvärt i många andra. Googlade fram en lösning som ser ut att fungera i kalibreringshjälpskriptet:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1. import serial
  2. import time
  3. import datetime
  4. import subprocess
  5. import sys
  6. import termios
  7. ...    
  8. '''
  9. ser = serial.Serial(
  10.    port='/dev/ttyACM3',\
  11.    baudrate=230400,\
  12.    parity=serial.PARITY_NONE,\
  13.    stopbits=serial.STOPBITS_ONE,\
  14.    bytesize=serial.EIGHTBITS,\
  15.    timeout=0)#,\
  16. '''
  17. port = '/dev/ttyACM3'
  18. f = open(port)
  19. attrs = termios.tcgetattr(f)
  20. attrs[2] = attrs[2] & ~termios.HUPCL
  21. termios.tcsetattr(f, termios.TCSAFLUSH, attrs)
  22. f.close()
  23. ser = serial.Serial()
  24. ser.baudrate = 230400
  25. ser.port = port
  26. ser.parity=serial.PARITY_NONE
  27. ser.stopbits=serial.STOPBITS_ONE
  28. ser.bytesize=serial.EIGHTBITS
  29. print('dtr =', ser.dtr)
  30. ser.timeout=0
  31. ser.open()
  32. ...
Klockan tickar nu på ostörd av läsning från serieporten, efter den ändringen.

Arduinokoden behöver ännu en initiering till rätt fas av 0.5 Hz utgången till klockmotorn efter reset, när det i alla fall sker ibland. Fasen beror på om nästa sekund är udda eller jämn. Här kommer in litet extra trevligheter när jag vill implementera korrekt visning av skottsekunder... :mrgreen: för då ska sekundvisaren stå still på 60 en extra sekund.

Författare:  rvl [ 17.29 2019-03-17 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Ungefär såhär är det kopplat.
Bilaga:
uppkoppling.jpg
"Schema" i Arduinoanda. RTC-modul fanns inte i biblioteket, men det är 3.3 V, I²C data och klocka, jord samt den egenlödda Square Wave ut-pinnen.

Författare:  Icecap [ 17.40 2019-03-17 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Nu är DS323x ju förvisso ganska hygglig men definitivt inget för dig med den noggrannhet som du tydligen vill ha.

Vad jag vet finns det frekvensreferenser som baserar sig på GPS-data och som fungerar skapligt.

Själv har jag en DS3232 i mina klockor - samt en GPS jag kan koppla på (har bara 1 GPS men 2 klockor) och den synkar till sekunden när vilket duger helt fint till mig.

Om jag skulle ge mig på att kalibrera DS323x ville jag definitivt först skaffa en GPS med puls-utgång (menar att det redan finns i den jag har) innan jag gjorde annat. Sedan är det ju bara att ta 2 st Capture-ingångar och koppla till SQW hhv. GPS-pulsen och låta mjukvaran klara resten.

Författare:  rvl [ 17.53 2019-03-17 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Jo jag vet samt har GPS med PPS utgång och har sneglat på input capture på odelad cpu-klocka, men vill leka litet utan först och se vart jag når. (Ända tills temperaturen ändras och allt skiter sig.) 8)

2019-01-12:
rvl skrev:
De verkar skapligt noggranna de här rackarna. Tror jag ska skaffa en DS3231 själv och test litet tillsammans med nån GPS-modul.
Tack för inspirerande inlägg i den och andra trådar.

Författare:  rvl [ 19.59 2019-03-17 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Senaste version av Arduinokoden:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1. // Include the libraries
  2. #include <RtcDS3231.h>
  3. //Open the Library Manager and search for "Rtc by Makuna" and install
  4.  
  5. #include <Wire.h>
  6.  
  7. // Create new RTC module
  8. RtcDS3231<TwoWire> Rtc(Wire);
  9.  
  10. //const byte OFFSET = -32; // +1...
  11. //const byte OFFSET = -16; // -0.67
  12. //const byte OFFSET = -24; // +0.41
  13. //const byte OFFSET = -20; // -0.12
  14. //const byte OFFSET = -21; // -0.04
  15. const byte OFFSET = -22; // +0.6
  16. const byte OFFSET_MINUS = -21; // -0.04
  17. const byte OFFSET_PLUS = -22; // +0.06
  18.  
  19. // where to switch in addition to at 0
  20. const byte MAGIC_CONSTANT = 25; //minute based approach first...
  21.  
  22. //extremes test
  23. //const byte OFFSET = 127; // -17.8
  24. //const byte OFFSET = -128; // +
  25. //const byte OFFSET = 64; // -
  26. //const byte OFFSET = -64; // +
  27. const uint8_t INT_SECOND_TICK_PIN = 2; //2 or 3 on Uno. (Must have pin change interrupt.)
  28. const uint8_t SECOND_OUT_PIN = 12; //
  29.  
  30. // Create variables for time
  31. byte hours;
  32. byte minutes;
  33. byte seconds;
  34. byte old;
  35. byte oldM;
  36. uint16_t year;
  37. byte month;
  38. byte day;
  39. byte currentSetting = 0;
  40.  
  41. volatile int32_t _rtcTotalSecondsSince2000 = 0;
  42. volatile boolean _newSecond = false;
  43.  
  44. void secondInterupt() {
  45.   _rtcTotalSecondsSince2000++;
  46.   _newSecond = true;
  47.   digitalWrite(SECOND_OUT_PIN, !digitalRead(SECOND_OUT_PIN));
  48.   digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  49. }
  50.  
  51. void setup() {
  52.   // put your setup code here, to run once:
  53.   //Serial.begin(115200);
  54.   pinMode(LED_BUILTIN, INPUT);
  55.   Serial.begin(230400);
  56.   //Serial.begin(2000000);
  57.   Rtc.Begin();
  58.  
  59.   // Set up 1Hz square wave
  60.   //Rtc.writeSqwPinMode(DS3231_SquareWave1Hz);
  61.   //Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeClock);
  62.   //Rtc.SetSquareWavePinClockFrequency(DS3231SquareWaveClock_1Hz);
  63.  
  64.   // Attach the interrupt and use the internal pull up
  65.   attachInterrupt(digitalPinToInterrupt(INT_SECOND_TICK_PIN), secondInterupt, FALLING);
  66.   digitalWrite(INT_SECOND_TICK_PIN, HIGH);
  67.  
  68.   // Update RTC module time to compilation time
  69.   RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
  70.   //compiled += 7;  //transfer time W7
  71.   compiled += 9;  //transfer time U18
  72.   //Already set, comment this out:
  73.   //Rtc.SetDateTime(compiled);
  74.   //re set 2019-03-10 ~11 EET
  75.   //set 2019-03-03 ~15 EET
  76.  
  77.  
  78.   //Trying out Ageing Offset
  79.   //
  80.   Rtc.SetAgingOffset(OFFSET);
  81.   Rtc.ForceTemperatureCompensationUpdate(true);
  82.   // note!
  83.   //"The offset register is added to the capacitance
  84.   //array  during  a  normal  temperature  conversion,
  85.   //_if_the_temperature_changes_ !!!
  86.   //from the previous conversion, !!!
  87.   //or during a manual user conversion"
  88.   //
  89.   //Set as -32 on 2019-03-08 00:20 EET
  90.   //Set as -16 on 2019-03-12 00:20+ EET
  91.   // -24 ...-12 16:20
  92.   // -20 ...-12 21:40
  93.   // -21 ...-13 11:20 until ...-15 09:13
  94.  
  95.   old = 0;
  96.   oldM = 0;
  97.   pinMode(LED_BUILTIN, OUTPUT);
  98.   pinMode(SECOND_OUT_PIN, OUTPUT);
  99. }
  100.  
  101. void loop() {
  102.   // put your main code here, to run repeatedly:
  103.   if(_newSecond) {
  104.     Serial.println("*");
  105.     _newSecond = false;
  106.     //delay(100);
  107.  
  108.     if(_rtcTotalSecondsSince2000 < 1000) {  
  109.       //_rtcTotalSecondsSince2000 = Rtc.now().secondstime();
  110.       _rtcTotalSecondsSince2000 = Rtc.GetDateTime();
  111.       //.GetDateTime()
  112.     }
  113.    
  114.     updateTime(_rtcTotalSecondsSince2000);
  115.     printTime();
  116.   }
  117. }
  118.  
  119. void updateTime(RtcDateTime now) {
  120.    //RtcDateTime now = Rtc.GetDateTime();
  121.    hours = now.Hour();
  122.    minutes = now.Minute();
  123.    seconds = now.Second();
  124.    year = now.Year();
  125.    month = now.Month();
  126.    day = now.Day();
  127. }
  128.  
  129. #define countof(a) (sizeof(a) / sizeof(a[0]))
  130.  
  131. void printTime(){
  132.     char timestring[9];
  133.     snprintf_P(timestring,
  134.             countof(timestring),
  135.             PSTR("%02u:%02u:%02u"),
  136.             hours,
  137.             minutes,
  138.             seconds );
  139.     Serial.println(timestring);
  140.     //old = seconds;
  141.     if(0==seconds){
  142.       printDate();
  143.       updateRuleCheck();
  144.     }
  145. }
  146.  
  147. void printDate(){
  148.     //oldM = minutes;
  149.     char datestring[12];
  150.     snprintf_P(datestring,
  151.             countof(datestring),
  152.             PSTR("%04u-%02u-%02u "),
  153.             year,
  154.             month,
  155.             day );
  156.     Serial.print(datestring);
  157.     printTemperature();
  158.     //printTime();
  159.     printAgingOffset();
  160. }
  161.  
  162. void printTemperature(){
  163.     RtcTemperature temp = Rtc.GetTemperature();
  164.     Serial.print(temp.AsFloatDegC());
  165.     Serial.println("°C");
  166. }
  167.  
  168. void printAgingOffset(){
  169.   int8_t ao = Rtc.GetAgingOffset();
  170.   Serial.print("The Ageing Offset is set as: ");
  171.   Serial.println(0+ao);
  172. }
  173.  
  174. void updateRuleCheck(){
  175.   if(!(0==minutes | MAGIC_CONSTANT==minutes)){
  176.     return;
  177.   }
  178.   if(0==currentSetting){
  179.     currentSetting = Rtc.GetAgingOffset();
  180.   }
  181.   if(0==minutes & currentSetting != OFFSET_PLUS ){
  182.     updateOffset(OFFSET_PLUS);
  183.   }
  184.   if(MAGIC_CONSTANT==minutes & currentSetting != OFFSET_MINUS ){
  185.     updateOffset(OFFSET_MINUS);
  186.   }
  187.   return;
  188. }
  189.  
  190. void updateOffset(byte offset){
  191.   Rtc.SetAgingOffset(offset);
  192.   Rtc.ForceTemperatureCompensationUpdate(true);
  193.   currentSetting = offset;
  194. }
Åtmistone en del gammalt "skräp" borttaget.

Författare:  rvl [ 17.47 2019-03-20 ]
Inläggsrubrik:  Re: Min första Arduino - test av DS3231

Klockan tickar på snällt.
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
raw:
1553095595.9999661 @ 2019-03-20 17:26:35
interpolating
1553095596.000442
-0.029257152895265853 ppm ( 2019-03-16 17:21:07 )
-0.033864410921223324 ppm ( 2019-03-17 17:08:53 )
-0.031119272982074838 ppm ( 2019-03-18 15:27:23 )
-0.031751152875557284 ppm ( 2019-03-19 17:30:07 )
Enligt den metoden är den redan också nästan rätt, men enlig tidsignalmetoden är det ännu 12 ms "kvar" för officiella tiden att komma ikapp, så det tar några dygn ännu innan jag testar att röra nuvarande kalibreringsvärden, eller börjar koppla in PPS-GPS.
Bilaga:
12ms.png
96 kHz sampling rate nu. Pilottonen är ochså lätt synlig i signalen från radion när man zoomar litet, så jag kanske använder även den om det blir av att automatisera den här kalibreringsmetoden, som är fri från variationer i överföringstider, som NTP-synkningen lider av.

Hela projektet är mest för nöjes skull och för att se hur bra man kan tänkas hålla tiden utan referens.

Alla tidsangivelser är UTC + 1 timme
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/