第18週 16F877でAD変換
先週、高速を走っていたら、いるわいるわ、ワゴンやバンに引っ越し荷物いっぱい詰め込んで、運転席と助手席に親子が並んで乗ってる車。
いよいよ君たち東京で学生生活だね。留年しないように、就職勝ち抜くようにと勉強しようとなんか思っちゃいけないよ、せっかくの学生生活なんだから。遊び倒して、人生の岐路でいつもハズレくじを引くような立派な真人間になってください。(^^;

いつも早稲田の所沢キャンパスの前を通りますが、先週まで空箱で走っていたバス、今週は新入生ですし詰めでした。まあ半月の辛抱だから我慢したまえ。そのうちすぐにガラガラになるからね。



16F877でAD変換

いろいろ準備体操に費やしてしまい、なかなか進みませんでしたが、いよいよA/D変換回路のプログラムに挑戦です。先週はうまいことモータが回って表示も出来たので、いよいよ新しい世界へ踏み出します。(んな気張るほどのことでもないか。)
A/D変換をやってみます。A/D入力電圧をLCDに表示ってのはどうでしょう。緻密なスケーリングは面倒そうなので「概ねこんな電圧に近いかな」程度の表示ってことで手を打ちます。



◎A0ポートにつないだトリマの電圧を表示することにします。
 電源の5Vを基準としてこれを1FFH(511)、まあ、だいたい5.00ってことに。(^^;
 500に調整するにはきっちり割り算をするか、あるいは基準電圧を回路で調整するかしないといけませんが、ここではパス。

◎16F877では10ビットでAD変換値を格納しますがBCD3桁で表示しようと思いますので9ビットのみ使用します。

◎格納データを2バイトに押し込んでこれをBCD変換、さらにキャラクタに変換してLCD表示

◎関連レジスタ
 
TRISA ポートAの入出力設定
ADCON0 bit7,6 ADCS1,0 A/D変換クロック 10でFocs/32
bit5-3 CHS2-0 チャンネル指定 000でchannel0
bit2 GO/DONE 変換開始指令 1で変換開始(ADON=1のとき)
bit0 ADON 使用開始(データ蓄積開始) 1で使用開始
ADCON1 bit7 ADFM 結果格納フォーマット選択 1で右詰
bit3-0 PCFG3-0 ポート設定 1110でAポートbit0のみアナログポート

 ADFMは結果格納レジスタADRESH,ADRESLの16ビット内でデータ10ビットを右詰めにするか左詰にするかの設定。

◎変換手順
  1.ADCON1でアナログポートと結果格納フォーマットを設定
  2.ADCON0のADCS1,0でA/D変換クロック設定
  3.CHS2-0でチャンネル選択、ADONでデータ蓄積
  4.タイミング待ち
  5.GO/DONEを1にして変換開始
  6.GO/DONEを読み変換完了0になるのを待つ
  7.ADRESH,ADRESLに格納された結果を読み出す
  8.9ビット抽出 まず左詰めデータの下位バイトを左シフトして最上位ビットをCフラグに
  9.上位バイトをCフラグごと左シフトしてCフラグを最下位ビットに取り込み改めてCフラグに最上位ビット
 10.クリアした上位バイトをCフラグ毎左シフトして最上位ビットを上位バイトに取り込む(上位バイトは1か0)
 11.2バイトBCD変換してキャラクタに変換すればLCD表示できる
 
 と、まあ、文字に書けばこんな感じです。


プログラムはこちら



まあまあ近い数値を表示してます。
計算となるとやはりアセンブラで自力更正はつらいところです。Cの出番ってところでしょうか。





■今週のなるほど
AD変換に関しては定石そのまんま。
10ビットをどう扱うかで一工夫いるくらいでしょうか。左詰にして8ビットで処理するのが簡単かもしれません。
9ビットでさえ0.01V精度ですからノイズがらみの回路上の処理が難しいみたいです。(けっこうふらついていました。)
まして10ビットとなるとちょこっと回路組んだ程度では精度いっぱいまで機能しないですね。(PIC側でのSLEEPなどのノイズ回避の工夫もあるらしいが、そもそも入力そのものが怪しいですから。)