Min första Arduino - test av DS3231

Berätta om dina pågående projekt.
Användarvisningsbild
rvl
Inlägg: 5720
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Min första Arduino - test av DS3231

Inlägg av rvl »

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: Markera allt

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 )
Användarvisningsbild
rvl
Inlägg: 5720
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Min första Arduino - test av DS3231

Inlägg av rvl »

Såhär låter klockan tillsammans med tidssignal från radion.
miksei.mp3
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
rvl
Inlägg: 5720
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Min första Arduino - test av DS3231

Inlägg av rvl »

"PWM"-version av Arduinokoden:

Kod: Markera allt

// Include the libraries
#include <RtcDS3231.h>
//Open the Library Manager and search for "Rtc by Makuna" and install
 
#include <Wire.h>
 
// Create new RTC module
RtcDS3231<TwoWire> Rtc(Wire);
 
//const byte OFFSET = -32; // +1...
//const byte OFFSET = -16; // -0.67
//const byte OFFSET = -24; // +0.41
//const byte OFFSET = -20; // -0.12
//const byte OFFSET = -21; // -0.04
const byte OFFSET = -22; // +0.06
const byte OFFSET_MINUS = -21; // -0.04
const byte OFFSET_PLUS = -22; // +0.06

// where to switch in addition to at 0
const byte MAGIC_CONSTANT = 25; //minute based approach first...

//extremes test
//const byte OFFSET = 127; // -17.8
//const byte OFFSET = -128; // +
//const byte OFFSET = 64; // -
//const byte OFFSET = -64; // +
const uint8_t INT_SECOND_TICK_PIN = 2; //2 or 3 on Uno. (Must have pin change interrupt.)

// Create variables for time
byte hours;
byte minutes;
byte seconds;
byte old;
byte oldM;
uint16_t year;
byte month;
byte day;
byte currentSetting = 0;

volatile int32_t _rtcTotalSecondsSince2000 = 0;
volatile boolean _newSecond = false;

void secondInterupt() {
  _rtcTotalSecondsSince2000++;
  _newSecond = true;
  digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}

void setup() {
  // put your setup code here, to run once:
  //Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(230400);
  //Serial.begin(2000000);
  Rtc.Begin();

  // Set up 1Hz square wave
  //Rtc.writeSqwPinMode(DS3231_SquareWave1Hz);
  //Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeClock);
  //Rtc.SetSquareWavePinClockFrequency(DS3231SquareWaveClock_1Hz);

  // Attach the interrupt and use the internal pull up
  attachInterrupt(digitalPinToInterrupt(INT_SECOND_TICK_PIN), secondInterupt, FALLING);
  digitalWrite(INT_SECOND_TICK_PIN, HIGH);
 
  // Update RTC module time to compilation time
  RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
  //compiled += 7;  //transfer time W7
  compiled += 9;  //transfer time U18
  //Already set, comment this out:
  //Rtc.SetDateTime(compiled);
  //re set 2019-03-10 ~11 EET
  //set 2019-03-03 ~15 EET


  //Trying out Ageing Offset
  //
  //Rtc.SetAgingOffset(OFFSET);
  //Rtc.ForceTemperatureCompensationUpdate(true);
  // note!
  //"The offset register is added to the capacitance 
  //array  during  a  normal  temperature  conversion,
  //_if_the_temperature_changes_ !!!
  //from the previous conversion, !!!
  //or during a manual user conversion"
  //
  //Set as -32 on 2019-03-08 00:20 EET
  //Set as -16 on 2019-03-12 00:20+ EET
  // -24 ...-12 16:20
  // -20 ...-12 21:40
  // -21 ...-13 11:20 until ...-15 09:13
 
  old = 0;
  oldM = 0;
}
 
void loop() {
  // put your main code here, to run repeatedly:
  /*
  delay(10);
  updateTime();
  if(minutes != oldM){
    printDate();
  }
  else if(seconds != old){
    printTime();
  }
  */
  if(_newSecond) {
    Serial.println("*");
    _newSecond = false;
    //delay(100);

    if(_rtcTotalSecondsSince2000 < 1000) {  
      //_rtcTotalSecondsSince2000 = Rtc.now().secondstime();
      _rtcTotalSecondsSince2000 = Rtc.GetDateTime();
      //.GetDateTime()
    }
    
    // Display the  time 
    /*     
    int32_t dayTotalSecondsNow = _rtcTotalSecondsSince2000;
    uint8_t hour = dayTotalSecondsNow / 3600 % 24;
    uint8_t minute = dayTotalSecondsNow / 60 % 60;
    uint8_t second = dayTotalSecondsNow % 60;

    Serial.print(hour);
    Serial.print(":");
    Serial.print(minute);
    Serial.print(":");
    Serial.println(second);
    */
    updateTime(_rtcTotalSecondsSince2000);
    printTime();
  }
}
 
void updateTime(RtcDateTime now) {
   //RtcDateTime now = Rtc.GetDateTime();
   hours = now.Hour();
   minutes = now.Minute();
   seconds = now.Second();
   year = now.Year();
   month = now.Month();
   day = now.Day();
}
 
#define countof(a) (sizeof(a) / sizeof(a[0]))
 
void printTime(){
    char timestring[9];
    snprintf_P(timestring,
            countof(timestring),
            PSTR("%02u:%02u:%02u"),
            hours,
            minutes,
            seconds );
    Serial.println(timestring);
    //old = seconds;
    if(0==seconds){
      printDate();
      updateRuleCheck();
    }
}
 
void printDate(){
    //oldM = minutes;
    char datestring[12];
    snprintf_P(datestring,
            countof(datestring),
            PSTR("%04u-%02u-%02u "),
            year,
            month,
            day );
    Serial.print(datestring);
    printTemperature();
    //printTime();
    printAgingOffset();
}
 
void printTemperature(){
    RtcTemperature temp = Rtc.GetTemperature();
    Serial.print(temp.AsFloatDegC());
    Serial.println("°C");
}

void printAgingOffset(){
  int8_t ao = Rtc.GetAgingOffset();
  Serial.print("The Ageing Offset is set as: ");
  Serial.println(0+ao);
}

void updateRuleCheck(){
  if(!(0==minutes | MAGIC_CONSTANT==minutes)){
    return;
  }
  if(0==currentSetting){
    currentSetting = Rtc.GetAgingOffset();
  }
  if(0==minutes & currentSetting != OFFSET_PLUS ){
    updateOffset(OFFSET_PLUS);
  }
  if(MAGIC_CONSTANT==minutes & currentSetting != OFFSET_MINUS ){
    updateOffset(OFFSET_MINUS);
  }
  return;
}

void updateOffset(byte offset){
  Rtc.SetAgingOffset(offset);
  Rtc.ForceTemperatureCompensationUpdate(true);
  currentSetting = offset;
}

Användarvisningsbild
rvl
Inlägg: 5720
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Min första Arduino - test av DS3231

Inlägg av rvl »

Tidsignal och klocktick med "billigt digitaloscilloskop" dvs dator+Audacity.
audioTick.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
rvl
Inlägg: 5720
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Min första Arduino - test av DS3231

Inlägg av rvl »

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.
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.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
rvl
Inlägg: 5720
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Min första Arduino - test av DS3231

Inlägg av rvl »

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".
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: Markera allt

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 )
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
rvl
Inlägg: 5720
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Min första Arduino - test av DS3231

Inlägg av rvl »

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.
Användarvisningsbild
rvl
Inlägg: 5720
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Min första Arduino - test av DS3231

Inlägg av rvl »

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.
bootloader.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
rvl
Inlägg: 5720
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Min första Arduino - test av DS3231

Inlägg av rvl »

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: Markera allt

import serial
import time
import datetime
import subprocess
import sys
import termios
...    
'''
ser = serial.Serial(
    port='/dev/ttyACM3',\
    baudrate=230400,\
    parity=serial.PARITY_NONE,\
    stopbits=serial.STOPBITS_ONE,\
    bytesize=serial.EIGHTBITS,\
    timeout=0)#,\
'''
port = '/dev/ttyACM3'
f = open(port)
attrs = termios.tcgetattr(f)
attrs[2] = attrs[2] & ~termios.HUPCL
termios.tcsetattr(f, termios.TCSAFLUSH, attrs)
f.close()
ser = serial.Serial()
ser.baudrate = 230400
ser.port = port
ser.parity=serial.PARITY_NONE
ser.stopbits=serial.STOPBITS_ONE
ser.bytesize=serial.EIGHTBITS
print('dtr =', ser.dtr)
ser.timeout=0
ser.open()
...
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.
Användarvisningsbild
rvl
Inlägg: 5720
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Min första Arduino - test av DS3231

Inlägg av rvl »

Ungefär såhär är det kopplat.
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.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Min första Arduino - test av DS3231

Inlägg av Icecap »

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.
Användarvisningsbild
rvl
Inlägg: 5720
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Min första Arduino - test av DS3231

Inlägg av rvl »

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:
Tack för inspirerande inlägg i den och andra trådar.
Användarvisningsbild
rvl
Inlägg: 5720
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Min första Arduino - test av DS3231

Inlägg av rvl »

Senaste version av Arduinokoden:

Kod: Markera allt

// Include the libraries
#include <RtcDS3231.h>
//Open the Library Manager and search for "Rtc by Makuna" and install
 
#include <Wire.h>
 
// Create new RTC module
RtcDS3231<TwoWire> Rtc(Wire);
 
//const byte OFFSET = -32; // +1...
//const byte OFFSET = -16; // -0.67
//const byte OFFSET = -24; // +0.41
//const byte OFFSET = -20; // -0.12
//const byte OFFSET = -21; // -0.04
const byte OFFSET = -22; // +0.6
const byte OFFSET_MINUS = -21; // -0.04
const byte OFFSET_PLUS = -22; // +0.06

// where to switch in addition to at 0
const byte MAGIC_CONSTANT = 25; //minute based approach first...

//extremes test
//const byte OFFSET = 127; // -17.8
//const byte OFFSET = -128; // +
//const byte OFFSET = 64; // -
//const byte OFFSET = -64; // +
const uint8_t INT_SECOND_TICK_PIN = 2; //2 or 3 on Uno. (Must have pin change interrupt.)
const uint8_t SECOND_OUT_PIN = 12; //

// Create variables for time
byte hours;
byte minutes;
byte seconds;
byte old;
byte oldM;
uint16_t year;
byte month;
byte day;
byte currentSetting = 0;

volatile int32_t _rtcTotalSecondsSince2000 = 0;
volatile boolean _newSecond = false;

void secondInterupt() {
  _rtcTotalSecondsSince2000++;
  _newSecond = true;
  digitalWrite(SECOND_OUT_PIN, !digitalRead(SECOND_OUT_PIN));
  digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}

void setup() {
  // put your setup code here, to run once:
  //Serial.begin(115200);
  pinMode(LED_BUILTIN, INPUT);
  Serial.begin(230400);
  //Serial.begin(2000000);
  Rtc.Begin();

  // Set up 1Hz square wave
  //Rtc.writeSqwPinMode(DS3231_SquareWave1Hz);
  //Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeClock);
  //Rtc.SetSquareWavePinClockFrequency(DS3231SquareWaveClock_1Hz);

  // Attach the interrupt and use the internal pull up
  attachInterrupt(digitalPinToInterrupt(INT_SECOND_TICK_PIN), secondInterupt, FALLING);
  digitalWrite(INT_SECOND_TICK_PIN, HIGH);
 
  // Update RTC module time to compilation time
  RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
  //compiled += 7;  //transfer time W7
  compiled += 9;  //transfer time U18
  //Already set, comment this out:
  //Rtc.SetDateTime(compiled);
  //re set 2019-03-10 ~11 EET
  //set 2019-03-03 ~15 EET


  //Trying out Ageing Offset
  //
  Rtc.SetAgingOffset(OFFSET);
  Rtc.ForceTemperatureCompensationUpdate(true);
  // note!
  //"The offset register is added to the capacitance 
  //array  during  a  normal  temperature  conversion,
  //_if_the_temperature_changes_ !!!
  //from the previous conversion, !!!
  //or during a manual user conversion"
  //
  //Set as -32 on 2019-03-08 00:20 EET
  //Set as -16 on 2019-03-12 00:20+ EET
  // -24 ...-12 16:20
  // -20 ...-12 21:40
  // -21 ...-13 11:20 until ...-15 09:13
 
  old = 0;
  oldM = 0;
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(SECOND_OUT_PIN, OUTPUT);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  if(_newSecond) {
    Serial.println("*");
    _newSecond = false;
    //delay(100);

    if(_rtcTotalSecondsSince2000 < 1000) {  
      //_rtcTotalSecondsSince2000 = Rtc.now().secondstime();
      _rtcTotalSecondsSince2000 = Rtc.GetDateTime();
      //.GetDateTime()
    }
    
    updateTime(_rtcTotalSecondsSince2000);
    printTime();
  }
}
 
void updateTime(RtcDateTime now) {
   //RtcDateTime now = Rtc.GetDateTime();
   hours = now.Hour();
   minutes = now.Minute();
   seconds = now.Second();
   year = now.Year();
   month = now.Month();
   day = now.Day();
}
 
#define countof(a) (sizeof(a) / sizeof(a[0]))
 
void printTime(){
    char timestring[9];
    snprintf_P(timestring,
            countof(timestring),
            PSTR("%02u:%02u:%02u"),
            hours,
            minutes,
            seconds );
    Serial.println(timestring);
    //old = seconds;
    if(0==seconds){
      printDate();
      updateRuleCheck();
    }
}
 
void printDate(){
    //oldM = minutes;
    char datestring[12];
    snprintf_P(datestring,
            countof(datestring),
            PSTR("%04u-%02u-%02u "),
            year,
            month,
            day );
    Serial.print(datestring);
    printTemperature();
    //printTime();
    printAgingOffset();
}
 
void printTemperature(){
    RtcTemperature temp = Rtc.GetTemperature();
    Serial.print(temp.AsFloatDegC());
    Serial.println("°C");
}

void printAgingOffset(){
  int8_t ao = Rtc.GetAgingOffset();
  Serial.print("The Ageing Offset is set as: ");
  Serial.println(0+ao);
}

void updateRuleCheck(){
  if(!(0==minutes | MAGIC_CONSTANT==minutes)){
    return;
  }
  if(0==currentSetting){
    currentSetting = Rtc.GetAgingOffset();
  }
  if(0==minutes & currentSetting != OFFSET_PLUS ){
    updateOffset(OFFSET_PLUS);
  }
  if(MAGIC_CONSTANT==minutes & currentSetting != OFFSET_MINUS ){
    updateOffset(OFFSET_MINUS);
  }
  return;
}

void updateOffset(byte offset){
  Rtc.SetAgingOffset(offset);
  Rtc.ForceTemperatureCompensationUpdate(true);
  currentSetting = offset;
}
Åtmistone en del gammalt "skräp" borttaget.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
rvl
Inlägg: 5720
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Min första Arduino - test av DS3231

Inlägg av rvl »

Klockan tickar på snällt.

Kod: Markera allt

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.
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.

Edit-test 2021-02-09 tidsstämpel, eller nej???
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar