PIC16F88 による シリアル接続型PIC-ADC
PIC16F88を用いたシリアル接続型のAD変換プログラムと回路図です。PCに接続出来ますので、そのままPCでデータ処理が行えます。(写真は動作確認時のもの)
仕様
AD変換回数 | 1000sps(1msに1回) |
---|---|
AD変換解像度 | 10bit |
AD変換誤差 | 1bit |
シリアル通信速度 | RS-232C 38400bps |
シリアル通信オプション | パリティなし、フロー制御なし |
電源電圧 | 3.3~5V程度 |
PIC16F88用ですが、USARTとADコンバータの乗っているPICならば簡単に移植できます。きちんとレベルコンバータIC(MAX232C)を通してますので、いわゆるUSBシリアルでも動作します。
変換レートの1000spsは内部タイマで割り込みをかけているので、(クロックと同じ程度)正確な間隔で計測されます。外部に8MHz水晶発振器などをつければ、正確に1kHzの間隔でサンプリングできます。
回路図とファームウェア
- ADC_PIC16F88.lzh …… ファームウェア一式
- ComADC.lzh …… 受信クラスライブラリ(C++)
シンプルな回路構成です。電源は3.3~5Vで動作すると思います。もっと違う電圧でも動くでしょう。簡便のためPICの内部発振を使っていますが、より正確な計測が必要な場合は外部に水晶をつけてください。
PICの電源に大容量低インピーダンスコンデンサをつけていますが、たまたま手元にあっただけでここまで大きい必要はありません。100uF程度で十分でしょう。AD変換の精度のことを考えると、低インピーダンス品は使いたいところですが。
使い方
RS-232C経由でコマンドを送信することで制御を行います。コマンドは文字 1byte です。
送信文字 | 機能 |
---|---|
R | デバイスをリセットします。AD変換を停止させます。 |
S | AD変換を開始します。 |
V | PICファームウェアのバージョン情報を表示します。 |
AD変換中に送られるデータは2byteで1つのデータとなっています。並びはビッグエンディアンです。例えば、受信データ配列をchar buf[size]、電源電圧を5Vとすれば、次のようにAD変換電圧を取得できます。
for(int i=0; i<size; i+=2) { float volt = ((buf[i]<<8) + buf[i+1])*5/(float)1024; : :(データ処理) }
ライセンス
修正BSDライセンスとします。質問とか相談とか、開発とかありましたらコメント欄にどうぞ。