LoginSignup
1
1

More than 1 year has passed since last update.

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

Posted at

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

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

1. はじめに

前回の記事と同じく、ヤフオクで購入した GPSDO 10 MHz マスタークロックの性能を、
具体的に数字で比較したい、というのが事の発端です。
今回の記事では、もっとわかりやすいアラン偏差のグラフを作成します。

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

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

作成した .xlsm ファイルを、下記で公開しています。
53230A_アラン偏差測定.xlsm

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

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

前回の記事と同じ水晶発振器を測定しています。
グラフの曲線が下にあるほど、性能が良いことを示します。

5.1 GPSDO1 10MHz (GPSDO-SOV V1.2)

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

8.jpg
3_GPSDO-SOV V1.2.png

5.2 GPSDO2 10MHz (GPSDO-DOV V1.1)

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

10.jpg
4_GPSDO-DOV V1.1.png

5.3 VC-OCXO 10MHz

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

11.jpg
5_AOCJY3A-10.000MHz.png

5.4 VC-TCXO 10MHz

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

B2.png
6_XTCLH10M000CHJA1P0.png

5.5 OCXO 10MHz

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

B3.png
7_AOCJYR-10.0M.png

5.6 TCXO 10MHz

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

B4.png
8_TG-5021CE-10N.png

5.7 SPXO 10MHz

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

B5.png
9_KC3225K10.0000C1GE00.png

6. まとめ

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

全種類を平均値でグラフ比較すると、こうなります。
平均値比較.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

①     τ≦ 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
がありますので、いずれ調査してみたいと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1