こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PIC18でのA/D変換

PIC18F67J60-l/PT(40MHz)で、C18を使ってA/D変換を行うプログラムを作成しました。
しかし、実際に接続をしてみると上手く動作しませんでした。
具体的には、Web上でA/D変換の結果を表示して確認しているのですが、
結果の値がばらついたり、0か1023が表示され、安定しません。
(1023以上の値が表示されないので、表示するプログラムには問題ないと思います)

ピンの接続を何度も確認したり、接続状況を変えたのですが、
問題を解決するまでに至りませんでした。

プログラムに問題があるか、初心者なのでよく分かりません。
参考書や資料を見る限りではプログラムに問題はないと思うのですが、
皆様のご指摘を頂きたいと思います。
宜しくお願いします。

-------------------------------------------------------------------
(前提条件)
Vref-はAN2(0V)、Vref+はAN3(3.3V)から取り、
入力をAN4、AN7、AN8、AN9から取り込む。


(作成したA/D変換プログラム)
 //各レジスタの設定
 ADCON1 = 0x35; //VREF-はAN2、VREF+はAN3
 TRISA = 0x2F;  //AN2,AN3は入力モード
 TRISF = 0x1C; //AN7~AN9を入力にする
 ADCON2 = 0xB6;

 //AN4用 加速度センサA1
 ADCON0 = 0x11;
 Delay10TCYx(0);
 ADCON0bits.GO = 1;
 while(ADCON0bits.GO);
 Delay10TCYx(0);
 uitoa(*((WORD*)(&ADRESL)), AN4String);

 //AN7用 加速度センサA2
 ADCON0 = 0x1D;
 Delay10TCYx(0);
 ADCON0bits.GO = 1;
 while(ADCON0bits.GO);
 Delay10TCYx(0);
 uitoa(*((WORD*)(&ADRESL)), AN7String);

 //AN8用 加速度センサB1
 ADCON0 = 0x21;
 Delay10TCYx(0);
 ADCON0bits.GO = 1;
 while(ADCON0bits.GO);
 Delay10TCYx(0);
 uitoa(*((WORD*)(&ADRESL)), AN8String);

 //AN9用 加速度センサB2
 ADCON0 = 0x25;
 Delay10TCYx(0);
 ADCON0bits.GO = 1;
 while(ADCON0bits.GO);
 Delay10TCYx(0);
 uitoa(*((WORD*)(&ADRESL)), AN9String);

 // AD converter errata work around (ex: PIC18F87J10 A2)
 #if !defined(__18F452)
 PRODL = ADCON2;
 ADCON2bits.ADCS0 = 1;
 ADCON2bits.ADCS1 = 1;
 ADCON2 = PRODL;
 #endif

投稿日時 - 2007-08-23 11:25:29

QNo.3278988

すぐに回答ほしいです

質問者が選んだベストアンサー

PIC18F67は使ったことが無いので、ADCONのレジスタの細かいビットは不明ですが、気になることとして。
>結果の値がばらついたり、0か1023が表示され、安定しません。
結果の値がばらつくのは、vrefかアナログ信号自体に盛大にノイズが乗っていませんでしょうか?オシロスコープがあれば一度確認してみてください。ノイズが確認されたらパスコンやシールド線でノイズ対策を施します。時々のばらつき程度であればプログラムで平均をとりノイズ値を標本外とする手もあります。

0か1023しか表示されないのは、まともにアナログ信号を受けていません。チャンネル毎の問題でしょうか?
チャンネル毎なら正常なチャンネルと異常なチャンネルの配線を入れ替えてみてどうなりますか?もし入れ替わったら、センサとマイコンの間に問題があることになります。センサの不良かも知れません。

あと、Delay10TCYx(0);でウェイト時間は十分でしょうか?
アナログチャンネル切り替え後のウェイト時間が不十分だとアナログ変換値が正常になりませんのでハードの仕様を確認してみてください。
とりあえず試しにウェイトを増やしてみるのも良いかもしれません。

投稿日時 - 2007-08-23 12:29:55

お礼

ご回答ありがとうございます。

この書き込みの後、いろいろ試していて、
何とかAN4以外のピンからの出力を取り込み、
A/D変換した値を表示することに成功しました。

ノイズ等の影響はそれほどなく、
値がばらついたのは、接続が甘かったのが原因だったと思います。

とりあえずですが、何とかなりました。
違うピンで行おうとすると、コンパイルでエラーになってしまいましたが…
(自己解決できなかったら、再度質問してみます)

大変分かりやすいご回答、ありがとうございました。

投稿日時 - 2007-08-23 18:39:32

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

zwi

補足:
加速度センサは使ったことが無かったのですが、ドリフトと呼ばれる値のばらつきが起きる様です。下記サイトを参照↓
http://www008.upp.so-net.ne.jp/funfly/adxl202.html
この場合は加速度センサの出力がPWMと違いますが同様なドリフトが起こっている可能性があります。一度確認してみてください。
加速度センサをオシロスコープへ接続するなど。一定値が出ていることを確認します。

投稿日時 - 2007-08-23 17:08:09

お礼

補足、ありがとうございます。
一定値が出力されるか、確認してみます。

投稿日時 - 2007-08-23 18:30:25

あなたにオススメの質問