記事の詳細

Pocket

 周波数特性測定器本体のPICマイコンのプログラム(これをファームウェアと呼ぶ)の詳細設計をします。

 いきなり最終構成のプログラムを製作しようとすると、ほとんどの場合途中で多くのトラブルに遭遇して挫折してしまいますので、部分的に動作を確認しながら進めていきます。

 クロック、Bluetooth、DDS、計測とそれぞれ部分ごとに動作を確認しながら進めます。このためにそれぞれをテストする簡単なプログラムを作りながら動作確認し、正常動作したときの設定や、関数を最終構成にもそのまま使えるように製作していきます。

3-1 プログラム開発環境

 PICマイコンのプログラムの製作をするために必要な環境は図3-1のようになります。Windows 7以降のパソコンに、マイクロチップ社のウェブサイトからダウンロードしたフリーの統合開発環境MPLAB X IDEとCコンパイラMPLAB XC8をインストールすれば環境ができあがります。

 これでプログラムを作成したあと、PICマイコンにプログラムを書き込むとき道具が必要になります。本稿ではマイクロチップ社純正で最も安価なPICkit3を使いました。これをパソコンとUSBで接続すれば即書き込みと実機デバッグがMPLAB X IDEからできるようになります。書き込みはPICマイコンを製作品に実装したままででき、1万回以上の書き換えができますからほぼ何回でも可能ということになります。

 この環境ですべてのPICマイコンに対応が可能で、16ビットや32ビットのPICマイコンでもCコンパイラを変えるだけで使えます。

3-2 コンフィギュレーションとクロック発振の確認

 まず完成した周波数特性測定器本体の内部構成は図3-2のようになりました。この全体構成を基本にしてプログラムを製作していきます。PICマイコンの入出力ピンがポイントで接続されているものが区別されます。

 PICマイコンのプログラムを作成するとき、最初に確認すべきことは、コンフィギュレーションが正しく設定されてクロックが正常に発振しているかどうかです。

 筆者はこれを常に最初に確認しますが、その方法は単純にLEDをチカチカさせる方法です。このような目的やデバッグ時の目印とするため常にLEDを最低限1個は実装するようにしています。

 今回使うPIC16F1783/6/8のコンフィギュレーション設定内容は表3-1のようにします。多くの選択肢があるので迷うことがありますが、通常はこの表の設定で確実に動作します。

 次がクロックの設定です。PIC16F1783/6/8/のクロック部の構成は図3-3のように少し複雑になっています。

 コンフィギュレーションで内蔵クロック(INTOSC)を選択した場合にはOSCCONレジスタのIRCFビットで周波数を設定する必要があります。本稿ではPLLを有効化して8MHzを選択し最高速度の32MHzで使うことにします。

 リスト3-1がRA0とRA1に接続されているLEDを0.1秒間隔で点滅だけをするプログラム「FreqAnalizer01」となります。このプログラムにより100msec周期でLEDが点滅すればコンフィギュレーションとクロックは期待通りになっていることが目で見てわかります。

 ここでmain関数の最初の部分で入出力ピンの入出力モードの設定をTRISxレジスタで行っています。さらにアナログピンとデジタルピンの設定をANSELxレジスタでも行っています。これはPICマイコンの入出力ピンがアナログにもデジタルの入力、出力どれにでも使えるようになっていますので、どう使うかを決める必要があるからです。この設定は最終のアプリケーションでもそのまま使います。

3-3 Bluetoothの動作確認

 次にBluetoothとUSARTの通信動作確認をします。無線通信ができていることの確認が必要ですから、PICマイコンとタブレットの両方が必要になります。しかしタブレットのプログラムを製作してしまうと本来のテストとなりませんから、ここは出来合いのアプリケーションをダウンロードして使います。

 使うアプリケーションは、単純なBluetooth用の通信ソフトで「BT Term」(S2 Terminal for Bluetooth)というフリーのプログラムをマーケットからダウンロードして使います。

 Bluetoothモジュールのテストプログラムは図3-4のような手順で行うものとします。入出力ピンとUSARTモジュールの初期設定後受信待ちに入り、受信した文字データが「A」か「a」の場合は、AからZまでの文字を送信し、受信文字データが「N」か「n」の場合は0から9までの文字を送信、どちらでもない場合は「?」を送信します。

 入出力ピンの初期化では、USARTに対応するピンの入出力モードを忘れずにしておく必要があります。

 そのあと、USARTの初期設定をします。Bluetoothモジュールのデフォルトの通信速度は115.2kbpsですので、それに合わせて通信速度を設定します。

 BluetoothモジュールのリセットはI/Oピンで行うことにしましたから、ここで100msecのLowパルスを出力してリセットします。

 Bluetoothモジュールは通信のプロトコルについては、すべてモジュール自身で実行してしまいますので、使うために特別な制御は必要ありません。

 このテストを行うプログラム「FreqAnalizer02」がリスト3-2となります。このテストプログラムではUSARTの割り込みは使っていません。このUSARTの送受信関数は最終のアプリケーションでも使います。

 このプログラムの動作確認は次のようにします。まず、PICマイコン側のプログラムを書き込んだら、最初にBluetoothのペアリングを実行します。

 ペアリングはタブレットの「設定」アプリで行います。PICマイコン側の電源をオンにしてから、設定の中の「Bluetooth」をタップすると図3-5のような画面が開き、「使用可能なデバイス」欄に「FireFly-xxxx」(xxxxはMACアドレスの下位4桁でモジュールに印刷されている)があるはずです。

 これが見つかればタップしてペアリングを実行します。図3-5のダイアログが表示されますから「ペア設定する」をタップすればペアリングを開始します。ペアリングが正常に完了すれば接続準備ができた状態です。

 次にタブレット側で通信ソフトの「BT Term」を起動します。起動すると図3-6の画面が開きますから、右上にある接続のアイコンをタップしてペアリングしたFireFly-xxxxを指定して接続します。正常に接続できればBluetoothモジュールの緑LEDが点滅状態から連続点灯に変わります。そして画面の一番下に正常接続したメッセージが表示されます。

 接続完了によりBT Termの画面最下段で送信データを入力できるようになりますから、ここにAとかNとかを入力して「送信」ボタンをクリックすれば送信を実行します。

 そしてPICマイコン側が正常に動作していれば折り返しの文字列を受信し表示します。

 この動作テストのタブレット側の表示例が図3-6となります。青字がタブレットから送信した文字で、赤字が受信した文字、つまりPICマイコン側から送信した文字になります。

 このように期待通りの文字が表示されれば、BluetoothとUSARTの送受信動作が確認できたことになります。

3-4 DDS ICの動作テスト

 次にDDS ICの正弦波出力を制御する動作の確認を行うプログラム「FreqAnalizer03」を製作します。

 DDS ICとPICマイコンとのインターフェースは3線式シリアルインターフェースとなっていて、図2-1、図2-3のタイムチャートに示したように16ビット単位で3ワードを続けて送信するようになっています。

 PICでこのシリアルインターフェースを使うには、16ビットのSPI通信で可能ですが、8ビットのPICマイコンではできませんので、プログラムI/Oでシリアル通信を実現することになります。つまり汎用入出力ピンのHigh、Lowをプログラムで制御してクロックとデータを生成することになります。クロック速度は遅い分には何も問題ありませんから気にする必要がありません。

 DDS ICの出力周波数は28ビットの設定値で決定しますが、その周波数Fは次式で決まります。使用した発振器が2の26乗Hz(67.108864MHz)ですので、

  F = (設定値)×(226Hz÷228) = (設定値)×1/4Hz

 つまり、実際の周波数は1/4Hzステップで設定することになります。したがって最低周波数は1/4Hzで、最高周波数は約16MHzということになります。

 しかし正弦波という形状をできるだけ歪が少なくなるように最低100分解能とすると、最高周波数は67.1MHz÷100 = 670kHz ということになり670kHzまではきれいな正弦波にできそうだということになります。

 逆算で周波数(F)から設定値を求めるときには次式となります。単位はHzです。

   (設定値) = F ÷ 1/4 = F × 4 

 これでDDS ICのテストプログラムを作成しますが、簡単にするため図3-7のようなフローのプログラムとします。タブレットから周波数データをBluetooth経由で送信し、出力するというプログラムです。

 タブレット側はやはり既存の「BT Term」アプリを使い、周波数を設定するための送信データは「1000#」や[2500#]のように最後を#で表すことにし周波数はHz単位で自由に設定できるようにします。

 DDSに設定値を送信する関数SetupDDS( )とSerialOut( )は最終的にもそのまま使えるよう独立の関数として作成します。SerialOut( )関数では図2-2のタイムチャート通りにFSYNC、SDAT、SCLKをプログラムでHigh、Lowを制御することで出力しています。

 このテストプログラムの詳細がリスト3-3とリスト3-4となります。

 リスト3-3がメイン関数部で、初期設定のあと、USARTつまりBluetoothからの数字データを受信して周波数に変換してからDDSに送信することを繰り返しています。データの終わりを「#」文字で判定していますから、送信する場合は例えば「1000#」と送信すれば1kHzを設定することになります。リスト3-4のSerialOut( )関数がDDSにデータを送信するためのシリアル通信を実現する関数で、3ピンの信号をプログラムでHighとLowを制御して実現しています。実際に動作させているときのタブレット側の例が図3-7となります。ここでも「BT Term」というフリーソフトを使っています。

3-5 レベル測定のテスト

 最後に残ったのがログアンプの出力のアナログ信号の計測です。このテストではDDSの出力を直接レベル測定の入力に接続し、自分自身の正弦波の出力そのもののレベルを1秒間隔で測定し、電圧に変換してUSARTで送信する方法とします。

 タブレット側はやはり「BT Term」を使います。

 これで、1秒間隔でタブレットの「BT Term」の画面にに電圧値として表示されることになります。

 電圧測定は単純に12ビットのA/Dコンバータで行います。A/Dコンバータの測定範囲を0ボルトから4.096ボルトの範囲とします。このため内蔵の定電圧リファレンスの4.096ボルトを使います。

 このテストプログラムの詳細がリスト3-5となります。USARTの初期設定後DDSには固定で1kHzの周波数が出力されるよう設定しています。

 この初期設定部に定電圧リファレンスのFVRとA/Dコンバータが追加されています。A/Dコンバータの設定では、符号なし整数形式の出力で右詰めの形式でデータが得られるようにしています。

 メインループではアナログピンのAN12の入力後、バイナリから電圧に変換し、さらに電圧値を文字列に変換して送信するためftostring( )という関数を使っています。

 この関数では整数部と小数部の桁数を指定すると、浮動小数の値を指定された長さの文字列に変換して指定バッファ位置に格納します。

 このリスト以外にUSART送受信関数などいくつかの関数がありますが、これまでのテストプログラムと同じですので省略しています。

 テスト中のタブレットの画面例が図3-9となります。正弦波出力のレベル調整用可変抵抗を回すと電圧値が変われば正常に動作しています。

3-6 最終形態のアプリケーションプログラムの製作

 各部のテストがすべて完了しましたから、これらで製作した関数を使っていよいよ最終形態のアプリケーションを製作します。テストとは異なりBluetoothの受信をUSARTの割り込みで行うことにすると、PICマイコンのファームウェアの全体概略フローは図3-10のようになります。

 初期設定でDDSとUSARTの初期設定をしてからBluetoothの送受信を可能として受信待ちとします。受信があるとUSARTの割り込み処理が動作し、ここで64バイト受信するまで繰り返されます。64バイト受信完了で受信フラグがオンにされますから、ここでメイン関数内のコマンドの解析処理が始まります。

 開始コマンド(Tコマンド)の場合にはOK応答を返します。周波数設定コマンド(Nコマンド)の場合にはDDSを設定してその周波数を出力し、一定時間後に被測定器からの出力レベルを測定して応答として送信します。動作としてはこれだけになります。これまでの部分ごとに動作確認した関数を使って、本来のプログラム全体を完成させます。


 まずメイン関数の初期化部がリスト3-6となります。これまでのテストプログラムと異なるのは、変数定義部分で送受信バッファを64バイト固定長とするためのバッファを用意したこと、周波数設定の変数をバイト長とlong長の両方で扱えるようにunion指定としたこと、初期化部ではUSARTの受信を割り込みにしたことだけです。

 このようにテストを順番にすれば、テスト時に製作したものがほとんどそのまま使えるようになります。


 次がメインループ部と受信データ処理関数部の詳細でリスト3-7となります。

 メインループでは直ぐステートを2にして、64バイトのデータ受信が完了してFlagがセットされるのを待ちます。

 Flagがセットされたら先頭の「S」文字だけ確認し応答バッファに「M」をセットした後はProcess()関数を呼んで受信処理を実行します。

 Process()関数では、次の文字がTかNかで分岐しTの場合はOK応答を返送します。

 Nの場合は受信した周波数データをlong型の値に変換します。ここでunionを使っています。

 周波数が前回と同じであれば何もせず、異なっている場合のみDDSに設定コマンドを出力します。

 その後50msecだけ待って被測定器側の出力が安定してからレベル計測を実行します。

 このとき200Hz以下の周波数の場合は、250回計測して平均化します。これは計測するタイミングで正弦波の途中のレベルになってしまうので長時間の平均をとることで正確なレベルとなるようにしています。

 200Hz以上の場合は40回の平均化として計測時間の短縮をしています。

 計測データは12ビットバイナリ値を2バイトに分けて送信しています。


 最後がUSARTの受信割り込み処理関数の詳細でリスト3-8となります。

 受信割り込みで呼び出され、割り込みフラグをクリアして受信エラーの確認と処理をしたあと、正常受信であれば受信バッファに格納します。これを64バイト受信完了するまで繰り返し、64バイト受信完了で受信フラグ(Flag)をセットしてメイン関数に通知します。

 これに続くサブ関数部はこれまでのテストで使ったものと同じですので説明は省略します。

 以上でファームウェアも完成です。残りはタブレット側のアプリケーションのみです。

著者略歴:後閑哲也
1947年 愛知県名古屋市で生まれる。
1971年 東北大学工学部応用物理学科卒業。大手通信機器メーカに勤務
2003年 有限会社マイクロチップ・デザインラボ設立
計測制御システムの開発コンサルタント
2012年 神奈川工科大学 客員教授

関連記事

ページ上部へ戻る