PUPPYに搭載されているジャイロセンサ、電流センサの出力はアナログ量です。アナログ量をマイコンが処理できるディジタル量にするのがA/D変換です。PUPPY対応ベースボードのH8/3687Fを例にとると、A/D変換を行えるアナログポートはAN0〜AN7の合計8本あります。今回の演習ではAN1に接続されているジャイロセンサ(図1)のA/D変換を行います。
図1
ジャイロセンサは角速度を計測するセンサで、図2のように角速度の変化に比例したアナログ電圧を出力します。
図2
今回はシリアル通信の演習で使用したsci_sampleのプログラムを利用します。sci_sampleフォルダの中のmain.cを開いて下さい。main.cをリスト1のように書き直します。
リスト1
リスト1はAN1に接続されているジャイロセンサの出力をA/D変換しパソコンにシリアル転送するプログラムです。
詳しくはハードウェアマニュアルのA/D変換の章を見ていただくとして、A/Dコントロール/ステータスレジスタ(ADCSR)でA/D変換の開始や変換速度、変換チャネル等を設定し、ADDRA(A/DデータレジスタA)〜ADDRD(A/DデータレジスタD)に変換結果が格納されます。
12行目: ADCSRの設定 今回の例では表1のように設定します。
ADCSR | |||
ビット名 | 簡単な説明 | 設定値 | |
bit7 | ADF | A/D変換が終了したときにセットされるフラグ | 0 |
bit6 | ADIE | A/D変換終了後、割り込みを発生させたい場合は1にする | 0 |
bit5 | ADST | A/D変換開始時に1にセットする | 1 |
bit4 | SCAN | 複数のチャネルを連続してA/D変換したい場合は1にセットする | 0 |
bit3 | CKS | A/D変換時間を早くしたいときは1にセットする | 1 |
bit2 | CH2 | CH2・CH1・CH0でA/D変換を実施するチャネルを選択する | 0 |
bit1 | CH1 | 0 | |
bit0 | CH0 | 1 |
表1
15行目: A/D変換終了待ち 12行目の設定でA/D変換が開始され、A/D変換が終了するとADCSRのbit7のADFに1がセットされるのでADFが0の間は待ちます。
18行目: A/D変換結果はADDRA〜ADDRCに表2のように格納されるので6ビット右シフトします。
ADDRx | |||||||||||||||
BIT15 | BIT14 | BIT13 | BIT12 | BIT11 | BIT10 | BIT9 | BIT8 | BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 |
A/D変換値 10ビット | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||
↓ | 右シフト→ | ||||||||||||||
ADDRx | |||||||||||||||
BIT15 | BIT14 | BIT13 | BIT12 | BIT11 | BIT10 | BIT9 | BIT8 | BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 |
0 | 0 | 0 | 0 | 0 | 0 | A/D変換値 10ビット |
表2
このプログラムを実行するとハイパーターミナル上で図3のような表示になります。
図3
jジャイロセンサは角速度に比例した電圧を出力します。PUPPYを動かさないでいると数値は300前後、前に倒すと値が減り、後に倒すと値が増えることが確認できると思います。このマイコンのA/D変換器の分解能は10ビットなので、GND(0V)〜VCC(5V)を1024(2の10乗)分割した数値になりますので、静止状態の300という値は
300 × 5 / 1024 = 約1.46V
となります。このジャイロセンサの静止時出力は1.35Vなので概ね正しくA/D変換が行われているようです。
PUPPYにはマイコン用の電源(単三乾電池2本)とモータ用の電源(単三乾電池2本)がそれぞれあります。それぞれAN4とAN5に接続されていてA/D変換で電池電圧をモニタできるようになっています。そこでこの2つの電圧をA/D変換しハイパーターミナルに表示するプログラムを作ってみましょう。