USB接続低周波発振器(ソフトウェア)


【ソフトウェア全体構成】

この低周波発振器のソフトウェア構成は下図のようになっています。
まずPIC側のプログラムはマイクロチップ社のUSB Frameworkの中のCDCクラス
を使っています。
このCDCクラスの大部分は元のままで、main.cとio_cfg.hを新規作成します。
main.cの中にアプリ部分を記述してしまいましたのでuser.cは削除しています。

PC側のプログラムは、COMポートを相手にした形になりますので、VB.netや
VC++.netでWindows APIを使ってCOMポートとの通信を行いながらアプリ部を
作成します。





【USBフレームワーク変更内容】

CDCクラスライブラリに含まれるUSBフレームワークを使ってユーザーアプリを作成
する場合、変更が必要になるファイルは下記となります。

(1) io_cfg.hの変更
  作成したポートの使い方に合わせてI/Oピンの指定をします。USB用に特別に
  使うI/Oピンはありませんので、ユーザー側のI/O指定だけ考えれば問題あり
  ません。

(2) main.cの作成
  この中にユーザーアプリケーションを記述しますから、これは基本的に新規作成と
  なります。USB用として唯一必要になる記述は、USBのイベントのポーリングをする
  記述部分で、これは、CDCクラスでの記述をそのまま使えます。

(3) user.cの作成
  ユーザーアプリケーションをmain.c自身の中に記述するか、このuser.cとして
  独立させるかの差だけで、記述する内容は同じです。今回はmainの中で記述
  してしまいましたのでuser.cはありません。

(4) 液晶表示ライブラリの追加(lcd_lib.cとlcd_lib.h)
  液晶表示器を使うためのライブラリです。これまで他のPICで使ったものを少し修正
  して使っています。

(5) その他
  細かい変更で必要になるのは、下記の2個所です。

 @ USB電源チェック (usbcfg.h)
   セルフパワーか、USBが接続されたかのチェックをI/Oピンで行うかどうかの設定です。
   下記2行の記述部分で、電源チェックをポートで行わない場合にはコメントアウトします。

    //#define USE_SELF_POWER_SENSE_IO     //セルフパワーの電源オン
    //#define USE_USB_BUS_SENSE_IO        //バスパワーの電源オン
   
 A IDの変更(usbdsc.c)
   ベンダーIDとプロダクトIDを変更する場合には、デバイスデスクリプタを変更します。
   usbdsc.cファイルの下記の部分が該当個所です。




   このIDを変更した場合には、CDCクラスに同梱されている、PC用のUSBドライバ用
   INFファイルも変更する必要があります。
   そうしないとこのIDが認識されないことになります。


【PICメイン部詳細】

PICのアプリをmain.c内で記述してしまいました。このmain部のプログラムの流れは
簡単で、最初に初期化を実行したあと、メインループに入り、USBのイベントポーリング
をしたあと、受信の有無をチェックしています。受信データがある場合にはその内容に
従って処理を行います。
処理が済んだら、次にロータリーエンコーダの入力の有無を判定し、入力があれば
回転方向を判定して周波数をアップダウンさせます。
これで一巡の処理を完了しUSBのイベントポーリングに戻ります。
この一巡の周期はできるだけ高速に行う必要があります。特に、USB接続時の最初の
プラグ&プレイ処理の間は、他の処理は何も入れないで即応答するようにした方が
安定に接続を完了できます。

PCからのコマンドデータのフォーマットは最初の1文字をコマンドとしていて下記の
ようになっています。この1文字をswitch文で判定して各処理に分岐しています。

コマンド 機能内容 備 考
周波数の現在設定値を返送 返送値は10進数6桁
1〜9 周波数の増減
 1:+1    2:−1
 3:+10    4:−10
 5:+100  6:−100
 7:+1k   8:−1k
 9:1000にセット
今回未使用
PC側から周波数設定
出力正弦波
設定値は10進数6桁
PC側から周波数設定
出力三角波
設定値は10進数6桁



【PC側ソフトウェア概要】

パソコン側の制御用ソフトウェアは、簡単な構成としてテストしました。
これからいろいろな機能を追加して測定器として構成していく予定です。
テスト用のプログラムはVisual Basic.Netで製作しました。その基本のフォームは
下図のようになっています。

USBデバイスを接続したときのCOMポートを選択すれば自動的に接続するように
しました。
VB.NetにはMSCommのようなActiveXは無いので、WindowsAPIを使って
COMポートを制御しています。

出力周波数をアップダウンのボタンで設定してから、正弦波出力ボタンを押せば
デバイス側で正弦波を出力し、三角波出力ボタンを押せば、三角波を出力します。
現在値入力ボタンを押すと、デバイス側の現在の出力周波数を読み込んで表示
します。これを設定変更して再度出力することも可能です。

アップダウンは2桁毎に用意しましたが、どのボタンでも上位桁の桁上げもします。





【PC側ソフトウェア詳細】

COMポートの制御にWindowsAPIを使う必要がありますので、APIの宣言用に独立
にモジュールを追加します。
このモジュールの定義はお決まりのパターンですから、そのままコピーして使えます。

これで有効になる関数は下記の7個の関数となります。
関数名 機能内容
CreateFile COMポートをファイルとしてオープンする
デバイスハンドル値を返す
CloseHandle 指定デバイスハンドルのCOMポートを閉じる
SetCommState COMポートの通信条件を設定する
DCB構造体を使う
WriteFile COMポートの送信バッファに書き込む
ReadFile COMポートの受信バッファからデータを読み込む
SetCommTimeouts 通信のタイムアウト時間を設定する
GetCommState COMポートの通信条件を取得する
DCB構造体を読み込む


 ★COMポート用WindowsAPIのモジュール(Module1.vb)
   (VisualBasic.net用です)

 ★例題のAppilicationプログラム(Form1.vb)
   (VisualBasic.net用です)




  トップページへ