周波数カウンタ＋エクセル VBA でアラン偏差の測定

[前回の記事](https://qiita.com/kan573/items/e5aa89e33a14af8c050d)では、エクセル VBA で周波数カウンタを制御して、10 MHz クロックの性能を測定するマクロを作成しました。
同じ周波数カウンタで、アラン偏差も取得できますので、マクロで自動測定してグラフ描画します。

アラン分散／アラン偏差は、クロックやジャイロの安定性を測るよい分析方法とされている、らしいです。
私は詳しくないのですが、グラフで比較できると、品質の優劣が掴みやすくなります。


# 1. はじめに
[前回の記事](https://qiita.com/kan573/items/e5aa89e33a14af8c050d)と同じく、ヤフオクで購入した GPSDO 10 MHz マスタークロックの性能を、
具体的に数字で比較したい、というのが事の発端です。
今回の記事では、もっとわかりやすいアラン偏差のグラフを作成します。

周波数カウンタ 53230A で取得できるアラン偏差は、周波数から計算して得られる数値です。

![1_53230A_allan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/72207c0f-37e4-925f-6066-4f1117ad7303.png)

周期モードでもアラン偏差が表示されるのですが、サンプル期間τを変更する方法がわかりません。
どうやってもアラン偏差が一定値になってしまい、有意なデータを得られませんでした。

周波数モードのアラン偏差は、単位が uHz/mHz になってしまうため、
巷の解説にあるグラフとそのまま比較する事ができません。
巷のグラフは、縦軸が 10^-15 とかの小さい数字になっていると思います。

とはいえ、グラフ形状はアラン偏差の特性そのものなので、それほど
間違ってはいないのではないかな？と考えています。

同じ測定器で取得したグラフを比較する分には、十分な指標になる筈です。

# 2. 使用する測定器および環境

## 2.1 測定器

周波数カウンタ 53230A (192.168.1.7 で LAN 接続)
https://www.keysight.com/zz/en/product/53230A/350-mhz-universal-frequency-counter-timer-12-digits-s-20-ps.html

## 2.2 測定器制御ライブラリ
Excel VBA から呼び出す VISA COM のライブラリをインストールしておく
Keysight IO Libraries Suite (IOLibSuite_18_2_27313.exe)
https://www.keysight.com/zz/en/lib/software-detail/computer-software/io-libraries-suite-downloads-2175637.html

## 2.3 参考資料
測定器の SCPI 制御コマンドのリファレンス

Keysight 53220A/53230A Frequency Universal Counter/Timer Programmer's Reference
https://www.keysight.com/gb/en/library/manuals/programming-and-syntax-guide/53220a53230a-frequency-universalcountertimer-programmers-reference-1971001.html

## 2.4 環境

1. Windows10 Pro 64bit (20H2)
2. Microsoft Excel 2013
3. Keysight IO Libraries Suite 2022 (Build 18.2.27313.1) IOLibSuite_18_2_27313.exe 


# 3. マクロ作成
エクセルのシートにデータ記入枠を用意しておきます。
53230A からデータを取り込んで、セルに記入するマクロを作成しました。
アラン偏差値を 5 回測定して、最大・最小・平均値を自動算出し、グラフに反映します。

サンプル期間τが長くなるほど、一回の測定に時間がかかります。
τ＝2秒までなら、全体の測定が13分程度で完了できます。

τ＝10秒まで測ると40分超かかりますが、結果は2秒までのグラフから想像できる通りでしたので、2秒までにしています。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/2220cc43-4b52-0123-9228-6c07c5ebb8d6.png)

作成した .xlsm ファイルを、下記で公開しています。
[53230A_アラン偏差測定.xlsm](https://drive.google.com/file/d/1YnYoL0_6sHbX6yFXkyTQHP_Y2pkriIKC/view?usp=sharing)


作成したマクロは下記になります。

```53230A_アラン偏差測定.xlsm (VB マクロ)
    Public gate_time As String
    Public samp_count As String
    Public write_colomn As Integer

Sub Main()
    Call setup_counter

    Range("C5:G36").Select                                                  '旧データの消去
    Selection.ClearContents
    Range("C5").Select

    write_colomn = 5                                                        '最初の書込み行 位置の指定

    Dim i
    
    For i = 0 To (Cells(5, 1).End(xlDown).Row - write_colomn)              'ループ回数 = 取得サンプル数の記入行数
    
        samp_count = Cells(write_colomn, 1).Text                            '取得サンプル数 読み込み
        gate_time = Cells(write_colomn, 2).Text                             'τ[sec] 読み込み
        Call read_allan_5times                                              '測定部 呼び出し
    
    Next i
    
        
End Sub

Sub setup_counter()
    Dim RM As New VisaComLib.ResourceManager
    Dim UFC As New VisaComLib.FormattedIO488                                'UFC : Universal Frequency Counter
    Set UFC.IO = RM.Open("TCPIP0::192.168.1.7::inst0::INSTR")               'VISA Address
    
    UFC.WriteString "*RST"                                                  'カウンタのリセット
    UFC.WriteString "DISP:DIG:MASK 10"                                      '表示桁数 = 10桁
    UFC.WriteString "CONF:FREQ (@1)"                                        '測定モード = 周波数
    UFC.WriteString "TRIG:COUN 1"                                           'トリガカウント = 1
    UFC.WriteString "SENS:FREQ:MODE CONT"                                   '切れ目なし連続測定モード
    UFC.WriteString "INP:COUP DC"                                           '入力カップリング = DC
    UFC.WriteString "INP:IMP 50"                                            '入力インピーダンス = 50Ω
    UFC.WriteString "INP:LEV:AUTO OFF"                                      '入力レベル自動設定 = OFF
    UFC.WriteString "INP:LEV1 0"                                            'CH1 入力レベル = 0V
    UFC.WriteString "CALC:STAT ON"                                          '統計モード = オン
    UFC.WriteString "CALC:AVER:STAT ON"                                     '平均値計算 = オン
    UFC.WriteString "DISPLAY:MODE NUM"                                      '表示モード = 数値
    UFC.WriteString "INIT"                                                  '設定開始
    UFC.WriteString "*WAI"                                                  '設定完了待ち
    
    UFC.IO.Close
    Set UFC = Nothing
    Set RM = Nothing
End Sub



Sub read_allan_5times()
    Dim RM As New VisaComLib.ResourceManager
    Dim UFC As New VisaComLib.FormattedIO488                                'UFC : Universal Frequency Counter
    Set UFC.IO = RM.Open("TCPIP0::192.168.1.7::inst0::INSTR")               'VISA Address
    UFC.IO.Timeout = 120000                                                 'TIMEOUT = 120秒
    
    Dim strReady As String
        
    UFC.WriteString "SENS:FREQ:GATE:TIME " & gate_time                      'τの設定
    UFC.WriteString "SAMP:COUN " & samp_count                               '取得サンプル数の設定
    
    
    UFC.WriteString "INIT"                                                  '設定開始
    UFC.WriteString "*OPC?"                                                 '処理完了待ち
    strReady = UFC.ReadString()                                             '結果読み出し (処理完了 = 1)
    UFC.WriteString "CALC:AVER:ADEV?"                                       'アラン偏差 読み出し
    Cells(write_colomn, "C") = Replace(UFC.ReadString(), vbLf, "")          '改行コードを取り除いてC_セルへ書込む
    
    UFC.WriteString "INIT"
    UFC.WriteString "*OPC?"
    strReady = UFC.ReadString()
    UFC.WriteString "CALC:AVER:ADEV?"
    Cells(write_colomn, "D") = Replace(UFC.ReadString(), vbLf, "")          '改行コードを取り除いてD_セルへ書込む
    
    UFC.WriteString "INIT"
    UFC.WriteString "*OPC?"
    strReady = UFC.ReadString()
    UFC.WriteString "CALC:AVER:ADEV?"
    Cells(write_colomn, "E") = Replace(UFC.ReadString(), vbLf, "")          '改行コードを取り除いてE_セルへ書込む
    
    UFC.WriteString "INIT"
    UFC.WriteString "*OPC?"
    strReady = UFC.ReadString()
    UFC.WriteString "CALC:AVER:ADEV?"
    Cells(write_colomn, "F") = Replace(UFC.ReadString(), vbLf, "")          '改行コードを取り除いてF_セルへ書込む
    
    UFC.WriteString "INIT"
    UFC.WriteString "*OPC?"
    strReady = UFC.ReadString()
    UFC.WriteString "CALC:AVER:ADEV?"
    Cells(write_colomn, "G") = Replace(UFC.ReadString(), vbLf, "")          '改行コードを取り除いてG3セルへ書込む
    
    UFC.IO.Close
    Set UFC = Nothing
    Set RM = Nothing

    write_colomn = write_colomn + 1                                         '書込み行 +1

End Sub

```

# 4. 測定方法

「測定開始」ボタンを押すと、自動測定を開始します。


# 5. 測定
[前回の記事](https://qiita.com/kan573/items/e5aa89e33a14af8c050d)と同じ水晶発振器を測定しています。
__グラフの曲線が下にあるほど、性能が良いことを示します。__

# 5.1 GPSDO1 10MHz (GPSDO-SOV V1.2)
中古のシングルオーブン VC-OCXO が入っています。
GPS 同期させれば確度は良い数字ですが、ジッタが非常に大きいです。
VC-OCXO が中古でくたびれているせいなのか、元からなのかはわかりません。
グラフを見ると、安定性もちょっと不安があります。

![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/5e17403e-cde7-401b-6e85-c8d5f0ae31ab.jpeg)
![3_GPSDO-SOV V1.2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/d066fdb7-1e15-2a37-80db-193c54296d10.png)


# 5.2 GPSDO2 10MHz (GPSDO-DOV V1.1)
ダブルオーブンの VC-OCXO が入っています。
グラフを見る限り、シングルオーブンより性能が悪いようです。
ジッターも安定性も×。
回路追加して正弦波出力 → 矩形波出力に改造していますが、ジッタは改善しませんでした。

![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/2fb81b43-0b7a-64b0-082f-baa770237595.jpeg)
![4_GPSDO-DOV V1.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/b5c669df-01f2-8b22-b723-31d0e14976c9.png)


# 5.3 VC-OCXO 10MHz
もう一台ある周波数カウンタ 53220A に Abracon AOCJY3A-10M(±5ppb, 0～+50℃) を入れてあります。(実売 1.6万円ぐらい)
GPSDO 校正後にフリーランしています。
AOCJY3A-10M は矩形波出力の発振器なのですが、53220A 内部でフィルタして正弦波で出力しています。
機器内でフィルタされて正弦波出力になるので、ジッターが大きめですが、安定性は今回測った中では一番良いです。

![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/36a1939b-9441-61b2-cbec-90b8110eb307.jpeg)
![5_AOCJY3A-10.000MHz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/156e7445-e34d-585f-e685-4e3a8c57f2fc.png)


# 5.4 VC-TCXO 10MHz
村田 XTCLH10M000CHJA1P0(±0.28ppm, -40～+85℃) です。
(旭化成問題でディスコン?)
温度安定用にカバーと収縮チューブで覆っています。
ジッター性能は良い感じですが、恒温層が無いので、安定性は中庸です。

![B2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/04bbddc4-82aa-2795-030c-3ba8558cdb97.png)
![6_XTCLH10M000CHJA1P0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/844a3e9d-e793-a0c3-5254-a4e4bc5ff5b8.png)

# 5.5 OCXO 10MHz
Abracon AOCJYR-10.000MHz-M5625LF(±25ppb, -40～+85℃) 廉価な OCXO です。(実売 6,000円ぐらい)
全体的に中庸ですが、一部に盛り上がりがあり、ゆっくりなジッター(ワンダー)がある感じです。

![B3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/f16d3283-cd21-3e16-c96e-5d0217bb50de.png)
![7_AOCJYR-10.0M.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/658060f4-de45-9026-c280-9f2227249fb4.png)


# 5.6 TCXO 10MHz
秋月で売っているセイコーエプソン TG-5021CE-10N(±2ppm, -30～+85℃) です。
クリップドサイン出力ですが、基板上で矩形波に変換しています。
息をかけるだけで周波数が変わるので、カバーが必須。
τ = 0.01 sec 付近の盛り上がりが気になるのと、温度安定性が OCXO に劣ります。

![B4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/4d50736b-1ee7-ce9c-1044-e5dfe4a91f07.png)
![8_TG-5021CE-10N.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/eb2ddf71-83b3-596a-39a2-84ea79336d33.png)


# 5.7 SPXO 10MHz
京セラ KC3225K10.0000C1GE00(±50ppm, -40～+85℃) です。
民生／工業向けに普通に使われているグレードです。
温度補償が無いので確度と安定性がいまいちです。

![B5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/95294f92-d1c1-c442-ee28-4469504dd68c.png)
![9_KC3225K10.0000C1GE00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/65738878-a82e-eaab-404a-98088468c3f6.png)


# 6. まとめ
Excel の VBA から測定器を制御して、自動測定を行い、アラン偏差のグラフを描画しました。
やはり、中古の VC-OCXO は、ジッター性能はよくないようです。

全種類を平均値でグラフ比較すると、こうなります。
![平均値比較.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/263930e5-af66-3277-2945-df8fe7c14e84.png)
新品購入した VC-OCXO である AOCJY3A-10.000MHz が最も安定しています。
正弦波変換のため、τ＜0.001 のジッター領域で数字が悪くなるようです。
AOCJY3A 自体は矩形波出力ですので、単体で測ればもっと良いグラフになると思います。

自作基板に搭載した4種類の発振器のグラフだけ抜き出してみました。
全て矩形波出力で、波形の影響が出にくくなっています。

VC-TCXO: 村田 XTCLH10M000CHJA1P0(±0.28ppm, -40～+85℃)
OCXO: Abracon AOCJYR-10.000MHz-M5625LF(±25ppb, -40～+85℃)
TCXO: セイコーエプソン TG-5021CE-10N(±2ppm, -30～+85℃)
SPXO: KC3225K10.0000C1GE00(±50ppm, -40～+85℃)

![矩形波_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/8c1f45fc-cb86-e775-ccb8-4861a9c20a19.png)


① 　　　　τ≦ 0.0001 sec : 高い周波数のジッター性能を示し、恒温槽や温度補償の有無によらず、ほぼ一定です。
② 0.0001＜τ≦  0.001 sec : 中間周波数のジッター性能を示し、温度補償の無い SPXO で数値が悪くなります。
③  0.001＜τ≦   0.01 sec : 低い周波数のジッター性能を示し、SPXO と TCXO で数値が悪くなっています。
④   0.01＜τ≦　  0.1 sec : ゆっくりなジッター(ワンダー)性能を示し、物による差が大きいです。
⑤    0.1＜τ≦     10 sec : 温度安定性の領域です。温度補償のない SPXO の数値が悪化しています。

高い周波数のジッター性能は、最近の水晶発振器であれば、VC-TCXO/OCXO/TCXO/SPXO で、ほぼ差が無いようです。

安定性は、温度補償の強さから、 OCXO > VC-TCXO ≧ TCXO > SPXO の順です。
τ≦ 2sec だと確実にそうなのですが、上のグラフだと 0.01＜τ≦1 までの間で OCXO がいまいちなので、物によるのだと思います。
(AOCJYR-10.000MHz-M5625LF は、最廉価クラスの OCXO です)

コストと性能の観点で見ると、VC-TCXO が一番バランスが良さそうです。
村田 XTCLH シリーズはディスコンになってしまいましたが、ほぼ同性能の
ECS-VC-TXO32-S3
LFTVXO075802REEL
がありますので、いずれ調査してみたいと思います。