はじめに
こんにちは、槇原です。前回は大会のレポートをしていましたが、大会前でばたばたしていて更新できていなかった記事をこれから更新していきます。Part14のブログではエンコーダを読む記事を書いていましたが、だいぶ時間が空きましたね…
今回のマウスで利用したA/D変換について
今回は壁センサと電源電圧監視用にA/D変換を使います。
壁センサでは、LEDから出た光を壁に反射させとフォトディテクタで受光し、その強度から壁の有無や距離を測定します。今回はフォトトランジスタ(Q3)で光の強度に応じた電流を流すようになっているので抵抗(R7)に電流を流し、その電圧をマイコンのA/D変換を使って光の強度を測定します。
またHPF(C6,R8)をいれて約1.5 kHz以下の成分をカットしています。これによって蛍光灯などの低周波の影響を少なくしています。
電源電圧監視部分ではバッテリー(6~8V)の電源電圧を分圧して1~1.4Vに変換しています。
今回はどちらもソフトウェアから好きなタイミングでA/D変換可能にする必要があります。
アナログ入力のための設定
ピンの設定
RX631ではA/D変換のチャンネルAN001~AN020の各チャンネルとピンが最初から紐づいています。今回利用したR5F5631MDDFMは64ピンなのでリファレンスマニュアルの表1.10によれば以下のように対応しています。例えばPE1ピンであればAN009に接続されています。
アナログ入力のためには次のようにPMR, PDR, ASELの値を指定する必要があります。以下の例はPE1をアナログ入力にするコードです。
PORTE.PMR.BIT.B1=0; PORTE.PDR.BIT.B1=0: MPC.PE1PFS.BIT.ASEL=1;
HM-StarterKitのサンプルコードではPMRを1にしていたのですが、リファレンスマニュアルをよく見ると0にするように書かれています。周辺機器を接続して余計な容量成分が並列につながってしまうとA/D変換の結果に影響を与えてしまうようです。周辺機能の設定次第でどうなるかが決まりますが、デフォルトだとHi-Zなので影響はないです。
(実際私もPMRは1にしていたのですが、今回はあまり致命的な問題にはなりませんでした。あまりいいとは言えないのですが…)
A/Dデータレジスタフォーマット選択ビット
0で右詰め1で左詰めに指定
S12AD.ADCER.BIT.ADRFMT=0;//右詰めのフォーマット
CKS[1:0] ビット(A/D 変換クロック選択ビット)
S12AD.ADCSR.BIT.CKS=0x03; //PCLK
A/D変換のクロックはサンプリングタイムを決定するために必要なパラメータの一つです。設定値とクロックは次のように対応します。
00 : PCLK/8
01 : PCLK/4
10 : PCLK/2
11 : PCLK
RX631のA/D変換の入力はサンプルホールド回路があり、コンデンサに電荷をチャージして測定したい電圧になるまで待つ必要があります。このとき十分な時間を設定するために短すぎず(十分にチャージして正しいサンプルをするため)、長すぎず(時間はなるべくかけたくない)適切な時間にする必要があります。リファレンスマニュアルによればサンプリング時間は0.4 µs以上にすることとされています。
サンプリング時間はA/D変換クロックとADSSTR01レジスタのSST1ビットで指定されるステート幅で決まります。
SST1ビットはデフォルトで0b00010100(20)なのでA/D変換のクロックがPCLK(48MHz)であれば20/48MHz=0.4167 µsとなります。
A/D変換用のコード
実際にA/D変換を開始させるためには何らかの開始信号が必要ですが、今回はデフォルトのソフトウェアトリガーを用います。
まずはADANS0またはADANS1のANS0,ANS1ビットでどのチャンネルでA/D変換をするか指定します。ADANS0はAN000~015,ADANS1はAN016~020までのそれぞれのチャンネルに対応しています。各ビットを1にするとA/D変換する対象になります。複数のビットを立てるとチャンネルの番号が小さい順に変換されます。その後ADCSRレジスタのADSTビットを1にするとA/D変換が開始されます。
S12AD.ADANS0.BIT.ANS0=0x0040; //AN006(P46のポート) S12AD.ADCSR.BIT.ADST=1; //A/D変換開始 while(S12AD.ADCSR.BIT.ADST); //A/D変換終了まで待つ int ADC_value = S12AD.ADDR6; //値を保存
壁センサを読むためのA/D変換
壁センサはLEDから発光した光が壁で反射して、距離に応じた光がフォトトランジスタに入ります。今回のマウスでは、反射強度に対応した電流を抵抗で電圧に変換し、HPFをかけています。LEDをONにした後、LEDとフォトトランジスタの立ち上がりにもわずかに時間がかかるので、決め打ちで一定時間待機してA/D変換を開始することで光の強度に対応したA/D変換の値を得ることができます。HPFによってDC成分はカットされてしまうので、待機時間は長すぎてもA/D変換の値は小さくなってしまうので適切な時間が必要となります。
物理量ベースでセンサを使うのであれば、光の強度と距離の対応をさせる必要がありますが、今回は基本的に壁の有無と簡易的な壁制御しかしないのでこの値をそのまま制御に用います。
次回はIMUの使い方について説明します。