Buggfix Plus
Aktuellt datum och tid: 01.00 2019-09-19

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 29 inlägg ]  Gå till sida Föregående  1, 2
Författare Meddelande
InläggPostat: 12.56 2019-03-16 
Användarvisningsbild

Blev medlem: 13.58 2016-04-05
Inlägg: 1830
Ort: Helsingfors
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 )


Upp
 Profil  
 
InläggPostat: 13.08 2019-03-16 
Användarvisningsbild

Blev medlem: 13.58 2016-04-05
Inlägg: 1830
Ort: Helsingfors
Såhär låter klockan tillsammans med tidssignal från radion.
Bilaga:
miksei.mp3


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 16.45 2019-03-16 
Användarvisningsbild

Blev medlem: 13.58 2016-04-05
Inlägg: 1830
Ort: Helsingfors
"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.  


Upp
 Profil  
 
InläggPostat: 16.49 2019-03-16 
Användarvisningsbild

Blev medlem: 13.58 2016-04-05
Inlägg: 1830
Ort: Helsingfors
Tidsignal och klocktick med "billigt digitaloscilloskop" dvs dator+Audacity.
Bilaga:
audioTick.png


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 20.55 2019-03-16 
Användarvisningsbild

Blev medlem: 13.58 2016-04-05
Inlägg: 1830
Ort: Helsingfors
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.


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 09.54 2019-03-17 
Användarvisningsbild

Blev medlem: 13.58 2016-04-05
Inlägg: 1830
Ort: Helsingfors
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 )


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 10.23 2019-03-17 
Användarvisningsbild

Blev medlem: 13.58 2016-04-05
Inlägg: 1830
Ort: Helsingfors
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.


Upp
 Profil  
 
InläggPostat: 11.59 2019-03-17 
Användarvisningsbild

Blev medlem: 13.58 2016-04-05
Inlägg: 1830
Ort: Helsingfors
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


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 14.01 2019-03-17 
Användarvisningsbild

Blev medlem: 13.58 2016-04-05
Inlägg: 1830
Ort: Helsingfors
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.


Upp
 Profil  
 
InläggPostat: 17.29 2019-03-17 
Användarvisningsbild

Blev medlem: 13.58 2016-04-05
Inlägg: 1830
Ort: Helsingfors
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.


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 17.40 2019-03-17 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 24039
Ort: Aabenraa, Danmark
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.


Upp
 Profil  
 
InläggPostat: 17.53 2019-03-17 
Användarvisningsbild

Blev medlem: 13.58 2016-04-05
Inlägg: 1830
Ort: Helsingfors
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.


Upp
 Profil  
 
InläggPostat: 19.59 2019-03-17 
Användarvisningsbild

Blev medlem: 13.58 2016-04-05
Inlägg: 1830
Ort: Helsingfors
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.


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 17.47 2019-03-20 
Användarvisningsbild

Blev medlem: 13.58 2016-04-05
Inlägg: 1830
Ort: Helsingfors
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.


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 29 inlägg ]  Gå till sida Föregående  1, 2

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 3 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
   
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010