前回はA-D変換の基礎知識からH8/36064マイコンに内蔵されているA-D変換モジュールの構造やレジスタの機能について解説しました.今回はA -D変換モジュール機能を使って電圧を測定する簡単なC言語プログラムを作ってみましょう.電圧を測定する場合には,ちょっとした外付け回路を組みますが,ここでは
ブレッドボードを使ってみたいと思います.ブレッドボードは部品のリード線を穴に挿入することで着脱可能な配線ができます.はんだ付けが不要
ですので,初心者でも安心して回路を組み立てて実験することができると思います.
最後に,A-D変換とタイマ・モジュール機能を応用して,光センサに入射する光の強さによって圧電ブザーの音程が変わるプログラムも紹介したいと思います.
■これだけは注意!A-D変換入力端子の電圧範囲
A-D変換モジュール機能の動作を確認する前に,重要な注意事項があります.A-D変換入力端子の絶対最大定格は「-0.3~AVcc+0.3」で,アナログ電源AVccの電圧は+3.3Vです.したがって,
A-D変換入力端子には絶対に負電圧や+3.3V以上の電圧を印加してはいけません.これだけは
必ず守ってください.万が一,印加した場合はH8マイコンが永久破壊をしてしまいます.
H8マイコン・ボードの外付け電源端子には単三乾電池1.5V×4本(+6V)で駆動したり,USBバスパワー(+5V)で駆動したりしていますが,H8
マイコンには電源レギュレータICによって,+3.3Vに定電圧化されています.決して+5Vではありません.くれぐれも注意してください.
■ブレッドボードを使ってA-D変換モジュール機能の動作確認をしてみよう!
写真1にA-D変換モジュール機能の動作確認のようすを示します.ちょっとした回路の動作確認をするには,写真1に示すようなブレッドボードが大変便利です.
<写真1>A-D変換モジュール機能の動作確認のようす
●ブレッドボード上に回路を組み立てる
写真2にブレッドボード上の回路の外観を示します.ビニール線や,部品のリード線をブレッドボードの穴に挿入して結線します.
はんだ付けが不要で,部品の抜き差しで回路変更が容易なためとても重宝します.
<写真2>測定用ボード(ブレッドボード)の外観
●A-D変換モジュール機能の動作確認回路
図1にA-D変換モジュール機能の動作確認を行った回路を示します.
AN1コネクタの
+3.3V端子(1番ピン),PB0端子(4番ピン),GND端子(3番ピン)を使用します.PB0端子には+3.3V端子とGND端子間にそれぞれ
ショットキー・バリア・ダイオードD1とD2を接続しています.このダイオードは順方向電圧が0.3V以下であれば過電圧入力に対して端子が保護されます.VRはPB0端子に入力する電圧調整用の可変抵抗です.ここでは10kΩの半固定抵抗器を使いました.
<図1>A-D変換モジュール機能の動作確認回路の構成
■A-D変換モジュールの各種レジスタの設定
それでは,前回に登場したA-D変換モジュールの各種レジスタについて思い出してみましょう.表1に各種レジスタをまとめてみました.なるべく初期設定
で動作する初心者向けのC言語プログラムの作成をしていきます.
A-D変換動作は単一モードでアナログ入力チャネルはデフォルトのAN0を選択します.つ
まりA-D変換結果が格納されるレジスタは
ADDRAです.ここで設定するレジスタはADCSR
で,A-D変換の開始を制御する
ADSTビットと,A-D変換の終了を示す
ADFフラグ・ビットになります.
<表1>各種レジスタと設定値
(注1)赤字のレジスタおよびビットを設定する.それ以外は初期値のままで設定は省略可.
■A-D変換の動作確認用のプログラムを書いてみよう!
A-D変換モジュール機能を使用してAN0端子に入力される電圧を測定します.A-D変換の動作確認用のプログラムを作成するということで,ワークスペース名には「AD_test_ver1」という名前をつけたいと思います.リスト1にC言語プログラムのソース・リストを示します.
<リスト1>A-D変換の動作確認用のプログラム(AD_test_ver1.c)のソース・リスト
#include "iodefine.h" //(1) I/Oレジスタ定義ファイル
void main(void)
{ //(2) データを格納する変数
volatile
unsigned int *data = (unsigned int *)0xfa00;
while(1){ //(3) 単一モードの繰り返し
AD.ADCSR.BIT.ADST = 1; //(4) A-D変換開始
while(AD.ADCSR.BIT.ADF == 0); //(5) A-D変換の終了を待つ
*data =
AD.ADDRA; //(6) A-D変換データの格納
*data =
*data >> 6; //(7) 6ビット右へシフト
AD.ADCSR.BIT.ADF = 0; //(8) フラグをクリア
}
}
●プログラムの概要
リスト1に示したコメント(1)~(8)の順にプログラムの流れを説明していきます.
(1) I/Oレジスタ定義ファイル・・・main関数の前にI/Oレジスタ定義ファイルを取り込みます.これでA-D変換モジュールに関するレジスタやビット名が定義され,アドレスを記述する作業などを省略することができます.I/Oレジスタ定義ファイルについては基礎編の第21回に解説があります.
(2) データを格納する変数・・・RAM領域にA-D変換データを格納するポインタ変数を定義します.ここではA-Dデータ・レジスタ(ADDRA)の値
を,16ビットのデータとして受け取るためunsigned int型の変数とし,未使用のRAM領域(アドレスH'FA00)に格納します.
(3) 単一モードの繰り返し・・・単一A-D変換をwhile文で繰り返し実行することで,A-D変換を連続的にすることができます.
(4) A-D変換開始・・・ADSTビットはA-D変換の開始を制御するビットです. ADSTビットを'1'にセットするとA-D 変換を開始します.
(5) A-D変換の終了を待つ・・・ADFビットはA-D変換が終了すると'1'にセットされるフラグ・ビットです.while文を使ってADFビットが'1'になるまで待ちます.
(6) A-D変換データの格納・・・A-Dデータレジスタ(ADDRA)の値を,まず16ビットのデータとして受け取ってRAM領域(アドレスH'FA00)に格納します.
(7) 6ビット右へシフト・・・ここで「
シフト演算子」と呼ばれるビット演算子を使ってデータを操作します.<< は左シフト,>> は右シフトさせるビット演算子です.この演算子は,たとえば下記のように使います.
a = a << 1; // 1 ビット左へシフト
a = a >> 2; // 2 ビット右へシフト
10 ビットの
A-D変換データはA-Dデータレジスタ(ADDRA)のビット15からビット6に格納されます.そのため,ここでは右シフトさせるビット演算子 >> を使って図2のように
6ビット右にシフトさせています.
(8) フラグをクリア・・・ADFビットは(5)でA-D変換が終了して'1'にセットされています.次のA-D変換を実行するために'0'にクリアして戻しておきましょう.
<図2>右に6ビットシフトさせたときのビットのようす
■モニタを使ってA-D変換モジュール機能の動作確認をしてみよう!
HEWでC言語プログラムを作成してビルドしたら,モニタプログラム専用通信ソフト[Hterm]を起動してロードモジュールファイル(AD_test_ver1.abs)をダウンロードします.
●ソース・リストを表示してブレークポイントを設定する
それではモニタを使ってA-D変換モジュール機能の動作確認をしてみましょう.[表示]メニューから「AD_test_ver1.c」をクリックする
と,図3に示すようなソース・リストが表示されます.プログラムは単一モードでA-D変換を繰り返し実行するため,「(6)
A-D変換データの格納」の行にブレークポイントを設定しておくとよいでしょう.
<図3>Htermのソースウィンドウでブレークポイントを設定
●A-Dモジュール関連のレジスタを表示する
[表示]メニューから[Peripheral]を選択すると,周辺機能を選択するウィンドウ(図4)が開きます.ここで調べたい周辺機能を選択すると,
関連したレジスタのビット構成とその値が表示されます.ここでは「A/D」を選択して[OK]ボタンをクリックしてみましょう.
<図4>周辺機能を選択するウィンドウ
すると,図5に示すようなA-D変換モジュール機能に関するレジスタが表示されます.ここではADDRAレジスタの値に着目します.
<図5>Peripheralウィンドウに表示されたA-D変換モジュール機能の関連レジスタ
●メモリ内容を表示する
[表示]-[Memory]を選択するとメモリ情報を指定するウィンドウ(図6)が開きます.ここではA-D変換データが格納されるアドレス「H'FA00」を指定し,表示個数は「1個」,サイズは「ワード」を選択しておきます.
<図6>メモリ情報の指定
●プログラムを実行してA-D変換する
まずは,A-D入力端子をVCC(+3.3V)に接続します(H8マイコン・ボードAN1コネクタの1ピンと4ピンからの配線を接続します).それでは
HtermのコンソールからGコマンドを実行してみましょう.すると,指定したブレークポイントで一時停止します.このとき図7に示すように,ADCSR
レジスタの7ビット目であるADFビットが'1'に変化していると思います.
つまり,この時点でA-D変換が終了していることを示しています.さて,ここ
でPeripheralウィンドウに表示されたADDRAレジスタ値に着目してみましょう.値はFFC0になっています.
<図7>プログラム実行後のPeripheralウィンドウに表示されたA-D変換モジュール機能の関連レジスタ
●ステップ実行(Pstep)してRAMに格納されたデータを確かめる
それでは[F11]キーを押して順次Pstepコマンドを実行していきましょう.ここでは図8に示すように,Memoryウィンドウに表示されたアドレ
スH'FA00の値の変化に着目します.1回目のPstepコマンドの実行で値がFFC0になります.このときADDRAレジスタのA-D変換データが格納されたことがわかります.さらにPstepコマンドを実行すると値が03FFに変化します.これは6ビット右にシフトしたためです.
<図8>ステップ実行(Pstep)して格納されたデータをMemoryウィンドウで確認する
データ採取の要領がわかったところで,外付け回路の可変抵抗器VRを回してA-D入力端子の電圧を変化させてみましょう.表2にA-D変換結果をまとめてみました.実験の値と理論値を比べてみると,概ね一致していることがわかります.理論値は次式より求まります.
理論値(10進表示) = 1023 × Vin[V]/3.3[V]
<表2>A-D変換データの理論値と実測値

(注2)( )内の数値は10進表示
■A-D変換を使って光センサで圧電ブザーの音程を変えてみよう!
うまく電圧が計測できたでしょうか.さて,前々回ではタイマ・モジュール機能を使って圧電ブザーを鳴らしてみました.そこで光センサの出力電圧をA-D変換し,そのデータを用いてタイマVのTCORAレジスタの値を変更してみましょう.光センサに入射する光の強さによって圧電ブザーの音程が変わることがわかります.光を強くすると光センサの出力電圧が下がり,TCORAレジスタの値が小さくなって音程が上がります.逆に光を当てないと光センサの出力電圧
が上がり,TCORAレジスタの値が大きくなって音程が下がります.リスト2にC言語プログラムのソース・リストを示します.
TCORAレジスタは8ビットですので256以上の数値は使用できません.A-D変換データは10ビットです.そこで,
A-D変換データの上位8ビット分をTCORAレジスタへ代入することにします.ここでは右シフトさせるビット演算子 >>
を使ってADDRAレジスタの値を
8ビット右にシフトさせています.
<リスト2>光センサで圧電ブザーの音程を変えるプログラム(AD_test_ver2.c)のソース・リスト
#include "iodefine.h"
void main(void)
{
unsigned int
data;
TV.TCRV0.BIT.CCLR
= 1; // コンペアマッチA でTCNTVクリア
TV.TCSRV.BIT.OS
= 3; // コンペアマッチAでトグル出力
TV.TCRV1.BIT.ICKS
= 1; // TCNTV入力クロックの設定
TV.TCRV0.BIT.CKS
= 3; // 内部クロックφ/128で動作開始
while(1){ // 単一モードの繰り返し
AD.ADCSR.BIT.ADST = 1; // A-D変換開始
while(AD.ADCSR.BIT.ADF == 0); // A-D変換の終了を待つ
data = AD.ADDRA; // A-D変換データの格納
data =
data >> 8; // 8ビット右へシフト
TV.TCORA =
(unsigned char)data; // 周期(音程)の設定
AD.ADCSR.BIT.ADF = 0; // フラグをクリア
}
}
A-D変換モジュール機能を使ってみた感想はいかがでしたか.次回は,H8マイコンのタイマZモジュール機能ついて解説します.出力パルス幅を可変することでLEDの明るさを可変する調光にも挑戦します.お楽しみに!
< Yoshihito Shimada >