記事の詳細
後閑哲也先生監修!Wave Generator Web詳細解説



※記事内に試作品の画像を使っているものがあります。
キット版の組み立て方はこちらのPDFもご参照ください
・Windows用アプリケーション [WaveGenev1.0.zip]
・Windows用簡易説明書 [manual.pdf]
- 第一章 Wave Generatorの全体概要
- 第二章 Wave Generatorのハードウェア設計
- 第三章 Wave Generatorのファームウェアの制作
- 第四章 ラズパイアプリケーションの制作
- 第五章 Wave Generatorの使い方
第一章 WaveGeneratorの全体概要
Raspberry Pi(以下ラズパイと略す)とPICマイコンを組み合わせた測定器シリーズより、波形発生器(WAVE GENERATOR)です。
10Hzから20MHz程度の正弦波、矩形波、三角波と、0Vから4.096VのDC信号を出力できます。周波数設定や波形選択をブラウザからできるようにしています。
完成した外観は写真Aのようになります。Raspberry Pi3BとPICマイコンで製作した波形生成ボードの2つで構成されています。両者の接続はUSBシリアル変換ケーブルでラズパイのUSBと接続するか、ヘッダピン接続ケーブルを使ってラズパイのGPIOと接続するかの2通りがあります。
写真はGPIOで接続した場合です。

1-1 WAVE GENERATORのシステム構成
製作するWAVE GENERATORの全体構成は図Aのようにするものとします。波形生成そのものはPICマイコンで製作した「波形生成ボード」のDDS(Direct Digital Synthesizer)で行います。パソコンやタブレットのブラウザで表示したページで設定した波形の種別と周波数またはDCレベルを、ラズパイからUSB経由またはGPIO経由のシリアル通信で波形生成ボードに送ります。それを受信した波形生成ボード内のPICマイコンからDDS ICを制御して波形を生成します。DCレベルの場合はPICマイコン内蔵のD/Aコンバータから出力します。

1-2 WAVE GENERATORの仕様
製作するWAVE GENERATORの目標とする性能仕様は表Aのようにするものとします。波形は正弦波と矩形波と三角波のいずれかを出力し、同時にDCレベルの信号も出力できます。
波形の周波数は1Hz単位で設定ができます。

ラズパイと波形生成ボード間の通信フォーマットは表Bのようにしました。

ブラウザでの表示形式は図Bのようにするものとします。一定周波数設定とスイープ設定、DC電圧設定の3つの窓から構成されています。URLのアドレスはIPアドレスとポート番号で指定します。

第2章 Wave Generatorのハードウェア設計
WAVE GENERATORの心臓部となる波形生成ボードを製作します。
このボードはPICマイコンとDDS ICを中心に構成しています。
波形生成ボードの外観は写真Aのようになります。

2-1 全体構成
波形生成ボードの全体構成は図Aのようにしました。全体制御はPICマイコンの16ビットファミリである「dsPIC33EP64GS502」を使いました。これを選定したポイントは、12ビット分解能のD/Aコンバータを内蔵しているということです。このD/Aコンバータの出力にオペアンプを追加して増幅し、最大4.096VのDCレベルの出力としています。これでちょうど1mV単位でDC出力ができます。
波形生成にはアナログデバイス社のDDS ICを使いましたが、このDDSからの波形出力は0Vから0.6Vの範囲のDCレベルの出力となっています。これを数Vp-pの交流信号になるよう増幅する必要があります。
そこでDDSの出力にコンデンサを挿入して直流成分をカットして交流信号にし、次にオペアンプを使って増幅します。0Vを基準にした交流増幅ですのでオペアンプの電源にはプラスマイナスの両電源が必要になりますから、DC/DCコンバータで+5Vから-5Vを生成して使います。増幅した後にレベル調整をするための可変抵抗を挿入し、さらに1倍のバッファアンプを通してから出力信号としています。
矩形波出力はDDS ICのTTLレベルの出力をそのまま出力としました。正弦波と同じ周波数の矩形波が出力されます。

2-2 DDS IC AD9834の使い方
本稿では波形出力用にアナログデバイスのDDS専用ICであるAD9834を使っています。以下、このICの使い方を説明します。
このICの内部構成は図B(a)のようになっています。高速で高分解能なディジタルシンセサイザ機能(DDS)を内蔵していて、外部から設定された周波数の正弦波か三角波を生成します。最高75MHzまで動作し、周波数設定レジスタは28ビットとなっています。また出力部には10ビット分解能のD/Aコンバータが使われていますので、十分きれいな波形を出力してくれます。
さらにSIGN BIT OUTのピンには正弦波と同じ周波数の矩形波を出力できるようになっています。

このICの仕様規格は表A、ピン配置と各ピンの機能は図Cのようになっています。


マイコンとのインターフェースは3線式シリアルインターフェースとなっています。このインターフェースは、図B(b)のようなタイムチャートで使います。SCLKクロックは最大40MHzと十分の速度で動作しますからPICマイコンのフルスピードで制御しても全く問題ありません。FSYNCがLowになってからSCLKの立下りでデータをサンプリングしますので、立ち上りでデータを更新します。
1回で送信するデータは16ビットで、周波数設定には図Dのように連続で3個のデータを送信します。最初の16ビットが制御データとなっていて、図に示した値(0x2028)を設定すると周波数レジスタ0側(FREQ0)の28ビットの周波数設定で動作するようになり、IOUTピンに正弦波が、SIGN BIT OUTピンに矩形波が出力されます。矩形波はOPTITENビットで出力有無を制御できます。
MODEビットを1にすれば三角波が出力されますが、この場合には矩形波は出力されません。

続く2ワードのデータが周波数設定データで上位と下位合わせて28ビットで周波数を設定します。
実際に出力される周波数は次の式で求められます。

今回はクロックに67108864Hz つまり 226の周波数を使いましたので、1/4Hz単位で周波数を設定できることになります。
2-3 回路設計と基板製作
全体構成に基づいて作成した回路図が図Eとなります。右上にあるMountの記号は取り付け用の穴で、各位置のグランドパターンに接続しています。
電源はラズパイの5Vか、USBシリアル変換ケーブルからの5Vのいずれかを使用します。5Vを直接DDSICとオペアンプの電源としますので、フィルタを通してノイズ対策をしています。PICマイコンは3.3Vですから3端子レギュレータで生成しています。
DDS IC出力の直流カット用コンデンサには、チップセラミックの100uFという大容量のものを使って低い周波数も十分通過できるようにしています。
正弦波の出力インピーダンスを50オームとするため、オペアンプの出力に51オームの抵抗を直列に挿入しています。

回路図を元にプリント基板を作成しました。
このプリント基板に図Fの実装図にしたがって部品を実装していきます。
はんだ面への実装部品が多いので最初に表面実装部品のICをはんだ付けします。特にDDSが小さいのでこれらを慎重に取り付けます。
次にレギュレータIC、オペアンプ、チップコンデンサをはんだ付けします。はんだ面が終わったら部品面です。最初はジャンパ線です。
スイッチ部のジャンパ配線はスイッチ自身でできますので配線は不要です。
次は抵抗ですがすべて横向きに取り付けます。次がICソケットです。あとは大物を取り付けていきます。クリスタル発振器は購入時期により外観が異なっているものがありますが、ピン配置は同じですので問題ありません。

こうして組み立てが完了した基板の部品面が写真Aとなります。こちら側は部品点数も少ないのですっきりしています。

写真Bがはんだ面で、こちらの方が小型部品で部品点数も多く丁寧な作業が必要です。とくにICのピン間のはんだブリッジがないことを十分チェックしてください。

第3章 Wave Generatorのファームウェアの製作
続いて波形生成ボードのPICマイコンのプログラムの製作です。使ったPICマイコンが16ビットファミリですから、MPLAB X IDEとXC16 Cコンパイラを使って製作します。
3-1 プログラム全体構成
製作するプログラムの全体構成をフロー図で表すと図Aのようになります。最初に周辺モジュールの初期設定を行っています。とくにタイマ2とタイマ3を32ビットタイマとして、スイープの際の時間間隔用に使います。初期化の最後にDDSを1kHz出力に設定しています。その後の動作はすべてラズパイからのコマンド受信で開始されます。
ラズパイからの受信は割り込みで常時受け付けられ、コマンド受信完了でフラグがセットされますから、それをメインループでチェックし、固定周波数出力コマンド(N)であれば指定周波数を受信データから取り出し。文字から数値に変換してからDDSへの設定を行います。
スイープコマンド(W)の場合には、まず、現在すでにスイープ実行中であればそれをいったん停止させます。その後、スイープ開始周波数、終了周波数、周波数間隔のデータと、スイープ時間間隔のデータを受信データから取り出して数値に変換し、指定された時間間隔をタイマにセットしてからタイマをスタートさせます。このあとはタイマの割り込みで順次進めることになります。
タイマの割り込み処理では、終了周波数になったかどうかを判定し、終了していればタイマを停止させます。まだ終了していなければ、次の周波数を指定されたステップで計算してDDSに設定出力します。

3-2 プログラム詳細
プログラムの最初は宣言部ですが、ここではコンフィギュレーションの設定とグローバル変数の定義、関数のプロトタイピングをしています。宣言部の詳細がリストAとなります。
ラズパイとの送受信バッファはキャラクタ型として定義し、文字列で送受信しています。

次はメイン関数部でリストBとなります。
最初にちょっと複雑なクロックの設定ですが、今回は最高周波数の120MHzで動作させています。
次は入出力ピンの設定で、DACの出力ピンをアナログピンにするようにします。
タイマ2とタイマ3を連結して32ビットタイマとして使います。これはスイープ間隔を1秒以上まで伸ばすためです。
次はUARTの初期設定でラズパイに合わせて115.2kbpsの速度としています。
次がDACの初期設定ですが、このDACはコンパレータの付属モジュールになっていますので、コンパレータ用のレジスタを使って設定します。
最後がDDSの設定で初期設定としては特になく、通常の周波数設定出力をするだけです。初期値を1kHzの出力としています。

このあとメインループに入ります。メインループの詳細は簡単で、受信があったら受信データ処理関数のProsess()を呼び出しているだけです。
次が受信データ処理関数のProcess()の詳細でリストCとなります。
まず、受信したコマンド種別、NかWで分岐します。Nの場合は固定周波数出力ですので、受信データから周波数の文字列をとりだし、最後に0を追加して文字配列にしてからatol関数で数値に変換します。
そしてその周波数でDDSを設定します。波形種別の制御はDDSの設定関数の中で実行しています。
続いて直流電圧の出力も実行しています。同じように電圧文字列を取り出し、数値に変換してからDACの設定をしています。電圧値には上下限制限を設けています。
Wコマンドの場合はスイープなので、同じように開始周波数と終了周波数、時間間隔の文字列を取り出して数値に変換します。
周波数刻みは1/10か1/100の2種類に限定しましたので、そのまま使います。
時間間隔は最小10msecで最大1秒という制限を設けています。
この時間をタイマ2とタイマ3に振り分けて時間設定をしています。

次がタイマの割り込み処理部でリストDとなります。タイマはスイープの際に使われます。ここで割り込みの都度周波数をアップさせてDDSに出力しています。
周波数アップの刻みは1/100と1/10の2種類にしていますが、現在周波数のディケードの1/100か1/10にします。つまり現在が140kHzであれば100kHzの1/100か1/10にします。このためにlog計算を使っています。
周波数アップで終了周波数を超えたら終了ということでタイマを停止させています。

最後がDDSの制御関数部でリストEとなります。
最初に設定周波数からDDSの周波数設定値を求めます。DDSの周波数は1/4Hz単位ですので、指定周波数を4倍すればよいことになります。さらにこれを14ビットずつに分割して設定値とします。
次に出力する波形種別のコマンド部を取り出して種別に合ったDDS制御コマンドを出力します。その後で周波数設定を出力しています。
実際に16ビットの出力をするDDS用関数がSerialOut()関数で、SPIを使わずプログラムI/Oで作りました。

第4章 ラズパイのアプリケーションの製作
次はラズパイで動作させるアプリケーションプログラムの製作です。こちらは、ラズパイに標準実装されているRaspbianを有効活用して製作します。
4-1 プログラムの全体構成
Wave Generatorの周波数などの設定をブラウザで行うために製作したプログラムの全体構成は、図Aのようになっています。基本はWebIOPiというアプリケーションを活用し、プログラム部はPythonスクリプトで記述しています。
まず、波形生成ボードのPICマイコンとはシリアルインターフェースで接続しますが、ここは2通りの方法があり、ラズパイのUSBにUSBシリアル変換ケーブルで接続するか、GPIOのシリアルピンに直接接続するかです。本稿ではGPIO経由としています。
WebIOPiというアプリケーションを使ってラズパイがネットワーク経由でブラウザから呼び出されたとき、”GENERATOR.html”というHTMLファイルで周波数などの設定窓とボタンの表示ページを提供します。
ブラウザで周波数などの入力をしたあと、SetupボタンかSweepボタンを押すとMacro.pyのPythonのマクロ関数を実行し、入力した周波数データを含むコマンド文字列をFreq.txtというファイルに保存してから、Generator.pyというPython関数を起動します。Generator.pyでは、保存されたFreq.txtのコマンドをそのままPICマイコンにシリアル通信で送信します。

4-2 HTMLファイルの詳細
ブラウザに表示するページを提供するHTMLファイルの詳細です。まず提供するページの詳細情報は図Bのようになっています。
表題の下はテーブル構成になっていて、3つの枠内に入力フォームを設定しています。さらにそれぞれの入力フォームにはIDを付与してJavascriptから項目を指定して値を取り出せるようにしています。
Shutdownボタンをクリックした場合には、マクロ関数でシェルコマンドのshutdownを実行しています。
このページを実現したHTMLファイルのHeader部がリストAで、ここでJavascriptを記述しています。
最初にJavascriptとwebiopiのJavascriptであることを宣言しています。
次にwebiopiとして使う関数の宣言定義をしています。
続くStartAp()関数がSetupボタンを押したときに実行される関数で、ここで入力された周波数などのデータを取り出し、PICマイコンに送信するコマンドの形式に構成してから、マクロ関数StartUpを呼び出しています。
次のSweep()関数がSweepボタンを押したときに実行される関数で、ここでも周波数や時間間隔のデータを取り出して、PICマイコンへのコマンド形式に構成してからStartUpのマクロ関数を呼び出しています。
最後がShutdownボタンの処理で、確認ダイアログを表示してYesの場合だけシャットダウン処理をするマクロ関数ShuCmdを呼んでいます。

次に、HTMLファイルのBody部でリストBとなります。ここで実際に表示する内容を記述しています。
最初は見出しの表示でちょっと大き目の文字にしています。
その後はテーブル構造にして枠ごとに機能を分けています。
最初の枠が固定周波数出力で、周波数、波形種別、電圧のそれぞれの入力フォームを表示させてから、Setupボタンの表示と呼び出す関数の指定をしています。
次がスイープの機能で同じように各フォームを表示させてから、Sweepのボタンの表示と呼び出す関数の指定をしています。次がメッセージを表示する枠となっています。
最後がシャットダウン機能でShutdownボタンの表示と呼び出す関数の指定をしています。

4-3 マクロ関数スクリプトMacro.pyの詳細
HTMLファイルから呼び出されるマクロ関数のPythonスクリプトですが、内容はいたって簡単でリストCですべてです。
HTMLファイルからStartUpマクロが呼ばれたら、パラメータとして渡されるコマンド文字列をそのままテキストファイルと保存してからGnerator.pyを起動します。
ShutCmdマクロが呼ばれた場合には、シャットダウンのシェルスクリプトを実行しています。

4-4 コマンド送信スクリプト Generator.pyの詳細
最後が、PICマイコンにコマンドを送信するPythonスクリプトで、リストDで全部です。
いたって簡単な構成になっていて、実行するごとに終了するプログラムとなっています。
スクリプトが呼び出されたら通信のシリアルインターフェースのインスタンスを生成して通信ができるようにします。このとき「’/dev/ttyAMA0’」となっている個所を「’/dev/ttyUSB0’」とすればUSBシリアル変換ケーブルで接続して使うことができるようになります。
続いて、コマンド文字列が格納されているファイルを読み出し、そのまま送信しています。

以上がラズパイのアプリケーションプログラムの全体です。
4-5 アプリケーションの実装
WAVE GENERATORとしてラズパイに必要なプログラムができたところで、次はラズパイをWAVE GENERATORとして使うために必要なインストール作業と設定となります。必要な作業は次のようになります。
- Raspbianのインストール
NOOBS ver2.4.0を使いました。標準的なインストールで問題ありません。日本語環境にするのと、Wi-Fiを使ったリモートデスクトップ環境にしておく必要があります。 - シリアルインターフェースの有効化
シリアルインターフェースを有効化します。Raspberry Pi 3Bモデルの場合には、コンソールを無効化しさらにBluetoothを簡易シリアルにする必要があります。その手順は下記となります。
① 次のコマンドで「cmdline.txt」を読み出して内容を変更します。
sudo nano /boot/cmdline.txt
下記の行を修正します。
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline rootwait
シリアルポートの “serial0″を含む記述部、ここでは「console=serial0,115200」の部分を削除します。
② Bluetoothの無効化のためコンフィギュレーションファイルに追記
Bluetoothの設定と、CPUクロック周波数の自動変更を禁止するように修正します。次のコマンドでファイルを読み出します。
sudo nano /boot/config.txt
このファイルの最後に下記2行を追加します。
core_freq=250
dtoverlay=pi3-miniuart-bt - webiopiのインストール
最新の「WebIOPi-0.7.1」をインストールします。このとき、Raspberry Pi2B以降用のパッチも忘れずにインストールします。インストール手順は次のようになります。
①下記で最新バージョンを入手
sudo wget https://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz
②圧縮ファイルを解凍
sudo tar xvzf WebIOPi-0.7.1.tar.gz
③パッチの入手と適用
cd WebIOPi-0.7.1 (ディレクトリの移動)
wget https://raw.githubusercontent.com/doublebind/raspi/master/webiopi-pi2bplus.patch
patch -p1 -i webiopi-pi2bplus.patch
④セットアップ
sudo ./setup.sh
⑤再起動 - webiopiのconfigファイルの変更
WAVE GENERATORとしてwebiopiが自動的に動作するようにconfigファイルをリストEのように4か所追加修正します。

さらにwebiopiが自動起動するように下記1行のコマンドを実行します。
sudo update-rc.d webiopi defaults
5.作成したアプリケーションプログラムを下記ディレクトリにすべて格納する
/home/pi/GENERATOR/
以上の作業でラズパイの電源をオンにすれば、WAVE GENERATORとして自動起動して動作するようになります。
第5章 Wave Generatorの使い方
ラズパイのアプリも完成したらいよいよ動作開始です。ラズパイと計測制御ボードを接続して計測を開始する手順を説明します。
5-1 接続方法
まずラズパイと計測制御ボードの接続方法です。これには2通りの方法があります。
①USBシリアル変換ケーブルを使ってラズパイのUSBで接続する場合
このとき使用する変換ケーブルはUART側がTTL接続となっているものを使います。
ラズパイ側のUSBにはコネクタが4つありますが、どれに接続しても問題ありません。
計測制御ボード側は写真Aのように黒のGNDピンが基板の内側になるように接続します。
USBから電源も供給しますから、計測制御ボードの電源ジャックなどはありません。

②ヘッダピン接続ケーブルを使ってラズパイのGPIOと接続する場合
こちらは写真Bのようにヘッダピン接続ケーブルを使います。
ケーブルは自作しても良いですし市販のものでも構いません。
写真ではたまたま市販の6ピンのものを使いましたので1ピン余分な状態となっています。
こちらの場合もやはりGPIOから電源を供給しますので、接続方向やラズパイの列を間違えないようにしてください。

5-2 ブラウザで開く
ラズパイと計測制御ボードを接続し、ラズパイに電源を供給して、ラズパイの起動が完了すれば、同じネットワークに接続しているパソコンやスマホからブラウザのページが開けるようになります。
ブラウザで開く場合のURLは「ラズパイのIPアドレス:8050」とポート番号を付加して指定すればよいだけです。
本稿ではすべてブラウザに「Google Chrome」を使っていますが、「Internet Explorer」でも見ることができます。
5-3 Wave Generatorの使い方
このWave Generatorの使い方にはいくつかの例題が考えられます。
- 固定周波数出力で回路のデバッグ
オペアンプ回路の動作確認や、発振の有無などが確認できます。 - DC出力でVFOの動作確認
VFOに電圧を加えることで周波数が変化しますが、その動作確認に使えます。 - ローカルオシレータとして使う
受信機などのローカル発振器の代替えとすれば任意の周波数での動作確認ができます。 - オーディオアンプの動作確認
一定の周波数の正弦波を入力して出力の波形の確認をすれば歪の有無などの確認ができす。 - オーディオアンプの周波数特性計測
スイープ機能では、任意の周波数範囲を1/10ステップか1/100ステップでスイープしますから、アンプに波形を入力して、そのアンプの出力をオシロスコープなどで観測すればそのアンプの周波数特性がわかります。 - フィルタの動作確認
オペアンプやLCなどで構成したフィルタの特性をスイープ機能で確認できます。
以上でWave Generatorの説明は終了です。