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 が非常に悪く、位相が安定しないので使いませんでした。
コメントはこちらへ==>
#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