Top Page OCXO 較正自動化のための「Vcon I/F」の製作
自作・実験工程のメモとして
01.Feb.2021
(最終更新:2021/02/14)


 2020年は、OCXO較正器(OCXO Calibrator以下、OCXO Calib.)を中心に取り組み、完成の目途が立った後も、デバッグを兼ねて手持ちのOCXO(EPSON TOYOCOM)を調整していましたが、最後の数mHzを10.0MHzまでに追い込むことに苦労していました。
そのため、OCXOのVC端子(Uinとも記載有り。以下、Vconと表記する)の電圧を小数点以下3桁が読めるデジタルテスターを購入して合わせていましたが、それでも苦戦していました。
そこで、今までテスターを見ながらマイナスドライバーで調整する手動での手順を、Vconの電圧をCPU側からコントロールして「放っておいても10.0MHzに合わせてくれる」ような自動化につながるツールとしてOCXO Calib.を発展させるため、本テーマに取り組んでみました。
私自身はそこまで正確な10.0MHzが必要な訳ではなく、「OCXOを持っているが、周波数は本当に(ある程度)正確な発振をしているか?」という不安からスタートしたテーマを元に、関連テーマを長々と引っ張っています。
 また、実現に当たってはテーマ名に有りますように、Net上の『10MHz GPSDOの作製』という自作情報を元に回路等を引用させていただき、先の「OCXO Calib.」と今回の付加基板「VconI/F」でGPSDO(ホールドオーバー機能搭載)を実現するとともに、OCXO単体でも高い調整精度で較正できるように考えてみました。

このページに興味のある方は、前提としている「OCXO Calib.」の製作過程を掲載している前編続編番外編完結編Part4をご確認ください。






OCXO(CTS 1250019)を載せた基板をケース(タカチ:CU-12N)に入れて付加した「Vcon I/F」基板
VconI/F」の取付は秋月の2.6mm用六角スペーサー(16.5mmと11mm)を繋ぎ、2箇所だけ止めました。

Edit by bluegriffon 3.1

1.OCXO Vcon I/Fの回路

 文頭にも書きましたが、Net上の記事を参考にさせていただいた簡単な回路で、OCXO基板のVcon電圧をボリュームに代わってコントロールすることを目指します。
回路をそのままブレッドボード上で検証せず、基板発注した関係で基板は修正が必要ですが、この回路は修正済みです。
必要電圧を求めるための抵抗値はエクセル(私はLiberOfficeを使用)で可変範囲を想定しながら変更しています。


■.OCXO Vcon I/Fの回路

クリックでpdfファイルが開きます。
当初、何も考えずマイクロチップのDAC MCP4726を想定していましたが、単体での電源ON時にEEPROMの設定値で出力しないことが分かり、MCP4725に変更しています。
上記の「MCP4726が電源ON時に設定値で出力しない・・・」は、私の勘違いで、データシートを読み間違ったと思います。
もう一度見ていると、『最初のEEPROMの初期値がオールZEROになっている』部分を読み違えて、注釈の
『デバイスが顧客に出荷されたときのデフォルト構成。 POR / BOR値は、対応する不揮発性構成ビットを書き込むことによって変更できます。』部分を見落としていました。 Google翻訳使用 (2021/02/14)
また、回路上では、実測の電流や計算上の電圧をメモとしていれています。


2.OCXO Vcon I/F PCBの設計と修正

 上記 1.項 に有りますように簡単な回路ですので、ブレッドボードや穴あき基板に組んでも良いようなものですが、小さくまとめたい為にPCBを発注してしまいました。
そのため、毎回のようにある修正が今回も発生したため、チップ上にジャンパー線を入れて対応しています。


■.PCBの3Dビューアー

1.U1は、実際には78L05(TO-92)を使用します。
2.ただし、OCXO Calib.側に5Vを供給する構成にした場合を考えて、200mAレギュレータのパターンも用意しています。
3.今回の修正箇所は、U3(シルク:MCP4726)をMCP4725に変更することにともなうパターン変更が有ります。
4.上面右側のP2(3ピンヘッダ)からOCXO基板の多回転ボリューム(取り外し)に接続します。
5.手前側のJ3(4ピン)は、OCXO Cailb.本体からくるI2C端子でこの端子を使ってコントロールします。
6.基板サイズは30mm x 40mmにまとめました。

■.実PCB(U3修正済み)画面 修正不要でした

1.OCXO Calib.本体側もですが、基板上のコネクタはピンヘッダを使うことにしました。
2.U1の部分は、先の説明に有りますようにTO-92のスルーホールパターンに78L05をハンダ付けしています。
3.入力の電圧はOCXO側から取り入れ、電流値は12Vで8.72mA(実測値)になります。

■.基板のパターンカット(USB簡易顕微鏡にて) 不要の工程でした

1.U3部の6ピンのパターンをカットします。
2.あとは、テスターで導通が無いことを確認して修正完了です。

■.基板修正とチップ素子上にジャンパー線(USB簡易顕微鏡にて) 不要の工程でした

1.MCP4725の6ピン(A0)を2ピン(G)に落とします。
2.はんだ付けの後は、フラックス除去剤を綿棒に含ませて清掃しました。
3.それでもソケット等を配線した後なのでフラックス除去スプレーが使用できず、チップ下のフラックスが取り切れません。



3.新しく手配したOCXO

 昨年の夏に入手したOCXOは手放してしまったので、改めてAliExpressで手配してみました。
以前の品と違うものを試してみようとしましたが、手にしてみると私の勘違いで夏に手配したものと同じタイプ(navicom)や、少しでも安くと思いCTSのOCXOは基板付きの中古品を注文してしまい、取り外すのに苦労しました。

■.昨年の夏に入手した品と同じタイプのOCXO(navicom)
1.この評価基板は1枚だけなので、OCXO-navicomを外しましたが、スルーホールの穴が狭くOCXOの足が太いため、外すときに
スルーホール穴(51x41用穴)が外れてしまいました。
2.もう一つのOCXOは51x51サイズのため、取付に支障は有りませんが自分でパターンを起こすときは注意したいと思います。

■.基板付き中古OCXO(CTS 1250019)
1.この基板付き中古品は、Net上ではMorion Double oven MV89Aの代替品との紹介が有ります。
2.Net上で主に新品が出回っているように思いますが、詳細は分かりません。
3.この品は、製造が2008年と読み取れます。

■.基板付き中古OCXO(CTS 1250019)の外した基板
1.この基板からの取り外し作業が有るため、(株)エンジニアのハンダ吸取器(SS-02)を購入して備えましたが、手こずりました。
2.ハンダごて5本と2人がかりで同時にやればよかったと思いますが、そんなに多くのハンダごてを持っているわけでも無く、次回注文することが有れば取り外し品を手配したいと思います。

■.中古OCXO(CTS 1250019)の実装
1.緑のOCXO評価基板はこの項最初にありますOCXO(navicom)が載っていたものです。
2.ケースは昨年の夏に入手したOCXOの時と同じCU-12Nを使いましたが、今回は電源コネクタ(DC-J)を別に取付けて基板の位置を変えています。
3.手前側に見えるのが、多回転ボリュームの後に付けたピンヘッダ・ソケットです。
4.ピンヘッダーは、ボリュームのスルーホールの穴が小さく、通常品が入らず細ピンヘッダーを無理やり入れたようなギリギリの状態です。
5.本品だけかどうかは分かりませんが、Vconの電圧は2.5V前後になります。(別のTOYOCOM品は4.9V前後)

■.OCXO(CTS 1250019)を横から拡大
1.navicomが載っていた基板からOCXOを外し、CTSをリード線(約2cm)を使って取付けています。
2.OCXOを入替(評価)するときは、1ピン毎にハンダ付けできるため基板のスルーホールを痛めることは無いと思います。




4.較正自動化の手順

 OCXO Calib.だけの較正の手順は、周波数を測定してその誤差を確認し、その誤差を少なくするようにOCXOの多回転ボリュームを回します。
当初はこの手順通りに、予め設定した固定の変化量を計測結果を元に加減算し、少しづつVconに加える電圧を変更していましたが、それでは時間がかかり過ぎるのでDAC(MCP4725)の、分解能(12ビット)の段階(1/4096)当りの周波数変化量を最初に求めるやり方に変更しています。(以下、変化量を mHz(1LSB) と表記します。)
この変化量mHz(1LSB)を当てはめてみると、事前の準備は必要ですが「mHz台の誤差」まで調整するのに1〜2時間で調整できる目途が立ちました。
更に良いやり方や、実際のGPSDOのソフト処理がどのようになっているかは、その手順を覗いていませんのでわかりませんが、一つのやり方として紹介しておきます。ただし、既に『当たり前の手順』となっているかもしれないことを、予めお断りしておきます。


■.全体の流れ概要と新画面の追加

 1.OCXO Calib.とVconI/Fの接続 

 2.Vconの設定値確認とモードをManualに設定 

 3.DAC(MCP4725)のRegisterへDAC値(12bit)の中間値2048をセット 

 4.GATE時間1秒〜10秒で、周波数をカウントしながらVconI/Fのボリュームを調整 

 5.GATE時間1000秒に設定 

 6.DAC値に1000をセットして周波数をカウント(1回)し、f1をメモする 

 7.DAC値に3000をセットして周波数をカウント(1回)し、f2をメモする 

 8.f1 f2 からDAC値1ビット当りの周波数変化量(0.?????mHz)を求める 

 9.変化量を mHz(1LSB) へ入力してOCXO Calib.内に記憶 

10.モードをAutoに設定して、計測を開始([STRT]ボタン) 

11.数回の連続測定で10MHzの許容値内に収まったら停止して、DAC内のEEPROMに記憶する 


今回の追加で、画面に追加表示項目並びにMENUを追加しました。
▼メイン画面に、MODEDAC値を表示するようにしました。

▼もしVconの接続がされていないときは、vcOFFと表示するようにしました。

▼Config MENUに「5.Vcon Setting」 の追加

▼「5.Vcon Setting の内容」

 1.OCXO Calib.とVconI/Fの接続 


電源用を除くI2Cの信号を本体から引き出した線でつなぎます。
また、OCXOの電源は事前に投入し、必要十分な時間をかけて温めておく。

OCXO Calib.本体側は、予め用意していたI2Cのコネクタに接続します。
また、I2Cの電源は、デフォルト(3.3V)から5Vにハンダジャンパーで変更する必要が有ります。

 2.Vconの設定値確認とモードをManualに設定 

(MENU番号50)
1.ここでVconの接続ができているかと各設定を確認します。


2.未接続の状態でも、本メニューを開くと接続確認をして状態を表示します。
3.確認が終わったら戻って、(MENU番号51)を開きます。


Auto・Manualの切り替えは、下段のボタンで行います。
 

 3.DAC(MCP4725)のRegisterへDAC値(12bit)の中間値2048をセット 

(MENU番号52)
1.DAC値は0〜4095までの範囲に制限しています。
2.桁オーバー等では、0クリヤーされるようにしています。
3.今までの値を残したければ、「RET」で戻ることができます。
 

 4.GATE時間1秒〜10秒で、周波数をカウントしながらVconI/Fのボリュームを調整 

1.DACの変化量だけでは周波数の調整範囲が少なすぎる(例:約0.9Hz)ため、粗調整用ボリュームで±0.1Hz程度に調整する。

 5.GATE時間1000秒に設定 

「GATE」ボタンで切換る。

 6.DAC値に1000をセットして周波数をカウント(1回)し、f1をメモする 

(MENU番号52)


 7.DAC値に3000をセットして周波数をカウント(1回)し、f2をメモする 

(MENU番号52)


 8.f1 f2 からDAC値1ビット当りの周波数変化量(0.?????mHz)を求める 

1.(MENU番号55)にも簡単な手順や計算式を入れています。
2.f1 (DAC=1000指定)、f2 (DAC=3000指定)の周波数の差 fd (絶対値)をmHz台で求めます。
3.fd をf1 f2 間のDACの差(2000)で割って、ビット当たりの変化量を求めます。
 

 9.変化量を mHz(1LSB) へ入力してOCXO Calib.内に記憶 

(MENU番号53)

1.求めた変化量を mHzの単位で mHz(1LSB) に入力します。
2.入力した数値が異常値で無ければ、その数値を OCXO Calib. 側のEEPROMにsaveします。
3.終了時は入力した数値を1秒ほど表示して戻ります。
4.もし、0(ZERO)を入力した場合は警告を出すようにしました。

10.モードをAutoに設定して、計測を開始([STRT]ボタン) 

1.(MENU番号55)でAutoに設定
2.DAC値(ここでは3000)は変更する必要無し。
3.1回の計測で、ほぼ数mHz以内に収まると思います。

11.数回の連続測定で10Hzの許容値に収まったら停止して、DAC内のEEPROMに記憶する 

(MENU番号54)
1.DAC(MCP4725)内のEEPROMに記憶します。
2.次回の立ち上げ(電源ON)から、OCXO Calib.を接続していなくても、VconI/Fを載せたOCXO単体でこの設定値を元に立ち上がります。(暖気運転時間は必要)



■.上記 4.の辺りから記録したLOG画面

1.最初の3行は、DAC値に2048を入れた粗調整後の状態です。
2.LOGの右端に"Vcon"という列を追加してDAC値を記録します。
3.次にDAC値10003000をそれぞれ1回実行し、両周波数の差を求めます。
4.その差を mHz(1LSB) に変換し(今回は、0.222mHz)入力後に、モードをAutoに変えて通常の計測をします。
5.2回目の時点で、DAC値2342に書き換わった状態で1mHzの誤差まで合わせられたことに成ります。
6.ここでは夜中にそのまま走らせていますが、その後数回計測して安定していればEEPROMに書きこんで、較正は完了です。

■.誤差検出における許容範囲の考え
1.上記のようにカウンタタイプの誤差検出では、9,999,999.999Hzから10,000,000.000Hzの間を許容値としています。
2.上記許容値の範囲外をカウントしたときに、補正の動作を実行します。


■.上記較正後にGATE時間を一万秒で2回走らせた後、再度千秒で約7時間経過のLOG
1.GATE時間一万秒では、最初の計測の誤差(0.0002Hz)からDAC値を+1。
2.DAC値の1LSB当りの周波数変化量が0.222mHz(今回使ったCTS 1250019の場合)なので、これ以上の補正は不可能となります。
3.その後、GATE時間千秒で7時間ほど計測を続けましたが、たまたまGPS衛星の乱れ?やノイズ?の影響も無く安定状態を維持していました。

■.計測中のOCXO Calib.の画面表示





5.VconI/F用ソフト

 ソフトの処理は今までのカウント周期の中で、周波数をカウントし終わるとその差によりDACに与える設定値を変更するやり方で進めます。
ここではまだ、10.000MHzOCXOの較正中なのか通常の周波数カウント中なのかの判定等は入れていなくて、操作で自動補正を実施『する・しない』設定するにとどめています。
 また、ノイズ等による一時的な周波数変化への誤対応回避も入れてみましたが、起こりうる事象全てに対応できるはずも無く、是非のほどは分かりません。しかし、何はともあれ前項の「誤差検出における許容範囲の考え」に基づきテストしてみました。

■.
補正のルールとGATE=1000Sec時の処理(例)
    // ■■■■ VconValueが上がると周波数は下がる(逆特性) ■■■■
    // 誤差が有り過ぎるときの処理
    // その他を追加する
    //
    // Vcon MODE= Auto の場合で且つ GATE=1000Sec, 10^4Secの場合のみ自動補正する。
    // 許容値内(例)10--0.000Hz〜9--9.999Hz の場合は、補正はせずSTABLE++をする。
    // 許容値±0.002 までの小誤差は、STABLEが9まで加算していれば見送り、
    //      それ以下の場合は値を縮小して補正する。ともに、STABLEを-2する。
    // 許容値±0.003 以上の誤差は、STABLEが10まで加算していれば見送り、
    //      それ以下の場合は計算値もって補正する。ともに、STABLEを-3する。
    // STABLEは、0から10の間の値とする。


    B4VconValue = VconValue;
    if (VconAUTO == 1) {      // Vcon AUTO MODE の時に実行

      // ゲート時間により、
      switch (gatePRM) {
<<省略>>
        case 3:
          gosa = dFrqReg - 10000000.000;
          tmpdac = fabs(gosa) * 1000 / UNI.dmHz;    // fabs(gosa) 絶対値を求める

          if (gosa >= 0.003) {          // プラス方向に、0.003以上の誤差

            if (stable < 10) VconValue += tmpdac;

            // 大幅な許容値外なので安定状態のカウントを-3する
            if (stable > 1) stable -= 3; else stable = 0;

          } else if (gosa >= 0.001) {   // プラス方向に、0.002から0.001の誤差

            // 安定状態が9未満なら補正する(9&10なら補正を一回見送る:実験中)
            if (stable < 9) VconValue += (tmpdac / 2);   // 大幅な変化を抑制

            // 許容値外なので安定状態のカウントを-2する
            if (stable > 1) stable -= 2; else stable = 0;

          } else if (gosa <= -0.004) {  // マイナス方向に、0.004以上の誤差
            if (stable < 10) VconValue -= tmpdac;

            // 許容値外なので安定状態のカウントを-3する
            if (stable > 1) stable -= 3; else stable = 0;

          } else if (gosa <= -0.002) {  // マイナス方向に、0.003から0.002の誤差

            // 安定状態が9未満なら補正する(9&10なら補正を一回見送る:実験中)
            if (stable < 9)  VconValue -= (tmpdac / 3);  // 大幅な変化を抑制

            // 大幅な許容値外なので安定状態のカウントを-2する
            if (stable > 1) stable -= 2; else stable = 0;

          } else {                      // +0.000から-0.001までの誤差(許容値内)
            if (stable < 10) {          // 10未満なら安定状態を加算
              stable++;
            }
          }
          if (VconValue > 4095) VconValue = 4095;
          break;

<<省略>>

        default:    // 0Hz台の測定中は自動加減しない。(I/F多回転VRで合わせる)
          //        gosa = 10000000 - dFrqReg;
          //        if (gosa >= 2) VconValue += 200;
          //        if (gosa <= -2) VconValue -= 200;
          break;
      }
      if (VconI2C == 0) {     // Vcon 接続中なら
        vconFastSet(VconValue);   // ■■■■■ VconへDAC値をセット■■■■■■■■
      }
    }


急激な補正を掛けない方が良い安定状態の長さが10で適切かどうかが不明です。


■.OCXO(CTS)のVconによる制御の実測値
1.いずれも、3時間電源OFFにしていたOCXOを、電源ON5分後より計測スタートしています。
2.青い線は、補正有の周波数変動で、オレンジ色のVcon(DAC値)により制御された出力結果です。
3.緑色の線は、別の日に同じ条件で制御せずに(Manual)周波数変化を約11時間計測したグラフです。
4.補正有は、3回目の計測より安定(GPSDOのような)状態にあり、補正無はこの後もじっくり10.0MHzに近づいていきます。


■.OCXO(CTS)のVconによる制御の実測値(補正有)  (2021/02/10)
一つ前のグラフに有る緑色の線(補正無)後に約2日間連続で記録したグラフになります。
雰囲気だけは補正有で±2mHz以内に収まっているようです。
X軸ラベル151の辺りは、短時間の間にマイナス・プラスの両方向に変動しており、補正ルールの影響かも知れません。
補正値を見れば、2353で始まり2353に戻っていますので、神経質にならずにこの値を固定しておいても十分使えるのではと思います。


■.ソフト
2021/02/08:OCXO Calib.のソースファイル  のV50_60eより公開中です。



19.その他気づいたこと

(1)その他






99.追記用

大幅な改定・追記用