PIC12F683にはA-Dコンバータ機能が搭載されています。この便利なA-Dコンバータを使えるようにしましょう。
■A-Dコンバータとは?
A-Dコンバータとして使用可能なポートに加えられている電圧を測定してディジタル・データに変換してくれる機能を、A-Dコンバータといいます。Anlog to
Digital
Converterの略称です。
電源電圧か外部電源を基準電圧としてこの電圧と比較することにより、電圧を測定し、ディジタル・データに変換してくれます。通常は電源電圧を基準電圧とします。
PICは2V~5Vの幅広い電源電圧で動作しますが、ここでは5Vで考えます。
■4ビットA-Dコンバータ
まず、4ビットA-Dコンバータを考えてみましょう。
測定電圧:0~5V
A-Dコンバータ変換範囲:4ビット
基準電圧(電源電圧):5V
とします。
4ビットで表現できる数:0000~1111=0~15
入力: 0 1 2 3 4 5
A-D(10進) 0 3 6 9 12 15
A-D(16進) 0000 0011 0101 1001 1100 1111
上の表のように0~5を0~15の16段階に変換することになります。
式で表すと、次のようになります。
int(測定電圧/電源電圧*15)=A-Dコンバータ出力
int:計算結果の小数点以下切り捨て
【問題】
次のようなA-Dコンバータがある。測定電圧に対するA-Dコンバータ出力を10進数と16進数で答よ。
測定電圧:0~5V
A-Dコンバータ変換範囲:4ビット
基準電圧(電源電圧):5V
(その1) 3V
3/5*15=9(10進)・・1001(16進)
(その2) 2.5V
2.5/5*15=7.5→7・・0111
(その3) 4V
4/5*15=12・・1100
(その4) 4.1V
4.1/5*15=12.3→12・・1100
(その5) 4.2V
4.2/5*15=12.6→12・・1100
(その6) 4.3V12.9→12・・1100
4.3/5*15=
(その7) 4.4V
4.4/5*15=13.2→13・・1101
上の問いからもわかるとおり、0.3V刻みでの表現になります。
5/15=0.333・・
この0.33を分解能といい、最小測定電圧幅を表します。0.3Vの分解能をもつといいます。
■10ビットA-Dコンバータ
PIC12F683のA-Dコンバータは、8または10ビットの性能をもっています。10ビットA-Dコンバータについて考えてみましょう。
測定電圧:0~5V
A-Dコンバータ変換範囲:10ビット
基準電圧(電源電圧):5V
10ビット=00 0000 0000~11 1111 1111=0~1023
変換式
int(測定電圧/基準電圧*1023)=10ビットA-Dコンバータ出力
分解能(最小測定電圧):5/1023=4.9mV
PICのA-Dコンバータを10ビットで使うと、4.9mVの分解能があります。つまり、4.9mV単位での測定が可能ということになります。そんな高機能がこの小さなパッケージの中に収まっているなんて驚きです。
【問題】
次のようなA-Dコンバータがある。測定電圧に対するA-Dコンバータ出力を10進数と16進数で答よ。
測定電圧:0~5V
A-Dコンバータ変換範囲:10ビット
基準電圧(電源電圧):5V
(その1) 1V
int(1/5*1023)=204・・・00
1100 1100
(その2) 2V
int(2/5*1023)=409・・・01 1001
1001
(その3) 3V
int(3/5*1023)=613・・・10 0110
0101
(その4) 4V
int(4/5*1023)=818・・・11 0011
0010
(その5) 5V
(5/5*1023)=1023・・・11 1111 1111
■A-Dコンバータの使い方
PIC12F683でA-Dコンバータを使う方法を説明します。このPICにはA-Dそのものは一つだけ搭載されていますが、四つのポートを順次切り替えて使用することにより、4チャネルの測定が可能です。
(1) A-Dコンバータの使用ビットを決定します。8ビットか10ビットで使用できます。
#DEVICE ADC=10 //A-Dコンバータを10ビットで使用
//10bit=2^10=0~1023
(2)sAN0~sAN3の4チャネルを指定できます。VSS_VDDにより基準電圧を電源電圧に指定しています。
setup_adc_ports(sAN0 | sAN1 | sAN2 |VSS_VDD); //A-Dコンバータ使用宣言
(3) A-Dコンバータのクロック指定です。今回はメイン・クロックの32分周で使います。
setup_adc(ADC_CLOCK_DIV_32); //A-Dコンバータ・クロック
(4) 使用するA-Dコンバータのチャネルを指定します。0~3の4チャネルが使えます。次に待機時間を入れます。最低でも20μs以上必要です。A-D変換の結果を変数に読み込みます。
set_adc_channel(0); //0チャネル指定
delay_us(20); //待機
th_adc=read_adc(); //変換結果読み出し
以上の手順により、PIC12F683のA-Dコンバータを使用することができます。
■ 課題2
A-Dコンバータ機能を使い、ジョイスティックのボリュームの値を読み取り、スロットル・スティックを半分以上上げるとLEDが点灯するプログラムを作りましょう。
// 赤外線2ch送信機TX2-006P 課題2
// A-Dコンバータ
// スロットルを半分以上上げるとLED点灯する
// ex2-006p.c PIC12F683用
#include<12f683.h>
(その1) //A-Dコンバータを10bitで使用
//読み込み値範囲:0~1023
#fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR
//ウオッチドック・タイマなし、パワーアップ・タイマ使用
//プロテクトなし、MCLRなし
#use delay(CLOCK=8000000) //8MHz駆動
#byte GP=5
#bit IROUT=GP.5
#bit LED=GP.4
#bit SW=GP.3
#define ON 1
#define OFF 0
#define HI 1
#define LOW 0
long th_adc,al_adc,vdd_adc;
//VR入力をA-Dコンバータより読み出し、各変数にセットする。
void adc_in(void)
{
set_adc_channel(0);//スロットル・スティック読み込み
delay_us(20);
(その2) ;
set_adc_channel(1);//エルロン・スティック読み込み
delay_us(20);
al_adc=read_adc();
set_adc_channel(2);//10kΩボリューム読み込み
delay_us(20);
vdd_adc=read_adc();
}
//メイン・ルーチン
void main()
{
int i;
set_tris_a(0x0f);//GP0~GP4入力、GP5出力
(その3) ;//A-Dコンバータ使用宣言
(その4) ;//A-Dコンバータ・クロック
setup_oscillator(OSC_8MHz);
IROUT=OFF;
LED=OFF;
for(i=0;i<3;i++){
LED=ON;
delay_ms(250);
LED=OFF;
delay_ms(250);
}
while(1){
(その5) ;
if( (その6) ){
LED=ON;
}
else{
LED=OFF;
}
}
}
■完成!
完成後、コンパイルし、PIC12F683に書き込んでください。
TX2-006Pの電源を入れると、LEDが3回点滅し、ファームウエアの正常起動を確認できます。
確認後、スロットル・スティックを徐々に上げてください。半分以上になるとLEDが点灯し、下げると消灯すれば完成です。
■正解
(その1)#DEVICE ADC=10 (その2)th_adc=read_adc() (その3)setup_adc_ports(sAN0 | sAN1 | sAN2 |
VSS_VDD)(その4)setup_adc(ADC_CLOCK_DIV_32) (その5)adc_in() (その6)th_adc > 512
課題2のC言語ソース・ファイルとHEXファイルはこちらからダウンロードできます【ex2_006p.lzh】。
長野県飯田工業高校 竹内浩一

PICマイコンでつくるインドア・プレーン
みんなで作ろうインドア・プレーン