VFOとはいえ、バリキャップがついているのでVCOと呼ぶべきですが、VFOということにして...
このVFOは、PICマイコンでの制御を目指していて、PICマイコンから出たなんらかの信号でバリキャップの電圧を上げ下げして、周波数を上げ下げします。
このとき、発振周波数をPICマイコンで測定し、設定周波数と異なる場合は、バリキャップを制御し、目的周波数に収束するようにがんばるという構想です。
多くの先人が試しているように、バリキャップの電圧はPWMにより生成することにしました。
PICマイコン(例えば16F88)のPWMの分解能は、1024ステップです。
ディユーティー比として、0~100%まで設定できるわけですから、1ステップあたり0.09765625%ということになります。
以下の議論は多少乱暴ですが、制御電圧範囲を0~12V、周波数の変化を500kHzと仮定すると、
(1) 500kHz / 12V = 41666.7 [Hz/V]
(2) 12V / 1024 = 0.01171875[V]
と考えると、1ステップあたりどのくらいの周波数が変わるかというと、(1)×(2)=488.28125[Hz]ということになります。
本当は、こんなに直線的に変化するはずはないのですが、ま、ざっくりした話しとして。
約500Hz単位でしか電圧が設定できないのはいささか困りますので、ステップを増大させる方法を考えてみました。
細かい話しは抜きにして、PWMの周期が51.2usとします。
CCPRというレジスタがあって、1023まで設定できます。1023を設定すると、PWMの全部の周期でONになります。
この前提で、8個の周期を一組と考えます。
最初の7個までは、aという値をセットします。最後の1個は、aより大きな値を指定します。こうすることで、8個一組で考えた場合のディユーティー比は、細かくなるはずです。
以下の表は、これを計算してみたものです。
mode欄が「0」の場合は、CCPRの設定で8個出します。mode欄が「1」の場合は、CCPRの設定で7個出し、次にCCPR*の設定で1個出します。
1020のあたりから、1023を超える設定不能な値が登場しますが、このあたりは「使わない」ということで。
かなり怪しいですが、一応理屈の上では約2倍のステップに細分化されたことになります。PICマイコンで実装するにはかなり大変でしょうけども...何とかがんばってみたいと思います。
このVFOは、PICマイコンでの制御を目指していて、PICマイコンから出たなんらかの信号でバリキャップの電圧を上げ下げして、周波数を上げ下げします。
このとき、発振周波数をPICマイコンで測定し、設定周波数と異なる場合は、バリキャップを制御し、目的周波数に収束するようにがんばるという構想です。
多くの先人が試しているように、バリキャップの電圧はPWMにより生成することにしました。
PICマイコン(例えば16F88)のPWMの分解能は、1024ステップです。
ディユーティー比として、0~100%まで設定できるわけですから、1ステップあたり0.09765625%ということになります。
以下の議論は多少乱暴ですが、制御電圧範囲を0~12V、周波数の変化を500kHzと仮定すると、
(1) 500kHz / 12V = 41666.7 [Hz/V]
(2) 12V / 1024 = 0.01171875[V]
と考えると、1ステップあたりどのくらいの周波数が変わるかというと、(1)×(2)=488.28125[Hz]ということになります。
本当は、こんなに直線的に変化するはずはないのですが、ま、ざっくりした話しとして。
約500Hz単位でしか電圧が設定できないのはいささか困りますので、ステップを増大させる方法を考えてみました。
細かい話しは抜きにして、PWMの周期が51.2usとします。
CCPRというレジスタがあって、1023まで設定できます。1023を設定すると、PWMの全部の周期でONになります。
この前提で、8個の周期を一組と考えます。
最初の7個までは、aという値をセットします。最後の1個は、aより大きな値を指定します。こうすることで、8個一組で考えた場合のディユーティー比は、細かくなるはずです。
以下の表は、これを計算してみたものです。
mode | CCPR | duty[%] | CCPR* | duty'[%] | |
0 | 1 | 0.0977 | - | - | |
1 | 1 | - | 5 | 0.1465 | |
0 | 2 | 0.1953 | - | - | |
1 | 2 | - | 6 | 0.2441 | |
0 | 3 | 0.2930 | - | - | |
1 | 3 | - | 7 | 0.3418 | |
0 | 4 | 0.3906 | - | - | |
1 | 4 | - | 8 | 0.4395 | |
0 | 5 | 0.4883 | - | - | |
1 | 5 | - | 9 | 0.5371 | |
0 | 6 | 0.5859 | - | - | |
1 | 6 | - | 9 | 0.6348 | |
省略 | |||||
0 | 1017 | 99.3164 | - | - | |
1 | 1017 | - | 1021 | 99.3652 | |
0 | 1018 | 99.4141 | - | - | |
1 | 1018 | - | 1022 | 99.4629 | |
0 | 1019 | 99.5117 | - | - | |
1 | 1019 | - | 1023 | 99.5605 | |
0 | 1020 | 99.6094 | - | - | |
1 | 1020 | - | 1024 | 99.6582 | |
0 | 1021 | 99.7070 | - | - | |
1 | 1021 | - | 1025 | 99.7559 | |
0 | 1022 | 99.8047 | - | - | |
1 | 1022 | - | 1026 | 99.8535 | |
0 | 1023 | 99.9023 | - | - | |
1 | 1023 | - | 1027 | 99.9512 |
mode欄が「0」の場合は、CCPRの設定で8個出します。mode欄が「1」の場合は、CCPRの設定で7個出し、次にCCPR*の設定で1個出します。
1020のあたりから、1023を超える設定不能な値が登場しますが、このあたりは「使わない」ということで。
かなり怪しいですが、一応理屈の上では約2倍のステップに細分化されたことになります。PICマイコンで実装するにはかなり大変でしょうけども...何とかがんばってみたいと思います。
※コメント投稿者のブログIDはブログ作成者のみに通知されます