CPLDで遊ぼう!(18)
78F9222のコーナー(9)
更新日:2006年9月14日

正弦波ジェネレータを作ろう
前回のCPLDとNECマイコンのコラボに気を良くして今回は最初から合体のコラボレーションで製作を進めます。1Hz単位で周波数の設定が出来る正弦波ジェネレータを作ります。なんとか発表出来るレベルになりましたので今回大公開です。
正弦波ジェネレータを作ろうの基本仕様
1)正弦波を出力する装置である。正弦波は2.5Vをセンターに振れる信号とする。
2)周波数は1Hz単位に設定出来る。最大周波数は78KHzとする。
3)正弦波の出力レベルは0Vから約3Vp−p程度まで出力可変が出来る。
4)周波数の設定はテンキーにて操作する。入力した数字は順次左シフトとして表示する。
5)信号は8bit精度であり極めて綺麗な波形となっている。
正弦波ジェネレータを作ろうの全体構成図
CPLD部はベースクロックの発生と正弦波データの出力を行います。CPLDから出力される8bitのデータは「R−2RラダーD/Aコンバータ」で正弦波に変換します。マイコンは入力された周波数をCPLDが使用する周波数に変換したデータをシリアルでCPLDに送る役目をしています。
(正弦波ジェネレータの構成図)
正弦波ジェネレータを作ろうのCPLD内部構成図
最初にCPLDの内部の構成を示します。前回と同様にシリアルデータ入力、ベースクロック発生部の構成は全く同じです。そのベースクロックを元に正弦波生成モジュールが8bitのデータを出力する構成です。正弦波モジュールは設定周波数によって正弦波データアクセスのアドレスを+1、+2、+4する内容となっています。従って正弦波1周期のデータのステップはアドレスが+1の時は256ステップ、+2の時は128ステップ、+4の時は64ステップとなり極めて綺麗な波形を出力することが出来ます。
(CPLD内部構成図)
正弦波ジェネレータを作ろうの正弦波データの作成
正弦波1周期分のデータを先に作成します。私はエクセルシートで計算を行いました。
そのシートからデータを抜粋したものを記します。

データは8bitです。256ステップで1周期とするデータにしました。データが細かいので本当に綺麗な波形を出力することが出来ます。
(正弦波データテーブル)
前回作成しました基本部分のベースクロック発生モジュールは最大で5MHzまでしか出力出来ません。正弦波は1周期で256ステップありますので
5MHz÷256=19.5kHzとなり256ステップの精度では約19kHzまでしか発生出来ないことになります。そこでそれ以上の周波数の場合はステップ数を128ステップとしてデータを取り出すことによって39kHzまで、64ステップとすることで78kHzまでの出力が出るようにしています。どの場合も読み出すステップが違うだけで読み出すデータテーブルは同じ物を使います。
正弦波ジェネレータを作ろうの正弦波生成モジュール
今回の新しいモジュールはこの正弦波生成モジュールのみです。内容は後閑哲也さん著の「電子制御のためのPIC応用ガイドブック」に記載内容を参考にさせていただきました。
(正弦波生成モジュールの入出力)
(正弦波生成モジュールのVHDLソース)
入力クロックに従ってサインテーブルがらデータを読み出し出力するだけです。クロックの立ち上がりでデータを読み出してクロックの立下りでデータを出力します。2本のセレクトは読み出すテーブルのアドレスインクリメントのステップを設定するためのものです。
正弦波ジェネレータを作ろうのピン接続のまとめ
ピン接続についてまとめておきます。
(正弦波ジェネレータのピン接続)
正弦波ジェネレータを作ろうのマイコン側回路図
マイコン側の回路図です。テンキーで入力されたデータをシリアルでCPLDに出力します。
(正弦波ジェネレータのマイコン側回路図)
数字入力用のテンキーは前回と同じものを使用します。このテンキーパッドは1台作っておくとコネクタで抜き差し出来るので大変便利です。
(テンキー入力回路)
8bitのデジタルで出力されるデータをアナログ値に変換が必要です。今回は簡単な方式として「R−2RラダーD/Aコンバータ」方式を採用しました。
(変換出力回路)
出力波形は2.5Vセンターに振れます。振幅は調整出来るようにしています。状況に応じて出力にコンデンサーを付けるなどして対応よろしくお願いします。
CPLDとマイコンの間には電位差がありますので前回と同様にバッファ用にICを付けて接続します。
(レベル変換回路)
正弦波ジェネレータを作ろうのポート割付と設定
(ポート割付と設定)
今回もソフトは極めて簡単です。「main.c」だけしかいじりません。
正弦波ジェネレータを作ろうの設定数値データ変換
テンキーで入力される周波数設定値はデータ変換してCPLD側に出力します。
最終的な出力は前回の製作と同じ内容ですが、入力した数字は正弦波の時の周波数なので、精度に応じて次のようにまずは変換します。
1Hz〜19000Hzまで=256倍
19001Hz〜39000Hzまで=128倍
39001Hz〜78000Hzまで=64倍
この変換後前回と同じ変換を通して出力します。出力される正弦波の周波数はピッタリです。
正弦波ジェネレータを作ろうの製作過程と大完成の姿
(ケース加工中です。余分な穴もあります)
(中身は複雑です。ところせましと部品が入ってます)
(出力端子は何とか正面に出せました)
(D/Aコンバータとマイコン周辺です)
(バランス良く配置出来ました)
(すばらしい出来栄えですね)
正弦波ジェネレータを作ろうの周波数確認中
では順に出力される波形を見てみましょう。
(500Hz)
( 1kHz)
( 2kHz)
( 5kHz)
( 8kHz)
(10kHz)
(20kHz)
(30kHz)
(40kHz)
(50kHz)
(60kHz)
(70kHz)
(78kHz)
(出力波形確認)
高い周波数まで綺麗な波形を出力することが出来ました。
(波形高さの確認)
高い周波数から低い周波数まで振幅はほぼ同じです。
(振幅はボリュームで調整可能です)
正弦波ジェネレータを作ろうの全VHDLソースコード
私と同じ製作をされる方、または勉強される方のために全ソースコードなどプログラム一式を公開いたします。フォルダごと圧縮しましたのでそのままもってって下さい。
全ソースコードはこちらです。
正弦波ジェネレータを作ろうのマイコンソースファイル
ソースファイル一式はこちらからダウンロードして下さい。フォルダごと圧縮しています。全ファイルが入っています。ライタで書き込みする実行ファイルも含まれています。
皆さんいかがでしたでしょうか。CPLDとマイコンのコラボレーションでますます世界が広がったように感じています。これからも楽しい製作をどんどん発表したいと思っております。
これからもますます楽しくなる「CPLDで遊ぼう!」をよろしくお願いいたします。
これからも「NEC78K0/K0Sマイコン開発室」はどんどん楽しくなります。