DDS-VFOのつづきだ。 ここからはプログラムによって実現した機能の話しになる。回路図を見てもわからない部分だから、どこまで伝えられるかちょっと心配だ。 これはプログラム・リストを公開したからと言って伝わるものではないそうだ。(BASCOMは簡単とは言え、誰もがプログラムを読める訳じゃない。実際、他人サマが書いたものを解るのも容易じゃないし・・)
マイコン単独で機能が完結する「マイコン製作もの」なら機能説明も難しくないだろう。 しかし重要な部分ではあってもDDS-VFOは通信機の構成要素の一部に過ぎない。 従って、そのコントロールには通信機の機能が密接に関わりを持っている。
このDDS-VFOの動きを納得するにはスーパー・ヘテロダイン式受信機(←リンク)の知識が必要そうだ。たぶんこうした物に興味を持つようなお方なら大丈夫。十分ご存知という前提で話しを進めさせてもらおう。
# 旨く伝えられれば、「便利なVFO」だとわかってもらえるに違いない。
【想定のトランシーバ】
説明の助けとするために、このDDS-VFOの使用を想定する機器(トランシーバ)のブロック・ダイヤグラムを書いてみた。 受信部は局発を上側にとったシングル・スーパー、送信部はDDS-VFOのあと3段ストレート増幅だ。
いかにもそれっぽいデバイス名が書いてあるが言わば余興である。但し、その通り作ることだってあり得るラインナップにしておいた。 探しまわる人がいると気の毒なので、近代的でポピュラーな半導体ばかりでレアなデバイスは一切使ってない。(笑)
受信状態ではモードスイッチによって発振周波数が変化する。これは、受信モードによって実際の受信周波数と表示周波数の間で誤差が発生しないようにするためだ。スーパー・ヘテロダインの仕組みがわかれば理解できると思うが、これは重要な機能である。USB、LSB、CWにモードを切り替えても受信周波数が変化しないようにしている。
アナログVFOの時代には受信モードごとダイヤルに3本のカーソル線を引いていた。DDSなら発振周波数そのものを補正してしまう。なお、SSB受信ではキャリヤ・センターで、CW受信ではフィルタ・センターで周波数表示される。 送信モードではCWの受信と一致させているので、フィルタ・センターと等価になる。
混乱するかもしれないが、USBにしろ、LSBにしろキャリヤの周波数は自在に設定できる。もちろんCWモードのフィルタの中心周波数も自由に設定できる。使用するIFフィルタの都合に合わせられる。 以下、具体例でモードとDDS-VFOの発振周波数の関係を示しておこう。(ほかダブルスーパ用に表示のシフト機能もあるのでもう少し複雑なこともできるのだが、キリがないので省略させてもらった)
ダイヤルスピード、すなわち1回転あたりの周波数変化は、一つにロータリ・エンコーダの分解能で決まる。 使用したエンコーダは安価なものなのでダイヤルの1回転で96ステップしか得られない。従って、10Hzステップでは1回転で1kHzに満たない変化しか得られない。
そうかと言って100Hzステップでは刻みが荒すぎる。CWのトーンがステップ状に変わるのを感じてしまう。それに100Hzステップでさえ1回転で9.6kHzしか変化しない。バンド内の大きな移動には不便である。
結局、4種類のスピードに切り替えることにした。10Hz、100Hz、1kHz、20kHzステップである。最高速は100kHzステップにしたかったが、内部変数の関係で20kHzになった。それでもダイヤル1回転で約2MHz変化するからHF帯のリグなら大丈夫だろう。
10Hz、100Hz、1kHzはセンターオフのスナップスイッチで切り替える。20KHzは押したときだけONになるプッシュスイッチを使う。この20kHzスイッチはいつでも最優先で機能する。上記ブロック・ダイヤグラムと前回の回路図を参照。
今どきのメーカー製無線機は殆どすべてが周波数シンセサイザ化されたので、交信中に周波数が変動するものなど皆無だろう。
しかし、QRPerの多い7003kHzをワッチしていると、結構ずれて呼んでくる局や、QRH(周波数変動)する自作局もあるのが実体だ。 従って、自身の送信周波数はそのままに、受信している周波数だけを微調整するRITは未だに不可欠な機能である。
RITは昔ながらの可変抵抗器を使っている。但し、すぐにA/D変換してしまいデジタル的に行なうようにした。 A/Dコンバータの分解能は10bitあるが、VRの接触状態次第で少しふらつくので感度を1/10にしている。全部で約100ステップある可変範囲において、1ステップあたり10Hzの変化として安定動作を優先した。従ってRITの操作範囲は±約500Hzである。
この程度の可変範囲で支障ないと思うがもう少し拡大しても大丈夫そうだ。このあたりは、自在に変更しうる。メインダイヤルと同じようにロータリ・エンコーダを使う手もある。(ソフトウエアの変更を要する)
いま、ダイヤルは7000.00kHzに合わせてある。(最小表示は10Hzの桁) 送信モードにするとDDSは7000.000kHzを発振する。写真の右上は、周波数カウンタによる実測値である。この状態では「表示周波数=発振周波数」の関係になっている訳だ。
従って、ブロック・ダイヤグラムにもあるように、DDSの出力を送信アンプに導いて所定のパワーになるまで増幅すれば簡単にCW送信機になる。これがDDS-VFOの基本状態である。(注:実際には7000.000kHz丁度で送信するとオフバンドになる)
参考:以下いずれの写真も周波数カウンタの表示は設定値にピッタリ合っている。少々ウオームアップしてから周波数の校正を行なえばこのように良く合う。特別に撮影用の工夫をした訳ではない。DDS-VFOはクロックの水晶発振器と同じ周波数安定度が得られるのでかなり安定だ。
上記と同じ状態でTX/RXスイッチを切り替えて受信モードにする。いま受信モードはCWである。
想定している受信機はシングルスーパーであって、使っているCWフィルタの中心周波数は455kHzと想定している。
従ってDDSは7455.000kHzを発振する。「発振周波数=受信周波数+IFフィルタの中心周波数」の関係だ。 なお、CW受信のためのBFOはフィルタの中心周波数から上か下に700〜800Hzくらい離れた周波数にする。 可変周波数形のBFOでも良い。
【USBの受信モード】
次に、USB受信モードにしてみよう。SSB受信フィルタは中心周波数が455kHzで帯域幅は3kHzのものを想定している。USB受信するにはSSB復調器に与えるキャリヤ発振周波数は453.5kHzになるはずだ。従って、DDS発振器は7453.500kHzになる。
「発振周波数=受信周波数+(USBの)キャリヤ周波数」と言う関係になる。
もちろん、フィルタの特性によりキャリヤ周波数は必ずしも453.5kHzとは限らない。このキャリヤ周波数は「変数」としてセットできるから、ある程度任意に設定できる。
【LSBの受信モード】
同じく、LSB受信モードにしてみよう。 LSB受信では456.5kHzのキャリヤで復調することを想定している。
USBと同じように、「発振周波数=受信周波数+(LSBの)キャリヤ発振周波数」の関係になる。 従って、発振周波数は7456.500kHzとなる。
USBのときと同じようにキャリヤ周波数は「変数」でセットできる。もちろんある程度任意である。
以上、いずれもブロック・ダイヤグラムに従った説明用なので、教科書的な周波数関係になっている。 そのようになるようプログラムを初期設定しておいたからだ。 実態に合わせてプログラム的に初期値を変更できるのは勿論だ。
以上、受信モードと発振周波数の関係を示したが、かなり自由な設定が出来る。
写真は左からCollinsのSSB用・メカフィル、MurataのAM用・セラフィル(R)、そして自作のCW用・世羅多フィルタである。
これらは、少しずつ中心周波数がずれているので、昔のアナログVFOを使ったリグにおいては一緒に使うのはかなり厄介だった。 このCollins製SSBフィルタの中心周波数は453.5kHzである。 キャリヤ・ポイントはUSBが約452.000kHz、LSBは約455.000kHzになるだろう。 AMフィルタの中心周波数は標準的な455kHzである。一方、自作したCW用・世羅多フィルタの中心周波数は約439.4kHzである。
このようにだいぶずれた中心周波数のフィルタを混在して使うのはアナログVFOではいささか厄介なことになる。 モードを切り替えるたびに受信周波数が大きく飛んでしまったからだ。 切換えのたびにダイヤルCALが必要なのでは実用的でない。
しかしDDS-VFOなら支障はない。モードに従った発振周波数の補正でフィルタ周波数の違いを吸収できる。 極端なはなし、CW用は455kHzのフィルタを使い、SSB用は2MHzのフィルタを使うと言うような芸当もこなせる。 モードを切り替えても受信周波数は自動的に調整されるから、もちろんダイヤルを合わせ直す必要はない。
# こうした目的によって変える必要がある一連の「変数」はプログラム初期化部分にまとめておいたので、後々の活用も容易だろう・・・と自己満足。(笑)
難解にならない範囲でプログラムのことも書いておこう。初めてDDS-ICを使うときは不安なものだ。いきなり複雑なものが動くのか心配になる。このプログラムは非常にプリミティブな「DDS版のLEDチカチカ」のようなものだ。(笑)
ごく簡単で確実なプログラムで基本的な動作を確認しておけば、トラブルがあっても問題の分離が容易になる。 このプログラム・リストはあらかじめ判っている周波数データをDDS-ICにセットし、正しくその周波数で発振するのを確認するものだ。 注:プログラムの転載おことわり。
DDS制御のエッセンスを凝縮した必要最低限の部分だけでできている。 この短いプログラムが正常に動作すればマイコンからAD9834:DDS-ICへのデータ転送はうまく行っている。 マイコンもDDS-ICにも回路的な(=ハードウエア的な)問題はないことがわかる。 あとは必要な機能を実現するためのプログラムを頑張れば良い。
なお、例示のプログラムはDDS-ICに与えるクロック発振器の周波数誤差は補正していない。従ってジャスト7000.000kHzにはならぬだろうが、せいぜい1kHz以内の誤差に収まるはずだ。 DDSの動作を受信機や周波数カウンタで確認してみる。
もしも67.10886MHz以外のクロック発振器を使うなら、発生周波数は周波数比だけずれる。周波数の計算はごく簡単だ。(例えばクロックが50MHzなら、約5215406Hzになる)DDS-VFOを作ったら、まずはごく簡単なこうしたことから確かめることが非常に重要な一歩だと思う。 これが確かに動かぬようでは、どんな「高級プログラム」もマトモに動きはしない。
参考:このテスト・プログラムを走らせるAVRマイコンは何でも良い。但し、PortC.0にDDS-ICのFSYNC、PortC.1に同SDATA、PortC.2に同SCLKを配線する。ヒューズビットを操作しクロックは内蔵RC発振の8MHzにセットする。ATmega8、ATmega88、ATmega168、ATmega328がお薦め。 或はプログラムの必要箇所を書き換えてPortBやDを使うようにすれば、手持ちのATtiny2313やATtiny26(L)、ATtiny861Aで試すこともできる。(修正は簡単だ。方法は私に聞かず各自努力で)
【DDS-ICへデータ転送・1】
写真はマイコンからAD9834:DDS-ICへデータ転送している様子だ。クロックに同期して16Bit分のデータが連続3回送られる。 BASCOM-AVRのShift outコマンドで16bitデータを簡単に送ることができる。
開発の初期段階では、様々な原因で正常に動作してくれなかった。 回路的な問題なのかプログラムに何か欠陥があるのか、それぞれ旨く分離できなかった。 そこで、実際に送られるデータをデジタル・オシロスコープで直接観測して確認すると言った作業が必要になった。 上記のようなごく簡単なプログラムを作成し一歩ずつ確認する作業を進めて完成へと前進して行った。
こうして観測してみると色々なことがわかる。 AD9834に一つの周波数データを送信するのに要する時間は約126μSであった。 ロータリ・エンコーダを読み込むタイマー割り込みの周期は約2mSである。従ってデータ転送には十分余裕があり、合間に周波数データの演算処理は問題なくできることがわかる。 また、2mSおきにのべつ幕無しにデータを送り続ける訳ではない。状態に変化がない限り送らぬようにしている。 一番処理時間が掛かっているLCD表示にも十分な時間を割当できているようだ。
写真はAD9834:DDS-ICへデータを送り始めた先頭の部分である。 下段のシフトクロックに同期して、シリアルにデータが送られている様子がわかる。
X軸のカーソルで示すように、SCLK:シフト・クロックの周期は約2.4μSである。 また、画面に記入したようにSDATAの様子を見れば実際にどんなデータが送られているのかも解析可能である。
AVRマイコンからDDSへのデータ送信が旨く行かないのなら、こうした泥臭い解析も必要になってくる。 開発の過程では何でもアリだと思ってやってみる決意こそが必要なようだ。 お陰でまたまたデジタル古城の主に。(爆)
☆ ☆ ☆ ☆ ☆
MIZUHOのVFOを目標にして開発を始めた。具体的に使用機器を想定すると、様々な配慮が必要になってくる。そうした実用上のニーズもうまく盛り込むことができたようだ。
DDS-ICにデータを送ることができ、所定の周波数で発振が確認された時点で一つのハードルはクリヤできたといえる。 しかし、実用性を高め汎用性も確保するには種々の機能を取り込む必要がある。 プログラムの基本はAD9834:DDS-ICへのデータセッティングにあるが、セットすべきデータをどのように加工するのかは各自工夫の部分だ。
どんな構成のRigに使うのか構想を描きながらプログラム開発を進め、それが実現できるのは楽しいものだ。 完成した後でもプログラミングの範囲なら思い立ったらすぐ自在に変更できる便利さもある。そしてバグが発見されたら直すことも。hi マイコンを使ったRigの製作は自作HAM向きだと思っている。
もちろん、いつものように以上は自身の要求に基づいた「私的な開発品」である。各人それぞれ考えが違えば要求も異なって当然だろう。 お薦めするような物ではないが、開発の過程を備忘にとどめる意味でBlogにしておいた。例によって「読み物風」になったが悪しからず。
着手してから約1ヶ月半、あれから数えれば数年掛かってしまったがAVRマイコンを始めた自身の目標がまた一つ達成できた。これでやっと肩の荷が下りた気分である。今夜はビールが旨いぞー。 de JA9TTT/1
参考(追記:2013.05.10):AD9850搭載の中華DDSモジュールを扱った別編は:→こちら。
参考(追記:2013.05.10):AD9850搭載の中華DDSモジュールを扱った別編は:→こちら。
(おわり)