3軸加速度センサで学ぶアナログの世界S08ではじめるマイコン制御プログラミング(5)(2/3 ページ)

» 2009年02月26日 00時00分 公開
[高田浩,@IT MONOist]

アナログ・データをLEDに表示

 まずは、ポテンショメータのアナログ出力をADCでデジタルに変換し、その値を8個のLEDに2進数表示するプログラムを考えてみましょう。なお、LEDの表示部分はこれまでの連載で紹介した処理が使えます。

 まず、ADCのレジスタの設定です。マイコン「MC9S08QE128」のADCは、分解能を12ビット、10ビット、8ビットから選択できます。分解能が高いほど高性能なのですが、今回はデータの操作が簡単な8ビット・モードを使用することにします(LEDも8ビット分しかありませんしね)。ちなみに初期設定で、すでに8ビット・モードになっていますので、特に設定を変更する必要はありません。また、ADCのクロック・ソースも初期設定のままバス・クロックを使用します。

 先ほど、図1の回路図で確認したように、ポテンショメータの出力はマイコンのPTA0とPTC6ピンに接続されています。今回はADCのアナログ信号入力ピンとして、PTA0を用います。データ・シートなどで確認すると、このピンはADCのADP0と共有していることが分かります(表1)。

ピン番号 ポート・ピン アナログ・ピン
50 PTA0 ADP0
49 PTA1 ADP1
38 PTA6 ADP8
37 PTA7 ADP9
表1 ポート・ピンとアナログ・ピンの対応(一部)

 ADP0ピンとして使うには、APCTL1レジスタのADPC0ビットを「1」にして、AD0ピンに対してGPIOで使うI/Oポート制御を“disabled”にしておく必要があります(図3)。

APCTL1レジスタ(リファレンス・マニュアルより) 図3 APCTL1レジスタ(リファレンス・マニュアルより)

 アナログ/デジタル変換は設定にもよりますが、数十μ秒程度の時間が必要です。変換の終了は、変換完了フラグ(COCO)か、変換完了割り込みで知ることができます。前回「LEDの制御に時間の概念を取り入れる」で、せっかく割り込みを学びましたので、ここでは変換終了割り込みを使うことにしましょう。この割り込みを有効にするには、ADCSC1レジスタのAIENビットを「1」にします。

 ADCには、一度だけ変換するモードと連続して変換し続けるモードがあります。ポテンショメータやセンサの値をモニターする場合は、連続して変換しますのでADCOビットを「1」にします。そして、変換する入力チャネルを設定します。今回はAD0ピンだけを使用していますので、5ビット幅のADCHを「00000b」に設定します。なお、初期値は「11111b」でADCが無効になっていますので注意してください(図4)。

ADCSC1レジスタ(リファレンス・マニュアルより) 図4 ADCSC1レジスタ(リファレンス・マニュアルより)

 これらの設定をmcu_init関数に記述します。LEDの出力の設定はそのままで、ADC関係の設定を追加しています(リスト1)。

リスト1 リスト1

 アナログ/デジタル変換が終わると、その結果はADCRH、ADCRLレジスタに格納されます(図5)。

ADCRH/ADCRLレジスタ(リファレンス・マニュアルより) 図5 ADCRH/ADCRLレジスタ(リファレンス・マニュアルより)

 下位8ビットがADCRL、上位ビットがADCRHに格納されるのですが、今回は8ビット・モードで使用しているのでADCRLレジスタだけを使います。先ほど、変換が終了したときに割り込みが発生するように設定しましたので、割り込み処理の中でADCRLレジスタの値を取り出して、LEDに表示するようにすればOKです。ADC割り込みのエントリー番号は「VectorNumber_Vadc (19)」です(リスト2)。

リスト2 リスト2

 リスト3を見てください。main関数の処理は至って簡単です。mcu_init関数を読んだら永久ループをしているだけです。

リスト3 リスト3

 ここまでの作業ができたらプログラムをビルドし、デバッガを起動してデモ・ボードで動作を確認してみましょう。

 ポテンショメータを回すと、LEDに2進数00000000〜11111111の値が表示されるはずです。確認できましたでしょうか? これがアナログ値を8ビットのデジタル値に変換した結果となります。

センサを使ってみる

 連載第1回「マイコン・システムでどんなことができるのか?」でお風呂を沸かす例え話をしました。覚えていますか? 「速度」「加速度」「温度」「光」「磁気」「放射線」「赤外線」など、身の回りにあるさまざまなモノの量を主に電気信号に変換するのがセンサでした。

 先ほどのデモでは、人間がセンサになったつもりでつまみ(ポテンショメータ)を動かし、アナログ信号を作り出しました。見た目にだまされていたかもしれませんが、全然自動制御じゃなかったですね。今度は実際にセンサを使ってアナログ信号を作り出してみましょう!

 デモ・ボードには、アナログのセンサとして3軸加速度センサ「MMA7260Q」が搭載されています。手始めに、X軸の値をLEDに表示させてみましょう。

 図2の回路図を見てみると、X軸の出力(XOUT)はPTA1につながっています。PTA1は、表1でも示したように、ADP1として使えますので、APCTL1レジスタのADPC1ビットを「1」に、ADCSC1レジスタのADCHを「00001b」に変更します(リスト4)。

リスト4 リスト4

 それでは、プログラムをビルドして実行してみてください。

 平らな机の上にデモ・ボードを静かに置いたとき、LEDに「10000000b」付近の値が表示されるはずです。なお、MCUボードを手前にしたときの左右方向がX軸になります(図6)。皆さんも左右に傾けて、値の変化を確認してください。

加速度センサの各軸 図6 加速度センサの各軸

 同様にY軸、Z軸についてもピンとチャネルを変えるだけです。詳しくは説明しませんが、皆さんならきっと大丈夫……ですよね?

 ここで少し「MMA7260Q」の使い方について補足します。

 このセンサは、加速度を±1.5〜±6gの間で4段階に感度を切り替えることができます(表a)。今回紹介したデモ・プログラムは傾き検知ですので±1gまで測れればよいわけです。ですから、今回はデモ・ボードのジャンパで一番敏感な1.5gモードにしてあります。デモ・ボードのジャンパを切り替えることで、プログラムからモードを変更することができます(表b)。

センサ感度の切り替え(MMA7260Qデータ・シートより) 表a センサ感度の切り替え(MMA7260Qデータ・シートより)
センサのピン名 ジャンパ名 1-2ショート 2-3ショート
g-Select1 J13 PTD0で制御 0
g-Select2 J14 PTD1で制御 0
表b デモ・ボードでのセンサ感度の設定

 ちなみに、水平な場所にデモ・ボードを置いた場合、X軸とY軸については0gですが、Z軸は重力の影響で1gとなります。

 デモ・ボードで使用しているVDDは3Vです。そのため、0gのときのセンサ出力は1.5Vになります。また、1.5gモードのときの電圧変化は800mv/gです。従って、傾き検知で得られるセンサ出力電圧は0.7〜2.3Vの範囲になります。また、加速度センサはその構造上、温度変化の影響を受けます。そのため、実務のプログラムでは0gオフセットでのキャリブレーションが必要です。詳細は、データ・シート「MMA7260QT」アプリケーション・ノート「AN3107」を参照してください。



Copyright © ITmedia, Inc. All Rights Reserved.