GPS/JJY(標準電波)を基準周波数源とするためのPLLの詳細
最近GPSやJJYを基準周波数源として測定を行うという記事を書いています。どのような方法で測定しているかはブロックダイアグラムを示しているのですが、特に重要と思われるPLLの部分について回路やプログラムを含めて詳しく書きたいと思います。
基本JJY用なのですが、GPS受信モジュール(というかu-bloxの)TIME PULSE出力にもそのまま使っています。
まずPLL部分ブロックダイアグラムから
(全体のブロックダイアグラムは「続・GPS/1PPSで標準電波/JJYの位相変動(周波数変動)を調べてみた」にあります)
PFDに使っているCD4046BEはPLL用ICであってVCOも内蔵しています。しかし今回の目的には使えないので、PFDの部分だけ利用しVCOにはVM39S5G(「超高精度・温度補償型水晶発振器VCTCXO・VM39S5G」を使ってみる - 1)を使用します。
ふつう位相検波出力(PFD出力)をCR-LPF(あるいはアクティブフィルター)で構成されたループフィルターを通してVCOの入力とするわけですが、図にあるようにPFD出力をいったんPICで処理してからVCOに与えています。
CD4046BEにはPFD出力が二つあります。Phase Comparator I Out とPhase Comparator II Out です。今回はPhase Comparator II Outの方を使っています。
Phase angle between signal and comparator inputs が Always 0 degrees in lock となるからです。位相差を正確に比較するという意味ではこれはとても重要です。
参考までに書いておくとPhase Comparator I Outには
enables a PLL system to remain in lock in spite of high amounts of noise in the input signal
という利点があります。これ以外にもそれぞれいろいろ特徴(利点・欠点)があり、目的に応じて適当な方を選びます(じつはこれまでの実験結果は Phase Comparator I Out を使ったものが多いです)
=======
まずPFDの出力をADC・MCP3425で測定するのですが、正秒から400msくらい経過したところで測ります。JJYの場合秒信号で変調されているものをクリスタルフィルターを通してしまうので位相の変化が激しいです。秒信号は9割(弱)が0.5秒以上あり秒信号を受信してある程度安定したしたところの位相を調べるためです。秒信号の残り1割は0.1秒幅でまともに位相が測れません。これは無視するようにプログラムを作る予定ですが、今はそのままデータとして使っています。
400msじっと待つのはばかばかしいので、実際は1PPSによる割り込みが発生したらMCP3553によるDAC出力電圧の測定、MCP3551によるVCO制御電圧を行い起動時設定した時間(デフォルトは0ms)ウェイトしてからPFDの電圧を測定するように作ってあります。MCP3551やMCP3553の(精密な)電圧測定はけっこう時間がかかるのです。
わざわざDAC出力を測定しているのは、DACの設定値をSDカードに出力するには新たにプログラムを書かなければならないのですが、電圧測定のルーチンはすでに存在するからです(今でも電圧測定=ADCはトータル13チャンネルあるのです)
電圧の測定は複数回行います。回数はプログラム起動時に設定できるようになっています(デフォルトは4回)
なおMCP3425は2.047Vを超える電圧を測ることができません。これは入力を分圧するなどして対応すべきなのですが、私の場合はMCP3425の入力に保護回路をつけているので500Ωの抵抗だけ介してそのまま接続しています。このあたりはPFDの出力電圧がどのくらいの範囲になるか調べながら(考えながら)やり方を考えます。
測定された電圧は(複数測定した場合はそれらを平均したのち)過去の測定と重み付け平均を行い結果をDACに出力します。
if( Evalue > AvgValue + 0.03 ) { // 極端に大きなデータのとき
Evalue = AvgValue + 0.03;
} else if( Evalue < AvgValue - 0.03){ // 極端に小さなデータのとき
Evalue = AvgValue - 0.03;
}
AvgValue = AvgValue * 0.5 + Evalue * 0.5; // 過去データと重み付け平均
DValue = (int)(4095.0 * AvgValue / 3.0); // DACデータ作成
if( AvgValue < 0.0 ) { // 重み付け平均がマイナスになったとき
MCP4726(Vref_4726, PD_4726, G_4726, 0); // 0Vを出力
} else {
if( DValue > 4095 ) DValue = 4095; // 上限を超えたとき
MCP4726(Vref_4726, PD_4726, G_4726, DValue);
}
MCP4726の参照電圧は3.0Vでやっています。“重み付け平均がマイナスになったとき”は過去のプログラムの残骸かも....
-------
うまくプログラムを作ればDACの出力をそのままVCOに与えてよさそうですが、実際にはそれはできません。DACは12bitであるため1mVくらいの分解能しかありません。一方VCO制御電圧は数十μVの差さえ問題になります。そこでCRで作ったLPFを入れてあります。
回路定数は適当につめていったのですが、後で書くように最適な定数にはなっていないようです(プログラムの方に問題があるのかもしれません)
R3はちょっと意味不明な感じがすると思いますが、これは起動時の過渡現象を短く(弱く?)するためです。VM39S59はVCO制御電圧が1.6V前後で規定の周波数になる、VCO制御電圧端子の入力抵抗が意外と低い、じつは制御他電圧端子には電圧が出ている、などの特性があることからこんな値にしてあります。これはループフィルターの作り方や使用するVM39S5Gの特性によって最適な値が変わってくると思います。こういうものを使わないでいいように作るのがいちばんいい作り方かもしれませ。
そう言えばVM39S5Gの制御端子の入力抵抗が低く電圧が出ていることを忘れてループフィルターを作ってしまい思うように動かなかったということもありました。
---------------
NEO6M-ANT-4Pの10kHz TIME PULSE出力を基準にVM39S5Gをロックし、GE-612TとGM-5157Aの1PPS出力のタイミングを測定した例(どちらかが正しいということではないです。以下どちらかを正しいと仮定すると...ということです)
毎度おなじみの1PPS出力のタイミング(位相差)を比較したもの。
最初の7分くらいがPLLがロックしようと右往左往しているところです。見た目6分~7分経てば落ち着いてくるように見えますが、そのくらいで簡単に落ち着くとも思えません。
PLLの過渡特性は過渡現象でいう臨界制動の状態がいちばんいいのだと思うのですが、上のグラフはそうなっていません。回路定数が最適ではなさそうだと思うのはこれが理由です。
ここから先は伝達関数を求めて特性を調べるというような私の不得意な分野になります。
--------
このグラフは位相差(時間差)です。周波数の差を表しているわけではありません。上のグラフの傾き(微分)が周波数の差になります。
上のデータからVM39S5Gの発振周波数を算出したもの。
起動時(正確に言うとPLLを動かし始めたあとの測定開始時)3Hz高い周波数だったのがいったん-3Hzまでオーバーシュートし反転、今度は+1.5Hzまでオーバーシュート、というようなのを繰り返して 12,000,000.0Hzあたりに落ち着いています。
このときのPFD出力/位相検波出力とVCO制御電圧
あたりまえですが、周波数が12,800,000.0Hzになった瞬間に位相検波出力の動きが反転します。一方VCO制御電圧はループフィルターを通っているため位相検波出力より動きが遅く(ディレイがあり)また動きの大きさも小さいです。
位相検波出力とVCO制御電圧の関係がよくわかるように拡大したもの。
よく見ると安定してからも電圧が少し変動(ドリフト)しています。
この原因は周波数が外乱(代表的なのは周囲の温度の変化、他にあんまり考えたくありませんが電源電圧の変動)で変化したため、その影響を打ち消すためVCO制御電圧が変化しているのだと思います。
何が原因で、それに対して適切に対応できているかは採取しているデータを丹念に調べればわかると思いますが面倒なので今回は省略します。
--------
いろいろ問題はありますが、ひとまずまともに動いているような気がします。
前の記事 「続・GPS/1PPSで標準電波/JJYの位相変動(周波数変動)を調べてみた」
次の記事 ----------------
--------
関連
「(改訂版)GPS受信モジュールあれこれ」
「高精度発振器をGPS受信モジュールとPLLで作る - はじめに」
「JJY受信機で作る高精度発振器と時刻標準 - はじめに」
「GPS受信モジュール1PPS出力タイミング変動の高精度測定の方法を考えてみた」
「“ガセ”だったGPS受信モジュールの1PPS出力タイミングの違い」
「GPS/1PPSで標準電波/JJYの位相変動(到達時間差)を調べてみた」
「続・GPS/1PPSで標準電波/JJYの位相変動(周波数変動)を調べてみた」
(RSフリップフロップ+XO+JJY/TCXO、分解能:1/48,000,000秒)
「GPS受信モジュール1PPS対決 - GE-612T vs GM-5157A」
「GPS受信モジュール1PPS出力・巴戦 - NEO6M-ANT-4P * GE-612T * GM-5157A」
(RSフリップフロップ+XO、分解能:1/48,000,000秒)
「続・GPS受信モジュール GM-5157A vs GE-612T 1PPS対決」
「GPS受信モジュール・GE-612T vs GM-5157A 1PPS対決(高分解能版)」
「100万分の1秒くらいずれている?GPSの1PPS出力 GE-612T vs. GM-5157A」
(XOR+バイナリカウンタ+XO、分解能:1/8,000,000秒)
「GE-612T vs GM-5157T 1PPS対決(GPS受信モジュール)」
(動画、分解能:1/100,000秒)
「GPS/JJY(標準電波)を基準周波数源とするためのPLLの詳細」
「セット優先RSフリップフロップとリセット優先RSフリップフロップ(RS-FF)」
「超高精度SPIバスRTC(リアルタイムクロック)DS3234Sは一ヶ月に0.2秒進む」
「測定対象別記事一覧とリンク集」
「過去記事の一覧(測定、電子工作、天文計算)」
« 続・GPS/1PPSで標準電波/JJYの位相変動(周波数変動)を調べてみた | トップページ | 水道水に同種の金属を入れても電池になる不思議な話 »
「趣味の電子工作」カテゴリの記事
- PICで作る100MHz周波数カウンタ検証用XOR(エクスクルーシブオア)逓倍器(2016.03.08)
- 150MHz(~200MHz?)周波数カウンター用プリスケーラー(1/4分周器)(2016.03.06)
- 測温抵抗体(Pt100、白金薄膜温度センサー)の抵抗値を温度に変換する(平方根を使わない)計算式(2016.03.01)
- GPS/JJY(標準電波)を基準周波数源とするためのPLLの詳細(2016.02.27)
- GPS受信モジュール1PPS対決 - GE-612T vs GM-5157A(2016.02.21)
この記事へのコメントは終了しました。
« 続・GPS/1PPSで標準電波/JJYの位相変動(周波数変動)を調べてみた | トップページ | 水道水に同種の金属を入れても電池になる不思議な話 »
コメント