MastHead
  Entry     Photo Lib     Forum     Links     Glossary     Misc.  
IC-R75、 究極の周波数安定化

IC-R75 の究極の周波数安定化にチャレンジしてみます。
以前の記事でも書いたように、CR-282 を使っていても 20Hz 弱の周波数変動があります。  フェージングで、上下の側帯波の位相が異なると AM の検波後の音が無茶苦茶になって聞き取れなくなることがあります。  それを避けるため、SSB モードにして片側側帯波のみを使うことがあります。
その場合、受信機の周波数変動が問題になります。 これを何とかしてみます。


結果:

最初に、改造前の 2LO の変動と今回の改造後の変動とをお見せします。  かなりの難関でしたが、何とかうまくいきました。  After のドリフトは測定時刻以外の点でも上下 1Hz に収まっています。  20℃ の変化で ±0.017ppm になります。

Before のカーブは今回再度測定したものですが、以前の記事とほとんど変わっていませんでした。
測定には細心の注意を払いました。  室温を 20℃に保ち、カウンターは 12 時間電源を入れたままにして安定化させました。  このカウンターは半ば自作のものですが、原発振は温度安定化したオーブンに水晶とその周りの回路を入れています。  IC-R75 は、その間、電源を切ったままにし内部の温度むらを無くして準備しておきます。

電源オン直後の1分ほどは CR282 のヒーターが働きますので、ものすごくドリフトします。 ですから測定は1分後の値から採取します。  ドリフトの基準は3分後の値として、そこからの変動を縦軸に採っています。  カウンターの分解能は 1Hz ですが、5秒ほど観察して、1の変動を上下しているときはその中間にしています。


予備調査と構想:

IC-R75 の原発振の回路は、バイアス回路を省略すると右図のようになっています。  CR-282 は表示は 30MHz と書いてありますが、測定してみると 10MHz と 30MHz に同程度の共振点を持つ、恒温槽に入った Xtal です。  同調回路で 30MHz 側を使います。 3rd Overtone と同じ回路です。  この後ろにダブラがあって 60MHz の 2LO になります。 以下、周波数の誤差などへの言及は全て 2LO が対象です。
恒温槽の中までは触れませんので、周囲の温度を検出して、その上昇に見合う量だけ周波数を上げる補正回路を考えることにします。
センサーはサーミスタを使います。  ダイオードでもいいのですが、Xtal を動かすためにはかなりの精度が必要なので、感度の高いセンサーを使います。

周波数変動の要因として、Xtal 以外に図の中に緑の丸印をつけた部品も考えないといけません。 キャパシタは全て温度の影響が大きいチップ・セラミック ですし、L2 も大きな要因です。
オーバートーンを使う水晶発振回路で問題なのは、水晶のほかに共振回路を導入するために、その温度依存性が顕著に表れてくることです。  せっかく安定した水晶を使ったのに、その成果を損なう回路であるのが少し残念です。
幸いなことにこのブロックは周囲にフェンス(簡易シールド)があって、その熱伝導によって内側の温度が比較的均一になります。  空気の移動も少なく、(CR-282 以外は)温度は急変しない構造になっています。  ですから、これらを個別につぶすのではなく、一からげにして、補正することにします。 つまり、TCOCXO (Temperature Compensated Oven Controled Xtal Oscillator) です。

すぐ思いつくのは左のような回路です。  温度が上がってサーミスタの抵抗が小さくなると、バリキャップ(バラクタ)にかかる電圧が大きくなって、 周波数が上がる仕掛けです。  5.4V というのはゼナーダイオードとアバランチダイオードの切り替わり点で、比較的温度安定度の高い電圧です。

ところが、残念なことにこの方法はうまくいきません。
どうあがいても、2/3程度しか補正できないのです。  理由は、サーミスタの非直線性と、バリキャップの非直線性が相反するためです。  どちらのカーブも反っているのですが、その向きが逆になっていて、「反りが合わない」のです。
それで、センサーとコントローラ(=バリキャップ)の間にマイクロプロセッサを入れて、すべての関数をここで取り扱うことにします。
幸いなことに、アナログ電圧をデジタル化する AD 変換器を持ち、かつ、計算したデジタルデータをアナログ電圧にする DA 変換器も持っているマイクロプロセッサがありました。 16F1705 という PIC です。

使う 10kohm のサーミスタは小さいので、消費させる電力は小さくします。
サーミスタとの電圧分割に 5.6k を使ったのは、使用する温度(5℃ から 55℃)辺りで感度が高く、かつ消費電力が 1mW 程度以下になるようにしたからです。  下のグラフがそれを計算したところです。

まず必要なのは、周波数が温度に対してどのように動くかというデータです。
温度の測定点は、CR-282 が発熱体ですから、そこから少し離れたところで、かつ、問題の C や L に近いところ、ということから、 L2 の横の金属フェンス(シールド板)としました。
そこにサーミスタを貼り付け、さらに同じ位置に温度計のセンサも張り付けて、2LO の動きを追いました。 ケース・カバーは閉じています。  それが右の図です。

最初の 3 分で CR-282 の内部の温度が安定し、その後は -1.5947Hz/deg で下がっていきます。 幸いなことに直線に見えます。
以下では、最初の 3 分間は無視することにします。

説明が後になってしまいましたが、この温度対周波数シフトのカーブは、下に出てくる 20pF と 27pF+バリキャップの変更を入れ、バリキャップ電圧を 3V にした時のものです。  なので、33pF セラミックの温度依存性は排除しています。  33pF セラミックの時のグラフも取っていますが、傾斜がだいぶ緩くなっています。

その実験でサーミスタの R0 @25℃ と β が測定できます。 R0=10147 ohm、β=3400 でした。
以後、温度(T)を知りたいときは、その抵抗を R として:
  T = 1/( ln(R/10147)/3400 + 1/(273.15+25) ) - 273.15 [°C]
を使います。

次に、バリキャップにかける電圧と、周波数のシフト量の関数が必要になります。
理論的には、電圧と容量の関数を出し、容量と周波数の関数を出して統合するべきでしょうが、その場合は浮遊容量や L2 の値や素子の誤差量などが必要になり、不確定要素が入ってきます。  それで、実際に組み込んだ形で電圧対周波数を測定してしまうほうがずっと楽になります。 その結果が右の図です。  (注あり:下記)
あとで、検証のために逆方向の関数も必要になるので求めておきました。  どちらも 6 次の近似カーブで、係数は 11 桁出しておきました。  次数を高くした近似で注意しないといけないことは、外挿ができないことです。  ですから、使用範囲より若干広く、0V から 6V まで測定しました。

上の、温度対周波数も、この電圧対周波数も、回路は左のようにして実験しました。
1S1658 を使ったのは、手持ちの中で比較的容量変化が大きかったためです。 古いものなので今は入手できないでしょう。
バリキャップを、原回路の 33pF に並列の位置にしたのは、ここにパッドがあって、部品が取り付けられるようになっていたためです。  設計者は最初、ここにトリマ・キャパシタを付けて周波数調整するようにしていたようですが、 L2 でも調整できることから無くしたのでしょう。  パッドだけが残っています。 しかも、比較的感度の高いノードです。
その感度ですが、事前の調査でとんでもないことが分かりました。
33p にそのまま並列にバリキャップを入れると周波数が下がりますが、それを戻すために L2 を調整すると、バリキャップの感度が半分ぐらいに低下してしまうのです。  目的の温度範囲がカバーできなくなります。 (3rd Overtone なんか使わなければいいのに)

それで、まず、元の 33pF のまま L2 を 60MHz に正確に合わせ、つぎに L2 をそのままにして 33pF を外して(ルーターでプリント配線をカット)適当なスチコンと、27p + バリキャップを入れてみます。  そうして、できるだけ 60MHz に近く(10Hz以内)になるような値にこのスチコンを調整します。 このとき、バリキャップに与えておく電圧は 3.0V にしています。  これは、周波数可変範囲をあらかじめ調査してあったデータからそうしました。  最終的には、私の場合は表面に 20pF と書いてあるものが最適でした。 もちろん浮遊容量込みです。
その後で、電圧対周波数シフトのデータを取ります。
なぜ 3V で合わせたかと言うと、説明が難しいのですが、まず温度カバレージを 70℃ までとすると、その時の電圧は上限の 5V になります。  先ほど 60MHz ぴったりに合わせたときは 44℃ で、それは計算上 3V に相当するからです。 44℃というのは電源を入れて60分ほど経って安定になった時の温度です。

バリキャップはあまり低い電圧では使用したくありません。 信号の振幅がかなり大きいことを考察して、直列に 27pF を入れてバリキャップにかかる信号の振幅を落としています。  それでも必要な変化量を確保します。
バリキャップには温度特性があります。 検証してみましたが問題となるほどではありませんでしたので、無視することとします。
また、与える高周波の電圧によっても見かけの容量が変わります。 非直線性のためです。 これは実際の回路で移動量を測定しているので問題となりません。
直/並列に入れる容量は、マイカやセラミックは避けた方がいいでしょう。  マイカを避ける理由は微細構造の問題があるからで、セラミックを避ける理由は電圧対周波数の測定をする際に温度の影響を入れないためです。

マイクロプロセッサで、サーミスタの電圧から、バリキャップの電圧を求めるには、かなり複雑な過程が必要です。 すなわち、
1.サーミスタの電圧を読む。
2.それを温度に変換する。(非直線、自然対数)
3.温度から、シフトするべき周波数を知る。(直線近似)
4.シフト周波数に見合う電圧変化量を求める。(非直線、6次近似)
5.その電圧を DA 変換に送り込む。

ここで問題が起きます。  この PIC は浮動小数点どころか掛算命令すらありません。  その計算ルーチンを自作することになりますが、上記のように多項式で、桁数の多い掛算がたくさん出てきます。  自然対数のテイラー(マクローリン)展開もあります。 若干めんどう。

別の方法として、予め検査しておいて、サーミスタの電圧から DA コンバータへの電圧に変換するには変換表を参照させる手(Table Lookup)があります。  この方法の欠点は変換表がかなり大きな図体になってメモリーを食うことです。  利点は、後で誤差が出たときに変換表を入れ替えるだけで修正が効くことです。  表が大きくなることの対策として、AD の出力は上位 8 bit だけを使うことにします。  そうすればテーブル・サイズを 1/4 にできます。 このビット落ちによる誤差量は検証しておきます。

第3の方法として、このテーブル自体を関数にして、一回の変換式で済ませる方法があります。 一応、5次の近似式の係数は求めておきました。  しかし浮動小数点計算からは逃れられませんし、近似の誤差を追加で導入することになってしまいますから、使わないことにします。

16F1705 は AD 10bit のうちの 8bit を使います。 DA は 8bit です。 量子化誤差がどの程度になるか知っておかねばなりません。  ちょっと計算してみたのが右の図です。 ギザギザの変化が見えます。
うーん、できれば AD 側にもう 1 bit ほしいところだけど、まあ 1Hz 以下ですから良しとしましょう。 テーブルが 2 倍の大きさになるし。
わずかにうねりが見えますが、これは近似多項式による誤差です。  後日、必要なら手で補正します。

概算だけをしておきますと、DAC の LSB の 1bit は 19.5mV の変化になります。  これは 5℃ で 0.7Hz、60℃ で 0.4Hz のステップ変化量になります。

左の図は AD 上位 8 bit を DA 8bit に変換するテーブルの最初の部分の例です。 10進数で表しています。
この辺り(低温側)では DAC への値はほぼ1のインクレメントが続いていますから、量子化の誤差は AD 側上位 8bit と DA 側が同程度であることが分かります。  でもよく見ると DA 側で 38 から 40 に跳んでいるところがあります。 ここは AD 側に 43.5 に相当する値があれば跳ばなくてすみます。

高温の方へ行きますと、DAC への値は 3 程度のジャンプが多くみられるようになりますが、そもそもバリキャップの感度が小さくなっているので問題ありません。  上のグラフがそれを示しています。

なお、電源電圧は AD と DA 両方で基準の値として使われますから、計算するときに精密な値が要ります。  使用する個体のレギュレータの電圧を測って、それを用いています。 6mA 負荷で、25℃ で 4.997V でした。  温度係数は -0.5mV/deg ほどですので、それも計算に入れます。

上の基本設計では、カバーする温度範囲は一応考慮しておきました。  室温は 0℃ から 35℃ を想定し、ケース内温度は、電源 ON 3 分後の +4℃ と、安定期の +20℃ の上昇を見込んで、設計の範囲は 4℃ から 55℃ をカバーします。  ガードバンドは、下は -1℃、上は 68℃ までです。

気になっていたバリキャップの逆バイアス電圧は、およそ 0.7V から 4.9V の範囲で、バイアスが低い方でバリキャップにかかる交流信号の振幅は 0.4Vpp 程度ですから問題はないでしょう。

実装:

右に回路を描いておきます。 消費電流は通常は 6mA ほどで、フラッシュに書き込むときでも 20mA は超えません。  レギュレータはそれに合わせて 100mA もあればいいでしょう。 (手持ちに無かったのでずいぶん大きいものを使っています。)  また、リセットスイッチはテストのために付けてあるもので、本来は要りません。
5.6k は正確である必要があるので、選別して金属皮膜の +0.1% のものをつまみ出しました。  抵抗の温度係数は個体差がありますので手持ちのものを測定しました。  使用範囲近辺で 40 度ほど変化させてみると、カーボンが -264ppm/℃、金皮が +9.9ppm/℃ でした(一次近似)。  金皮なら温度係数まで計算に入れなくても大丈夫なようです。
サーミスタは接着剤で金属の壁にしっかり貼り付け、自己発熱分をできるだけ放熱するようにします。

16F1705 の開発環境 MPLAB X を導入し、また PICKit 4 も購入して簡単なコードを書きました。
今まで使い慣れていた MPLAB と PICKit 2 から変わってずいぶん戸惑いましたが、使えるようになりました。  最近の PIC では brw と retlw というインストラクションが使えるようになったので大助かりです。  下にコードをお見せします。 注意することとして、ここで使っている変換テーブルは、バリキャップ特性、サーミスタ特性、27pF の誤差、20pF の誤差、などによって変更されるべきものです。  ですからそのまま使われてもきちんと補正はできません。
今回は、準備の段階で測定し、計算しておいた変換テーブルをそのまま用いてうまく補正できています。  後付けで、ある程度手で補正する覚悟はしていましたが、それは全くなくても 1Hz の範囲に収まりました。  とりあえずこのまま使うことにします。  必要なら、サーミスタからの電圧と、精密な周波数とを測定して記録していき、それに基づいて変換テーブルを手で微調整することは容易です。

クロックを 250kHz という低い値にしてあるのは、受信機の内部にあることからスプリアスを出さないようにしたかったためです。  また、外部クロックだと配線からの輻射がありますから、IC 内部のクロックを使いました。  実際にこの基板を箱の中のあちこちに近づけながらスキャンしてみましたが全く妨害波はありませんでした。
この 250kHz が作る AD 変換時間(TAD=8us)は、仕様書に書かれている推奨最長時間(TADmax=6us)をはみ出して 1.3 倍ほどになってしまいます。  仕様書には推奨最大値を指定してある理由が書かれていませんが、IC 内部のサンプル・ホールドに使っている 10pF のリークを問題視しているためだと思います。  1.3 倍になっても、下位の 2 ビットを使いませんから問題にはなりません。 4 倍ぐらいまでは大丈夫です。  試しに 10 倍ぐらいで使ってみましたが問題なく使えました。
本当は 31kHz まで落としたかったのですが、この仕様違反のため 250kHz まで上げておきました。  バリキャップ電圧の更新は 0.15ms 程度の高頻度で行われてしまいますが、1uF と 56k+内部インピーダンスで 80ms 程度の平滑化とグリッチの除去をしています。  この 1uF はリークのないものを使います。

最終的な結果は一番上に示した通りです。


コード:
;CR-282 Stabilization project    Copyright 2019 T. Fujiwara
;1/7/2019     first validation V.1.0
;1/25/2019    table error correction, v1.1

;MPLAB X set: case=insensitive, radix=dec, Device=16F1705, tool=PICkit 4, compiler=mpasm
 LIST P=16F1705, c=132, n=0
#include "p16f1705.inc"

; CONFIG1
; __config 0xC7E4
 __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _BOREN_ON & _CLKOUTEN_ON & _IESO_OFF & _FCMEN_OFF
; CONFIG2
; __config 0xFEFF
 __CONFIG _CONFIG2, _WRT_OFF & _ZCDDIS_ON & _PLLEN_OFF & _STVREN_ON & _BORV_LO & _LPBOR_OFF & _LVP_ON

        radix      dec
         
;--- GPRs ----
advalue equ        0x20    ;result of ADC high 8 bits
davalue equ        0x21    ;da value after lookup conversion (w/limit of 40)
        
;--- Literal Values ---        
Bias    equ        40      ;AD value bias for table conversion, say 40
MaxVth  equ        179     ;max AD input limitation, say 179    
LowVaricap equ     34      ;lowest varicap voltage, DA value
       
;--- bits ----
w       equ        0

;--- Code ---
;RESET START ===============
        org        0
        nop
        goto       entry
        db         0x11    ;version
        nop
        org        4       ;interrupt routine if any
        clrf       intcon  ;kill all interrupts
        retfie

        org        0x20
TableAD2DA: ;conversion table
        brw                ;AD  -40   AD=high 8 bits
        retlw      35      ;H40  0
        retlw      36      ;H41  1
        retlw      37      ;H42  2
        retlw      38      ;H43  3
        retlw      40      ;H44  4
        retlw      41      ;H45  5
        retlw      42      ;H46  6
        retlw      43      ;H47  7
        retlw      44      ;H48  8
        retlw      45      ;H49  9
        retlw      47      ;H50  10
        retlw      48      ;H51
        retlw      49      ;H52
        retlw      50      ;H53
        retlw      51      ;H54
        retlw      53      ;H55
        retlw      54      ;H56
        retlw      55      ;H57
        retlw      56      ;H58
        retlw      57      ;H59
        retlw      58      ;H60
        retlw      60      ;H61
        retlw      61      ;H62
        retlw      62      ;H63
        retlw      63      ;H64
        retlw      64      ;H65
        retlw      65      ;H66
        retlw      67      ;H67
        retlw      68      ;H68
        retlw      69      ;H69
        retlw      70      ;H70
        retlw      71      ;H71
        retlw      73      ;H72
        retlw      74      ;H73
        retlw      75      ;H74
        retlw      76      ;H75
        retlw      77      ;H76
        retlw      78      ;H77
        retlw      80      ;H78
        retlw      81      ;H79
        retlw      82      ;H80
        retlw      83      ;H81
        retlw      84      ;H82
        retlw      86      ;H83
        retlw      87      ;H84
        retlw      88      ;H85
        retlw      89      ;H86
        retlw      90      ;H87
        retlw      91      ;H88
        retlw      93      ;H89
        retlw      94      ;H90
        retlw      95      ;H91
        retlw      96      ;H92
        retlw      98      ;H93
        retlw      99      ;H94
        retlw      100     ;H95
        retlw      101     ;H96
        retlw      102     ;H97
        retlw      104     ;H98
        retlw      105     ;H99
        retlw      106     ;H100
        retlw      107     ;H101
        retlw      109     ;H102
        retlw      110     ;H103
        retlw      111     ;H104
        retlw      112     ;H105
        retlw      114     ;H106
        retlw      115     ;H107
        retlw      116     ;H108
        retlw      117     ;H109
        retlw      119     ;H110
        retlw      120     ;H111
        retlw      121     ;H112
        retlw      123     ;H113
        retlw      124     ;H114
        retlw      125     ;H115
        retlw      127     ;H116
        retlw      128     ;H117
        retlw      129     ;H118
        retlw      131     ;H119
        retlw      132     ;H120
        retlw      133     ;H121
        retlw      135     ;H122
        retlw      136     ;H123
        retlw      138     ;H124
        retlw      139     ;H125
        retlw      141     ;H126
        retlw      142     ;H127 87
        retlw      144     ;H128 88
        retlw      145     ;H129 89 
        retlw      147     ;H130
        retlw      148     ;H131
        retlw      150     ;H132
        retlw      151     ;H133
        retlw      153     ;H134
        retlw      154     ;H135
        retlw      156     ;H136
        retlw      157     ;H137
        retlw      159     ;H138
        retlw      161     ;H139
        retlw      162     ;H140
        retlw      164     ;H141
        retlw      166     ;H142
        retlw      168     ;H143
        retlw      169     ;H144
        retlw      171     ;H145
        retlw      173     ;H146
        retlw      175     ;H147
        retlw      177     ;H148
        retlw      179     ;H149
        retlw      180     ;H150
        retlw      182     ;H151
        retlw      184     ;H152
        retlw      186     ;H153
        retlw      188     ;H154
        retlw      191     ;H155
        retlw      193     ;H156
        retlw      195     ;H157
        retlw      197     ;H158
        retlw      199     ;H159
        retlw      202     ;H160
        retlw      204     ;H161
        retlw      206     ;H162
        retlw      209     ;H163
        retlw      211     ;H164
        retlw      214     ;H165
        retlw      216     ;H166
        retlw      219     ;H167
        retlw      221     ;H168
        retlw      224     ;H169
        retlw      227     ;H170
        retlw      230     ;H171
        retlw      232     ;H172
        retlw      235     ;H173
        retlw      238     ;H174
        retlw      241     ;H175
        retlw      245     ;H176
        retlw      248     ;H177
        retlw      251     ;H178  138
        retlw      254     ;H179  139
        ;guard band
        retlw      255     ;H180  140
        retlw      255     ;H181
        retlw      255     ;H182
        retlw      255     ;H183
        retlw      255     ;H184
        retlw      255     ;H185
        retlw      255     ;H186
        retlw      255     ;H187
        retlw      255     ;H188
        retlw      255     ;H189
        retlw      255     ;H190
        retlw      255     ;H191
        retlw      255     ;H192
        retlw      255     ;H193
        retlw      255     ;H194
        retlw      255     ;H195
        retlw      255     ;H196
        retlw      255     ;H197
        retlw      255     ;H198
        retlw      255     ;H199
        retlw      255     ;H200
        retlw      255     ;H201
        retlw      255     ;H202
        retlw      255     ;H203
        retlw      255     ;H204
        retlw      255     ;H205
        retlw      255     ;H206
        retlw      255     ;H207
        retlw      255     ;H208
        retlw      255     ;H209
        retlw      255     ;H210
        retlw      255     ;H211
        retlw      255     ;H212
        retlw      255     ;H213
        retlw      255     ;H214
        retlw      255     ;H215
        retlw      255     ;H216
        retlw      255     ;H217
        retlw      255     ;H218
        retlw      255     ;H219
        retlw      255     ;H220
        retlw      255     ;H221
        retlw      255     ;H222
        retlw      255     ;H223
        retlw      255     ;H224
        retlw      255     ;H225
        retlw      255     ;H226
        retlw      255     ;H227
        retlw      255     ;H228
        retlw      255     ;H229
        retlw      255     ;H230
        retlw      255     ;H231
        retlw      255     ;H232
        retlw      255     ;H233
        retlw      255     ;H234
        retlw      255     ;H235
        retlw      255     ;H236
        retlw      255     ;H237
        retlw      255     ;H238
        retlw      255     ;H239
        retlw      255     ;H240
        retlw      255     ;H241
        retlw      255     ;H242
        retlw      255     ;H243
        retlw      255     ;H244
        retlw      255     ;H245
        retlw      255     ;H246
        retlw      255     ;H247
        retlw      255     ;H248
        retlw      255     ;H249
        retlw      255     ;H250
        retlw      255     ;H251
        retlw      255     ;H252
        retlw      255     ;H253
        retlw      255     ;H254
        retlw      255     ;H255  215

;--------------------------------------------------------------
entry:  ;initialization
        ;-------------------------------------------------------Interrupt
        ;kill interrupt
        clrf       intcon
        ;-------------------------------------------------------Clock
        ;INTOSC internal medium frequency, 250kHz, by MFINTOSC
        ;osccon=b'01001010'
        movlb      1           ;select bank 1
        movlw      b'01001010' ;4x pll disabled, 250kHz, internal clock
        movwf      osccon
        ;have set clkout to RA4 (pin3), by CLKOUTEN in config1 word
        ;RA3 pull-up, for reset switch
        ;(pull-up is always on when config1 MCLRE bit is set, so, comment them out)
        ;movlb     4
        ;movlw     b'00001000' ;bit for RA3
        ;movwf     wpua        ;set weak pull-up reg a
        ;-------------------------------------------------------ADC
        ;setRC3 as analog input for ADC. set ANSELC and TRISC
        movlb      1           ;select bank 1
        movlw      b'00001000'  
        movwf      trisc       ;reg C bit3= high impedance. assign C3 as input
        movlb      3           ;bank 3
        movlw      b'00001000' ;RC3 as analog input
        movwf      anselc      ;assign RC bit 3 as analog input
        movlb      1
        movlw      b'00011101' ;AD input is AN7, AD not in progress, ADC enabled
        movwf      adcon0
        ;set refference voltage, upper and lower, in ADCON1
        ;AD left align
        movlw      b'00000000' ;left justified, FOSC/2, Vref-=Vss, Vref+=Vdd
        movwf      adcon1
        movlw      b'00000000' ;no auto-conversion
        movwf      adcon2
        ;-------------------------------------------------------DAC
        ;set RA2 as analog output outof DAC
        ;DAC1CON0 reg for DAC1OUT2
        movlb      2
        movlw      b'10010000' ;1001000 DAC enabled, output to DAC1OUT2 (RA2 pin), Vref+=Vdd, Vref-=Vss
        movwf      dac1con0
        clrf       dac1con1    ;output voltage =0 for now
        ;-------------------------------------------------------PSSlock
        ;psslock, prevent from unexpected mode change
        movlb      28
        movlw      1
        movwf      ppslock     ;pps is locked, no further pin assignment change allowed
        ;------------------------------------------------------preset value if any
        movlb      0           ;bank 0

        goto       loop1
;---------------------------------------------------------------
loop1: ;main loop
        ;Go ADC
        movlb      1
        bsf        adcon0,1    ;AD Go!  bit1
        btfsc      adcon0,1
        goto       $-1         ;wait for adc complete
        ;read Vth
        movf       adresh,w
        ;save the value into advalue
        movlb      0
        movwf      advalue
ADCComp: ;AD coversion is complete, result is in advalue

;----------------------------------------------------------------
AD2DA:  ;We convert AD value to Varicap value using look-up table
        ;40=<n test
        movf       advalue,w
        sublw      Bias-1      ;39-w, c=0 if w>39, c=1 if w=<39
        btfss      status,c    ;skip if c=1
        goto       LookupConvert
        movlw      LowVaricap  ;lowest varicap voltage
        goto       ConversionComp
LookupConvert:
        movlw      Bias        ;w=40
        subwf      advalue,w   ;advalue-40 --> w
        ;==================================================
        call       TableAD2DA  ;Convert it! <==============
ConversionComp:    ;now you have a lookup converted value in W
        movwf      davalue     ;save in DAvalue (not needed but for any future use)

;-----------------------------------------------------------------
ApplyVaricap:
        ;Apply voltage to Varicap
        movlb      2
        movwf      dac1con1    ;send to varicap
        movlb      0

        goto       loop1
        end



追加情報:
使ったバリキャップ 1S1658 は今では多分入手できないものなので、その特性を載せておきます。  自分で測定したものです。 比較的容量が大きい種類です。

(注) バリキャップ電圧と周波数の関係:
上記の記事の中でバリキャップ電圧と周波数シフトの関係を測定しました。 このとき、
1. 温度を 44 ℃ 一定として(つまりほかの部品の温度影響を除外して)バリキャップの電圧を変化させ、その時周波数が 60MHz からどれだけ動くか
を測りました。 それに対して、本来は、
2. 温度を変化させ(つまりほかの部品に温度の影響を与えて)周波数が動いたとき、 60MHz に戻すようにバリキャップ電圧を動かしてその電圧を測る、
という方法を取るべきです。
この2者は似て非なるものです。 周波数の変位が微小であるならほとんど一致しますが、100Hz を超えるような大きい変動の時は必ずしも同じカーブにはなりません。  水晶に並列の容量は、この回路の場合右側と左側にありますが、単なる容量のだけ時は左側と右側で互いに補正するようにしますから、あまり問題にはなりません。
ところが、今回の回路では、右側に同調回路が入りますので周波数の位置が異なりますとリアクタンスが大きく非直線に変動して、上記の2者は大きく異なってしまいます。  この問題は当初から気付いていましたが、本来行うべき後者の方法では大掛かりな環境と時間がかかるため、諦めて前者で代用しました。  後で、問題が出た場合は手動で補正するつもりでした。


[考察]
Abracon の ASGTX-C-30.000MHZ-1 という VCTCXO があります。  ==> ASGTX データシート
TCXO ですが、制御端子の電圧を変えることで周波数をピッタリ 30MHz に合わせることができるものです。  1~2ppmの安定度だと宣伝しています。 少し高価ですが、これをオーブンに入れてやれば簡便に基準発振器になりそうです。  この TXCO の出力を 10pF 程度を介して、今回バリキャップを入れた端子につないでやるとロックインされます。  上記の方法よりも小型にできそうな気もします。  小さな部品ですからオーブンがとても小さいもので済みます。
あるいは、購入したものの温度特性を測って、直線に近いものであればサーミスタと組み合わせて変動分を抑え込めるかもしれません。  カタログのグラフでは波打っている特性のものがあるので注意が要りますけれど。
これを使うときは、CR282 は必要ではなく、元の 30MHz の水晶で十分です。
これは上記の設計をしている途中で気が付いたのですが、何となく PIC を使ったほうが面白そうなのでそのまま進めました。

最近はやりの MEMS を使う手もあるかもしれません。  ちょっと手に入れて実験してみましたが、入手したものでは C/N が非常に悪く、位相が安定しないので使いませんでした。




コメントはこちらへ==> Forum

サイトの最初のページに行くTopPage

#IC-R75周波数安定化 #CR-282周波数変動 IC-R75 Frequency stability CR282 styabilize
(01/09/2019)武        

Ⓒ Copyright 2019  T. Fujiwara      All rights reserved.
Archiving or copying this article without the author's permission is prohibited.

ICOM IC-R75 frequency stabilization 周波数 安定化
作者: 藤原 武 Tak Fujiwara