線を別途引き出して使っています。したタイミングで計ってみました。使って、以下のようなコードを書きました。使えるようになっていないので、データシートを読む必要があります。1PPSのタイミングでカウンタの値を読みこんで、前回との差分をとって周波数を求めています。ごとの表示なので、簡単なコードですが、GPS同期の正確なゲート時間1秒周波数カウンタとして動いています。まで可変させて周波数を読んでみました。あると書いてありました。可変ができるようです。単位ぐらいで電圧を設定するなら、最低でも14bit程度の精度が必要そうです。名前の通りネスト可能ですが、実行中の処理よりも優先順位が高いものだけがネストします(ネストとは割り込み処理中にさらに割り込みが発生すること)。(ライブラリ側でやってる場合を除く)。側のコードを全部読む必要がある)。優先順位は0から3までの4段階あり、0が最も優先です。デフォルトでは全ての割り込みが0に設定されているので、相互に割り込みがネストすることはなく、通常処理が動いている間だけ割り込みが発生します。呼ぶと一時的に優先度0のコードになり、割り込みが発生しなくなります。元の優先度に戻ります。割り込み発生から、次の割り込みまでの間に2回ピン変化が起こると、2つめの変化による割り込み情報は失われます。ある割り込みを優先した場合、その割り込みと同じ優先度の割り込み(その割り込み自身を含む)の処理時間だけ考えればいいことになります。可変範囲ぐらいはわかったので、半固定抵抗を使ってだいたい10MHzぐらいにあわせてみたいと思います。もって、回路やコードの構成を変えました。あるのに、これをクロックにしないのももったいないなという感じになりました。自体のクロック源をOCXOにすれば、内蔵カウンタでフリーランさせた値がそのまま周波数カウントになるので、GPIOを1ピン節約できます。最大クロックで動かしてみたいと思います。周波数カウントは5分周すれば元の10MHzになりそうです。用語ですが「システムオシレータ」と「システムクロック」に区別があって、システムオシレータは外部水晶発振子を使うことを想定した内蔵発振回路、システムクロックはシステムオシレータまたはBYPASSされた外部クロックを指しています。発振器なので、内蔵システムオシレータは使わないようにします。日本語版だと間違っているので原文を見る必要があります。直接クロックを入力する場合には、内蔵のシステムオシレータをバイパスするという意味になります。フロート)、ここで罠があります。以上入力してはならないことになっています。あたりの分圧が必要です。受けてからクロック入力に使いました。ぶっちゃけかなりハマりました。有効にして、どの段階までちゃんと出力が出ているかを確認する必要があります。実際の分周数-1を設定する必要がありました。タイマーをタイマーとして使い、システムクロックをそのままカウントします。キャプチャピンはGPS1PPSをキャプチャするようにし、キャプチャのタイミングでキャプチャレジスタにタイマカウンタをコピー(ハードウェア動作)させて割込みを生成します。ピンチェンジ割込みは使いません。レジスタの設定は問題ないのですが、割込み周りでだいぶハマりました。前回よりも精度を高めるため、10秒、100秒、1000秒のゲートでの誤差を表示するようにしました。単位で表示しているのが誤差の項目です。1000秒単位での調整は面倒なので、10秒単位の調整しかしてませんが、このように手で雑に調整してもこのぐらいの精度が出ていました。持つようにしています。そもそもOCXOの可変範囲が±5Hz程度しかないので、それ以上の情報を持つ必要がありません。配列で履歴を持って、直近のn件を合計して見る形になっています。これにより、例えばカウンタをそのまま持つには10Mは16bitに納まらないので32bitの配列にしなければなりませんが、誤差だけを保持すれば4分の1の容量ですみます。LPC1114では1000個の履歴を持てません。よるデジタルコントロールにしてみました。よるデジタルコントロールにしてみました。前回は多回転ボリュームを使って手動で調整をしました。これだと10秒単位ぐらいならともかく、1000秒単位の調整は面倒くさすぎてやっていられません。ここをMCUで自動化します。スイッチングしてローパスフィルタにかけてコントロール電圧を生成します。周波数は約30Hzです。設定した値になります。最大の分解能を持つようにしています。PWMの周波数が30Hzぐらいなので、外部フィルタとしてかなり低い周波数のローパスフィルタを使っています。応答性が高くてもあまり意味がないないし困るので1Hzぐらいのローパスフィルタでも良さそうです。周波数を変えた直後はグリッチが発生するので、2秒間のGPS1PPS割込みを無視するようなコードを加えました。PID制御などではなく、まずは適当にインクリメント・デクリメントし続けるような実装にしました。グラフ化してみました。ソフトウェア的要因と思われる過補正を繰替えしている雰囲気を感じられますが、概ね±10mHz(±1ppb)におさまっています。調整を自動化したので、これはもはやGPSDOと呼べそうです。PID制御にするなど、ソフトウェア的な制御改良の余地はありますが、GPSDOの大枠が実装できました。どちらかといえばあとはアナログ回路の要素が多くなります。いっても以下らへんを実装すれば実用的になりそうです。アナログまわりが勉強中なので現状の技術力だと難しい面もありますが、製作例もあるのでなんとかはなりそうです。いえ、作っても現状だと応用先がスペアナぐらいしかないので、あんまりやる気がありません。簡単な構成でppbオーダーの高精度なクロックが得られるのは面白いです。アナログ回路の技術力があればさくっと作りあげられそうです。