ARMマイコン「LPC1114」にはさまざまな周辺デバイス(ペリフェラル)が内蔵されています。今回はアナログ信号をデジタル信号に変換するA/Dコンバータの使い方を学びます。
組み込みの世界で最も成功したプロセッサの1つ「ARM」を用いたマイコン開発にチャレンジするこの連載、今回は「アナログ・デジタル・コンバータ(A/Dコンバータ、以下 ADC)」とその使い方について勉強します。
前回の「デジタル入力」は電圧の値から0か1の値を得るというものでした。こんな風にどんなものでも1か0かに切り分けるというのがデジタルの真骨頂ですね。
でも入力時にそんなにばっさり切り分けていいものでしょうか。もっと細かい刻みで電圧の値を取得しておけば、後でいろいろと高度な処理も可能になります。そんなわけで、入力時に一刀両断に切り分けるのではなく、もっと細かな刻みで値を取得できるADCの使い方について勉強していきましょう。
それではLPC1114に搭載されているADCについてみていきましょう。
ADCに入力できる電圧の範囲ですが、0Vから電源電圧までとなっています。LPC1114の電源電圧が3.3Vとすると、ADCの入力ピンに印加できる電圧の範囲は0Vから3.3Vまでとなります。前回紹介したデジタル入力の場合は5Vまでの入力電圧にまで耐えられましたが、アナログ入力の場合は電源電圧までなので注意が必要です。もしそれ以上の電圧を測定したい場合は抵抗などで分圧する必要があります。また、もっと小さな電位を測りたいのであればOPアンプなどで増幅してアナログ入力します。
このADCは10bitの分解能力をもっています。これは0Vから電源電圧までの範囲を2の10乗すなわち1024分割して値を取り出せるということです。電源電圧が3.3Vとすると3.3/1024=0.0032V、3.2mV単位で測定が可能です。これを10bitの分解能で量子化するといいます。
このADCのサンプリング周波数は最大400KS/Sです(400K Samping/Second)。一秒間に40万回測定が可能なのです。これはLPC1114に搭載されているADCの性能であって、mbedからこのサンプリング周波数で使えるとは限りません。
LPC1114に搭載されているADCは8チャンネルですが、mbedではそのうちの5つが使用可能です。下のピン配列図をみるとdp4/dp9/dp10/dp11およびdp13のピンがアナログ入力として利用可能です。
アナログ入力を使うためにはAnalogInクラスを使います。それではこのクラスの使い方を見ていきましょう。何かプログラムを作るとmain.cppとmbedがフォルダーの中に作られますが、mbedフォルダーのClassesの中、AndalogInというファイルを開いてください。すると図1のような画面が現れます。このクラスのメンバー変数やメンバー関数の説明が表示されますね。
それではこのリファレンスを参照しながら、以下のプログラムでAnalogInクラスの使い方を見ていきましょう。
1:#include "mbed.h" 2:AnalogIn voltage(dp4); 3:int main() { 4: float a; 5: while(1) { 6: a = voltage.read(); 7: printf("¥f\r",a); 8: wait(1.0); 9: } 10:}
2行目でdp4ピンをアナログ入力として利用するため、AnalogInのインスタンスであるvoltageを生成しています。4行目で浮動小数点型の変数aを宣言しています。5行目から9行目まで永久ループです。そのループ中で変数aにアナログ入力された値を代入しています。その値をprintfでシリアルポート上に出力します。PC側でシリアル接続すればターミナルエミュレータなどでこの値を表示することができます。
8行目で1秒ウエイトしています。このプログラムは一秒間隔でdp4の電位を測定しシリアル経由でPCに送ります。表示されるのは0.0から1.0までの値です。もし電圧の値を表示させたい場合は、変数aに上限電圧である3.3をかける必要があります。
printfでは値を表示した後“ \r ”としていますので、改行して表示されるのではなく同じ行に値が表示されるはずです(ターミナルエミュレータの実装にもよります)。
mbedを利用したビルドおよびターゲットマイコンへの書き込み方法は、本連載の第2回と第3回をご覧ください。またシリアルポートを介して、PCでデータを表示する方法は第4回を参考にしてください。
Copyright © ITmedia, Inc. All Rights Reserved.