[time-nuts] SR620 TCXO calibration

David C. Partridge david.partridge at perdrix.co.uk
Mon Jun 19 16:43:51 EDT 2017

Yes please. ...

-----Original Message-----
From: time-nuts [mailto:time-nuts-bounces at febo.com] On Behalf Of Dr. David Kirkby (Kirkby Microwave Ltd)
Sent: 19 June 2017 21:03
To: Discussion of precise time and frequency measurement
Subject: Re: [time-nuts] SR620 TCXO calibration

On 19 June 2017 at 15:35, David C. Partridge <david.partridge at perdrix.co.uk>

> I think I'm being dense, but I can't work out how to get this thing to
> display CalDat 04.   I have managed to get it to display CalDat 0 value,
> but
> can't work out how to step through to view adjust CalDat 04.
> Once I do  get there, how do I manage to adjust the CalDat value while 
> observing the output of measuring my GPSDO 10MHz output at the same time?
> Please could someone put me out of my misery?
> Thanks
> Dave

I can't recall how you step the data, but it must be in the manual.

I wrote a bit of C code that attempts to correct the timebase, if 10 MHz is put into channel A. It measures the frequency on channel A, then adjust the crystal frequency until the frequency is 10 MHz. That's probably not the best way on a TI counter, but seems to work reasonably well - at least any errors are small compared to the fact that only integer values may be programmed into the calbytes. Hence it seems impossible to fully correct this.

One issue is that frequency shift is non-linear with respect to the calbytes. So the approach I took was to shift the value by 4, see the effect of the shift, and then use that to try to work out a suitable correction.

Below is the bit of C-code. If you want the complete set of code, which reads data from the SR620, I can send you it. I don't think it is well commented, and in any case has only been tested on Solaris. It will only work with an NI card, but I would expect it to work under

      output(device_descriptor,"MODE3;"); /* Set frequency mode */
      output(device_descriptor,"SRCE0;");  /* Measure source A */
      do {
        if (fabs(frequency_error) < 0.0008)  {
          printf("GOOD ENNOUGH frequency error=%lf\n\n",frequency_error);
        printf("cb4=%d f=%lf\n",calbyte_4, frequency);

        if(frequency_error > 0)
          set_calbyte(device_descriptor, 4, calbyte_4+3);
          set_calbyte(device_descriptor, 4, calbyte_4-3);

        printf("Changed calbyte 4 a little cb4=%d f=%lf\n",calbyte_4, frequency);

        if(frequency_error > 0)
          frequency_change_per_calbyte=(new_frequency-frequency)/3; /* in Hz/calbyte */
          frequency_change_per_calbyte=-(new_frequency-frequency)/3; /* in Hz/calbyte */

        /* Do a correction of half the value calculated */

        /* Attempt to correct the frequency */
        set_calbyte(device_descriptor, 4, calbyte_4+calbyte_change);

        /* Read the frequency, then exit if within an acceptable tollerence */
        printf("new cb4=%d frequency error=%lf\n\n",calbyte_4, frequency_error);
      } while (fabs(frequency_error) > 0.0008);
time-nuts mailing list -- time-nuts at febo.com To unsubscribe, go to https://www.febo.com/cgi-bin/mailman/listinfo/time-nuts
and follow the instructions there.

More information about the time-nuts mailing list