2010年3月 2日

はてなブックマークに追加   はじめてのH8マイコン 応用編
<第16回>ライントレース・ロボットの光センサを2個に増やして動作を改善しよう!(プログラム作成と動作確認の巻)


 光センサ基板が完成し,いよいよライントレース・ロボットを動かすときがやってきました.プログラムを作成したら,ライントレース・ロボットを実際に動かしてみましょう.

センサを2個使用したライントレース・ロボットのプログラムを作成する
 Beauto Builder NEOを起動したら,早速プログラムを作成してみましょう.プログラム・エリアにアクション・ブロックを配置したあとで実行順序に従って矢印で接続します.それでは具体的にプログラムの作成手順について説明していきましょう.
 応用編の第12回でライントレース・ロボットの動作条件を次のように決定しました.
(A)左側の光センサがライン上(黒色領域)と検知した場合
   進行方向に対して左寄りに進ませる.
(B)右側の光センサがライン上(黒色領域)と検知した場合
   進行方向に対して右寄りに進ませる.
(C)両方の光センサがライン外(白色領域)と検知した場合
   進行方向に対して直進させる.

more "はじめてのH8マイコン 応用編
<第16回>ライントレース・ロボットの光センサを2個に増やして動作を改善しよう!(プログラム作成と動作確認の巻)" »

2010年2月26日

はてなブックマークに追加   はじめてのH8マイコン 応用編
<第15回>ライントレース・ロボットの光センサを2個に増やして動作を改善しよう!(調整の巻)


 光センサ基板が完成しました.まずはライントレース/ロボットの車体に光センサ基板を搭載してみましょう.今回は光センサ基板の搭載とセンサの調整方法について紹介します.

製作した光センサ基板を車体に取り付けよう
 すべての部品を取り付けて配線まで完了したら,光センサ基板をライントレース・ロボットに搭載して車体を完成させましょう.

L字金具を基板に取り付ける
 M3ネジを使ってL字金具を基板の表面側に取り付けます.ネジを取り付ける順番は,写真1に示すように左から,M3ネジ,平ワッシャ,L字金具と基板,平ワッシャ,スプリング・ワッシャ,ナットの順で締めて固定します.

more "はじめてのH8マイコン 応用編
<第15回>ライントレース・ロボットの光センサを2個に増やして動作を改善しよう!(調整の巻)" »

2010年2月16日

はてなブックマークに追加   はじめてのH8マイコン 応用編
<第14回>ライントレース・ロボットの光センサを2個に増やして動作を改善しよう!(部品取り付けの巻)


 前回は,基板の切断加工/穴あけまで完了しました.今回はその基板に部品をはんだ付けしていきます.まずは,はんだ付けをするための道具から準備をしましょう.

はんだゴテを準備しよう
 はんだゴテは,基板,部品の端子,リード線などの母材と,糸はんだを240~250℃の温度まで上げる役割をもっています.母材やはんだの温度上昇は,コテのワット数やコテ先の形状,また母材の大きさや形状によって異なってきます.
 写真1に見るように,一般的には母材が小さいものには熱容量の小さいコテを使い,大きい母材には熱容量の大きいコテを使います.
 また,はんだゴテのヒータには,大別して「ニクロム線ヒータ・タイプ」と「セラミック・ヒータ・タイプ」があります.電子工作での基板などのはんだ付けでは,15~30Wのセラミック・ヒータ・タイプのはんだゴテがお勧めです.セラミック・ヒータの場合,ニクロム線ヒータに比べて絶縁抵抗が高いので,静電気に弱いMOSトランジスタのはんだ付けも安心して使用できます.

more "はじめてのH8マイコン 応用編
<第14回>ライントレース・ロボットの光センサを2個に増やして動作を改善しよう!(部品取り付けの巻)" »

2010年2月 9日

はてなブックマークに追加   はじめてのH8マイコン 応用編
<第13回>ライントレース・ロボットの光センサを2個に増やして動作を改善しよう!(基板加工の巻)


 前回は光センサ増設によるライントレース・ロボットの動作の改善方法と光センサ基板の回路設計について解説しました.今回は光センサ基板の製作方法について解説します.まずは使用部品の収集からはじめていきましょう.比較的に入手しやすい部品を選定しているので,通販や秋葉原のお店でも入手できると思います.

more "はじめてのH8マイコン 応用編
<第13回>ライントレース・ロボットの光センサを2個に増やして動作を改善しよう!(基板加工の巻)" »

2010年2月 2日

はてなブックマークに追加   はじめてのH8マイコン 応用編
<第12回>ライントレース・ロボットの光センサを2個に増やして動作を改善しよう!(回路設計の巻)


 前回はライントレース・ロボットの動きに直進動作を組み入れたので,むだな動きが少なくなりましたね.しかし,カーブが連続する場所や急な曲がり角などではコースを大きく外れる場合があります.これはラインの境界線を1個の光センサで検出する方法に限界があるためです.
 それでは,光センサをもう一つ追加して2個にしてみましょう.今回は光センサ増設によるライントレース・ロボットの動作改善の方法について解説します.もう少しうまく走行できるように頑張りましょう.

more "はじめてのH8マイコン 応用編
<第12回>ライントレース・ロボットの光センサを2個に増やして動作を改善しよう!(回路設計の巻)" »

2010年1月 8日

はてなブックマークに追加   はじめてのH8マイコン 基礎編
<第30回>(最終回)スイッチを使ってLEDを制御してみよう!


 基礎編は今回で第30回目(最終回)になりました.今回はH8マイコン・ボードのプッシュ・スイッチを使ってLEDを点灯/消灯させてみます.
 これまでプログラムの作成はmain 関数のみでしたが,ここではポートの初期設定,スイッチ入力やLEDを点灯させる機能を関数として記述してみましょう.プログラムを関数化すると,プログラム全体が簡潔になってわかりやすくなり,また部品として再利用できるためプログラムを作成する効率が上がります.さらに,他人が作った関数プログラムも共有財産として使用できるようになります.

more "はじめてのH8マイコン 基礎編
<第30回>(最終回)スイッチを使ってLEDを制御してみよう!" »

2009年12月25日

はてなブックマークに追加   はじめてのH8マイコン 応用編
<第11回>ライントレース・ロボットのプログラムを改善しよう!


 前回は,ライントレース・ロボットの車体を調整したにもかかわらず,実際には大きく首を左右に振りながら走り,あまり安心して見ていられなかったと思います.今回はプログラムを変更してライントレース・ロボットの動作を改善する方法について解説します.もう少しうまく走行できるように頑張ってみましょう.

more "はじめてのH8マイコン 応用編
<第11回>ライントレース・ロボットのプログラムを改善しよう!" »

2009年11月19日

はてなブックマークに追加   はじめてのH8マイコン 基礎編
<第29回>タイマ機能を使ってLEDの明るさを自由に変えてみよう!…part2


 前回はPWMによるLEDの調光のしくみからH8/36064マイコンに内蔵されているタイマZモジュールの構造やレジスタの機能について解説しました.今回はタイマZモジュール機能を使ったLEDの明るさを変化させる簡単なC言語プログラムを作ってみましょう.H8初心者にとっては,実際にH8マイコンを使ってLEDの明るさを変化させてみることで,前回説明したモジュールを制御するレジスタなどの理解が深まると思います.

■タイマZによるPWMモードの動作
 タイマZによるPWMモードの動作例を図1に示します.LED2(橙) はFTIOB1端子に接続されています.端子の制御にはチャネル1用のタイマ・カウンタ(TCNT_1)を使用します.
(1) リセットした直後の最初のコンペアマッチが起こるまでのタイマ出力(FTIOB1端子出力)は'1'("H")です.TSTRレジスタのSTR1ビットを'1'に設定するとTCNT_1は0x0000からカウントアップを開始します.
(2) TCNT_1がGRB_1の設定値と一致(コンペアマッチB)のとき,FTIOB1端子出力が'0'("L")になります.
(3) TCNT_1がGRA_1の設定値と一致(コンペアマッチA)のとき,FTIOB1端子出力が'1'("H")になります.
(4) また,コンペアマッチAのときTCNT_1がクリアされ,再び0x0000からカウントアップを開始して(2)~(4)を繰り返します.図1に示すように,パルス幅WはGRB_1の設定値,パルス周期TはGRA_1の設定値で決まるPWM波形がFTIOB1端子から出力されます.

zu01.jpg
 <図1>タイマZによるPWMモードの動作例

more "はじめてのH8マイコン 基礎編
<第29回>タイマ機能を使ってLEDの明るさを自由に変えてみよう!…part2" »

2009年11月 5日

はてなブックマークに追加   はじめてのH8マイコン 基礎編
<第28回>タイマ機能を使ってLEDの明るさを自由に変えてみよう!…part1


 マイコンにはわりと正確な時間を刻んでいる時計のようなもの「タイマ・モジュール」があります.基礎編の第25回では,汎用的な8ビット・タイマである「タイマV」を使って圧電ブザーを鳴らしてみました.今回は本格的な16ビット・タイマである「タイマZ」を紹介します.そしてタイマZを使ってLEDの明るさを自由に変えられる調光にチャレンジしてみましょう.

■LEDの明るさを変える調光のしくみ
 基礎編の第9回で,モニタを使いながらLEDを点灯/消灯させる実験をしましたね.今回は38番ピン(P65/FTIOB1)に接続されているLED2(橙)の明るさを変化させてみましょう.図1に示すようにLEDのアノード側は+3.3Vの電源に接続され,カソード側は100Ωの抵抗を介してH8マイコンの入出力ポートに接続されています.このように接続すると,ポートに"L"('0')を出力するとLEDが点灯し,逆にポートを"H"('1')にするとLEDが消灯します.

p1.jpg
<写真1>LED2(橙)の点灯のようす
su1.jpg
<図1>LED2(橙)とH8マイコンとの接続

 ところで,H8マイコンのポートは"L"('0')と"H"('1')の二つの状態しか出力することができません.しかし,このL"('0')と"H"('1')の二つの状態をすばやく切り換えることで,人間の目にはLEDが連続して発光しているように見えるのです.
 つまり,図2に示すようにPWM(Pulse Width Modulation)と呼ばれる1周期に対するHighの時間比率(デューティ比)を変えた信号を使うことでLEDの明るさを変えることができます.LEDは"L"('0')出力で点灯するため,(a)のようにデューティ比を小さくすると点灯している割り合が大きくなり,LEDが明るく発光しているように見えます.逆に(b)のようにデューティ比を大きくすると消灯している割合が大きくなり,LEDが暗く発光しているように見えます.
zu2.jpg
<図2>PWM信号波形とLEDの点灯/消灯の関係

■H8/36064マイコンには5種類のタイマ・モジュールがある
 基礎編の第25回でも説明しましたが,表1に示すようにH8/36064マイコンには,タイマB1,タイマV,タイマZ,14ビットPWM,ウォッチ・ドッグ・タイマタイマの五つのタイマ・モジュールが内蔵されています.今回 LEDの調光には,本格的な16ビット・タイマである「タイマZ」を使います.

<表1>H8/36064マイコンのタイマ・モジュールの種類と特徴

hyo1.JPG 表1のタイマZの特徴として,「アウトプットコンペア」,「インプットキャプチャ」という機能があります.アウトプット・コンペアは,ある規則性をもった信号を出力してくれる機能です.一方,インプット・キャプチャはその反対の機能です.ある規則性をもつ信号の長さを計測してレジスタに格納するというものです.LEDの調光にはアウトプット・コンペアを使います.

■タイマZの内部構造
 タイマZの内部構成は図3のようになっています.FTIOA0~D0端子,FTIOA1~D1端子の合計8端子がタイマZの入出力端子です.LED2(橙)はFTIOB1端子に接続されています.
 カウンタの入力クロックは4種類の内部クロック(φ,φ/2,φ/4,φ/8)もしくは外部クロックから選択可能です.タイマZはチャネル0とチャネル1の2つのタイマをもって,それぞれ独立して動作させることができます.
zu3.jpg
<図3>タイマZの内部ブロック構造

 タイマZ関連のレジスタは大きく3分類され,
  • チャネル共通レジスタ:6種類
  • チャネル0用レジスタ:11種類
  • チャネル1用レジスタ:11種類
というように多くのレジスタがあります.

■チャネル共通の主なレジスタ
 チャネル共通のレジスタには,TSTR,TMDR,TPMR,TFCR,TOER,TOCRの6種類があります.ここではLEDの調光に必要なレジスタ(TSTR,TPMR,TOER)について紹介します.

●タイマ・スタート・レジスタ(TSTR)
 TSTRレジスタはタイマ・カウンタ(TCNT_0,TCNT_1)の動作/停止を制御します.TSTRレジスタのビット構成を図4に示します.STR1ビットはチャネル1用のタイマ・カウンタ(TCNT_1)を制御し,STR0ビットはチャネル0用のタイマ・カウンタ(TCNT_0)を制御します.LED2(橙)の制御にはチャネル1用のタイマ・カウンタ(TCNT_1)を使用します.

zu4.jpg
<図4>TSTRレジスタのビット構成

zu4.jpg

●タイマPWM モード・レジスタ(TPMR)
 TPMRレジスタは出力端子をPWM モードに設定します.TPMRレジスタのビット構成を図5に示します.LED2(橙)はFTIOB1端子に接続されているため,ここではPWMB1ビットでFTIOB1端子をPWM モードに設定します.
zu5.jpg
<図5>TPMRレジスタのビット構成

●タイマ・アウトプット・マスタ・イネーブル・レジスタ(TOER)
 TOERレジスタはタイマZの出力を許可/禁止します.TOERレジスタのビット構成を図6に示します.LED2(橙)はFTIOB1端子に接続されています.ここではEB1ビットでFTIOB1端子の出力を許可します.注意する点としてはリセット後の値(デフォルト)が'1'になっていることです.PWMモードとして動作させるためには,このビットを'0'に設定しなければなりません.

zu6.jpg
<図6>TOERレジスタのビット構成

■各チャネル用の主なレジスタ
 チャネル0用とチャネル1用のレジスタには,それぞれTCNT,GRA,GRB,GRC,GRD,TCR,TIORA,TIORC,TSR,TIER,POCRの11種類のレジスタがあります.ここではLEDの調光に必要なレジスタ(TCNT,GRA,GRB,TCR)について紹介します.

●タイマ・カウンタ(TCNT)
 TCNT は16 ビットのリード/ライト可能なレジスタで,各チャネルに1 本,計2 本あります.入力したクロックによりカウント動作します.

●ジェネラル・レジスタA,B,C,D(GRA,GRB,GRC,GRD)

 GRA~GRDレジスタ は16 ビットのリード/ライト可能なレジスタで,各チャネルにそれぞれ4 本,計8 本あります.PWM動作などアウトプット・コンペア・レジスタとして使用しているときは,GRA~GRDレジスタとTCNTレジスタの値は常に比較されています.

●タイマ・コントロール・レジスタ(TCR)
 TCRレジスタはタイマ・カウンタ(TCNT)のカウンタ・クロックの選択やカウンタ・クリア要因の選択などを行います.TCRレジスタは各チャネルに1 本,計2 本のTCR があります.TCRレジスタのビット構成を図7に示します.ここではTPSC2~TPSC0ビットで内部クロックのφ/4を選択し,CCLR2~CCLR0ビットでTCNTをクリアするジェネラル・レジスタをGRAとして選択するようにします.

zu7.jpg
<図7>TCRレジスタのビット構成

 今回は,PWMによるLEDの調光のしくみからH8/36064マイコンに内蔵されているタイマZモジュールの構造やレジスタの機能について解説しました.
 次回は,LEDの明るさを変化させる簡単なC言語プログラムを作ってみましょう.H8初心者にとっては,実際にH8マイコンを使ってLEDの明るさを変化させてみることで,今回説明したレジスタの理解が深まると思います.それでは,がんばっていきましょう!

< Yoshihito Shimada >

2009年10月29日

はてなブックマークに追加   はじめてのH8マイコン 基礎編
<第27回>A-D変換モジュール機能を使って電圧を測定してみよう!…part2


 前回は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に示すようなブレッドボードが大変便利です.

p001.jpg
<写真1>A-D変換モジュール機能の動作確認のようす

●ブレッドボード上に回路を組み立てる
 写真2にブレッドボード上の回路の外観を示します.ビニール線や,部品のリード線をブレッドボードの穴に挿入して結線します.はんだ付けが不要で,部品の抜き差しで回路変更が容易なためとても重宝します


hyou002.JPG
<写真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Ωの半固定抵抗器を使いました.

zu001.jpg
<図1>A-D変換モジュール機能の動作確認回路の構成

■A-D変換モジュールの各種レジスタの設定

 それでは,前回に登場したA-D変換モジュールの各種レジスタについて思い出してみましょう.表1に各種レジスタをまとめてみました.なるべく初期設定 で動作する初心者向けのC言語プログラムの作成をしていきます.
 A-D変換動作は単一モードでアナログ入力チャネルはデフォルトのAN0を選択します.つ まりA-D変換結果が格納されるレジスタはADDRAです.ここで設定するレジスタはADCSR で,A-D変換の開始を制御するADSTビットと,A-D変換の終了を示すADFフラグ・ビットになります.

<表1>各種レジスタと設定値

hyou001.JPG
(注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'にクリアして戻しておきましょう.

zu002.jpg
<図2>右に6ビットシフトさせたときのビットのようす

■モニタを使ってA-D変換モジュール機能の動作確認をしてみよう!

 HEWでC言語プログラムを作成してビルドしたら,モニタプログラム専用通信ソフト[Hterm]を起動してロードモジュールファイル(AD_test_ver1.abs)をダウンロードします.

●ソース・リストを表示してブレークポイントを設定する
 それではモニタを使ってA-D変換モジュール機能の動作確認をしてみましょう.[表示]メニューから「AD_test_ver1.c」をクリックする と,図3に示すようなソース・リストが表示されます.プログラムは単一モードでA-D変換を繰り返し実行するため,「(6) A-D変換データの格納」の行にブレークポイントを設定しておくとよいでしょう.

zu003.jpg

<図3>Htermのソースウィンドウでブレークポイントを設定

●A-Dモジュール関連のレジスタを表示する

 [表示]メニューから[Peripheral]を選択すると,周辺機能を選択するウィンドウ(図4)が開きます.ここで調べたい周辺機能を選択すると, 関連したレジスタのビット構成とその値が表示されます.ここでは「A/D」を選択して[OK]ボタンをクリックしてみましょう.

zu004.jpg
<図4>周辺機能を選択するウィンドウ

 すると,図5に示すようなA-D変換モジュール機能に関するレジスタが表示されます.ここではADDRAレジスタの値に着目します.

zu005.jpg
<図5>Peripheralウィンドウに表示されたA-D変換モジュール機能の関連レジスタ

●メモリ内容を表示する

 [表示]-[Memory]を選択するとメモリ情報を指定するウィンドウ(図6)が開きます.ここではA-D変換データが格納されるアドレス「H'FA00」を指定し,表示個数は「1個」,サイズは「ワード」を選択しておきます.

zu006.jpg
<図6>メモリ情報の指定

●プログラムを実行してA-D変換する

 まずは,A-D入力端子をVCC(+3.3V)に接続します(H8マイコン・ボードAN1コネクタの1ピンと4ピンからの配線を接続します).それでは HtermのコンソールからGコマンドを実行してみましょう.すると,指定したブレークポイントで一時停止します.このとき図7に示すように,ADCSR レジスタの7ビット目であるADFビットが'1'に変化していると思います.
 つまり,この時点でA-D変換が終了していることを示しています.さて,ここ でPeripheralウィンドウに表示されたADDRAレジスタ値に着目してみましょう.値はFFC0になっています.

zu007.jpg
<図7>プログラム実行後のPeripheralウィンドウに表示されたA-D変換モジュール機能の関連レジスタ

●ステップ実行(Pstep)してRAMに格納されたデータを確かめる

 それでは[F11]キーを押して順次Pstepコマンドを実行していきましょう.ここでは図8に示すように,Memoryウィンドウに表示されたアドレ スH'FA00の値の変化に着目します.1回目のPstepコマンドの実行で値がFFC0になります.このときADDRAレジスタのA-D変換データが格納されたことがわかります.さらにPstepコマンドを実行すると値が03FFに変化します.これは6ビット右にシフトしたためです.

zu008.jpg
<図8>ステップ実行(Pstep)して格納されたデータをMemoryウィンドウで確認する

 データ採取の要領がわかったところで,外付け回路の可変抵抗器VRを回してA-D入力端子の電圧を変化させてみましょう.表2にA-D変換結果をまとめてみました.実験の値と理論値を比べてみると,概ね一致していることがわかります.理論値は次式より求まります.

  理論値(10進表示) = 1023 × Vin[V]/3.3[V]

<表2>A-D変換データの理論値と実測値

hyou0002.JPG (注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 >

最近のエントリ

このブログのフィードを取得
[フィードとは]

カテゴリ

おすすめ書籍


最近のコメント


会社案内
情報セキュリティおよび個人情報の取り扱いについて

コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。
コメントはそれぞれ投稿した人のものです。