H8-3069ネット対応マイコンにMESを入れる > 基本編12.電圧を取り込む(A/D変換)

12.電圧を取り込む(A/D変換)

A/D変換しよう

このサイトの目的の一つである温度表示。やっとここまで来ました。温度を取り込む前に、まずは電圧を取り込みます。
回路は下のようにしました。とりあえずこんだけ抵抗入れとけば過電流にはならないはず・・。(初心者自信ない)

最大電流が流れるのは可変抵抗の値が小さいときだから(0Ωとすると)、その時のRは
R=10kΩ

10kΩ。

VとRの関係から、

I=V/R
=5V/10kΩ
=0.0005A
=0.5mA

0.5mAだったら、AN0(アナログ変換ピン0チャンネル)に突っ込んでも大丈夫だろうと判断しました。I/Oポートの出力特性が2mAと書いてあったため。
この辺りは自信がないので、皆さんは他の優秀な方のサイトで研究してください。
めんどりはこの方法で行って、基板は無事でした(笑)。

回路(手抜き)

ブレッドボード上

下の写真のように接続します。赤いクリップは+5V(CN2の2番ピン)、黒いクリップはGND(CN2の1番ピン)をはさんでいます(水色○の部分)。

CN2の1番ピン5Vと2番ピンGND

さらに下の写真で、白いクリップはAN0のピン(アナログ変換0チャンネル)に接続します(水色○の部分)。
それから、JP2とJP3はそれぞれジャンパーしておきます(赤色○の部分)。

ジャンパーJP2とJP3

プログラム

プログラムはやまねこさんのを参考にして作りました。

/*電圧を取り込む(A/D変換)*/ #include <h8/reg3067.h> #include <mes2.h> #define VREF 5 int main(void){ unsigned int data; volatile int r; float v; while(1){ data = 0; r = ADCSR; //読み込んでエンドフラグを0にする sleep(10); ADCSR = 0x20; //0chで変換スタート sleep(10); while(!(ADCSR | 0x80)){;} //最上位ビットに1が立ったら変換終了 sleep(10); data = ADDRAH << 2; //上位8ビット data |= ADDRAL >> 6; //下位2ビット v = (float)data * VREF / 1024; //電圧になおす printf("%d\r", data); printf("%d.%01d[V]\r",(int)v, (int)(v * 10) % 10); sleep(1000); } }//main

ここにプログラムをおきます。拡張子をtxtからcに変換してお使いください。

いたるところにsleep()が入っているのは、昔、AD変換がうまくいかなかったときに入れた名残です。ちゃんと変換できさえすれば不要です。
ポイントはADCSRレジスタのそれぞれのビットの意味を知ることです。めんどりは全く分からなかったので、ルネサステクノロジのサイトからH83069Fマイコンのハードウェアマニュアルをダウンロードし、かじりました。

ちなみに、文系出身のめんどりなので、最初はまるで何を言っているのかマニュアルの読み方がさっぱり分からなかったです。職業訓練校の先生に教えてもらって、やっとなんとなく見方が分かりました。

それから、電圧の小数点第一位までの表示は、C言語の教科書のprintfの辺りを読めばなんとかなります。

まず、可変抵抗の値を調節して、AN0に0.4Vが掛かるように調整しておきます。ハイパーターミナル上も同じになればOK。電圧の上に表示されている、84や85等の数値は生値。0から1023のうちの84もしくは85ですよ、という意味です。

ハイパーターミナル上0.4V

マルチメータも0.4V

あとは、ぐりぐりと可変抵抗を回して、ハイパーターミナル上の表示が一緒に変化することを確認します。

次は13.温度センサLM35DZをつなげる(A/D変換)です。>>