みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

締切り済みの質問

PIC A/D変換での問題

PIC16F690を使用しLCDにA/D変換をした数値を表示させる物を作ったのですが
抵抗を一定の速度で回しても数値が一定の速度で変化しません。
詳しく説明しますと、今回書いたプログラムは8bitで255までの値を表示させるものです。
抵抗をめいいっぱい回して数値を1にし(0にはどうしてもなりません。おそらく抵抗の問題)
そこからゆっくりと一定の速度で抵抗を回すと数値が上がっていきます。
30辺りまでは一定の速度で数値が変化するのですが、そこから少し回すといきなり数値が220ぐらいにまで上がります。(一応30~210までの数値も出ている様なのでいきなり飛んでるわけではない)
抵抗を1Kのものから10Kものに変えてみたりしたのですが症状に変化はありませんでした。
どうしても解決できなかったので質問をした次第です。
解決方法がわかる方がいらっしゃいましたらお教え下さい。

プログラムを載せておきます。

#include<pic.h>
#include<stdio.h>
#include"lcd.h"

unsigned int temp;
unsigned int x = 1;
unsigned char outString[20];
unsigned char count[20];

void init_a2d(void){
ADCON1=0x10;// A/D Clock Fosc/8
ADCON0=0x01;// A2D 入力をChannel 0 (RA0),
// Left justified, A/D をON
}

// 指定された入力チャネルをA/D変換し8 bitの結果を返す
unsigned char read_a2d(unsigned char channel){
channel&=0x0F;// 4 bitsを確認し
ADCON0&=0xC3;// 現行入力チャネルをクリア
ADCON0|=(channel<<2);// 新入力チャネルを設定
GODONE=1;// 変換開始
while(GODONE)continue;// 変換終了を待つ
return(ADRESH);// 8 bitの結果を返
}

void main(void)
{
pic_init();
init_a2d();// A/D モジュール初期化
lcd_init();
lcd_goto(0x00);
while(1)
{
__delay_us(50);// 50uS待ち(AD充電待ち)
temp=read_a2d(0);
sprintf(outString,"A/D=%2d",temp);
lcd_puts(outString);
lcd_goto(0x40);
sprintf(count,"Count=%d",x);
lcd_puts(count);
x++;
__delay_ms(100);
lcd_clear();

}
}

投稿日時 - 2012-06-06 19:42:12

QNo.7518308

困ってます

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

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

回答(2)

>解決方法がわかる方がいらっしゃいましたら

原因もわからないのに解決したいなら、プロに費用を払ってゼロから製作依頼すればいいです。

今のところ、ハードウェアが既製品ならともかく、自作ならそこら辺に容疑があります。

VREF を使ってるのか、使ってるならどうする予定で外付け部品をどのようにつないでるか、
VREF は兼用端子なので、端子がオープンなのにVREFとして使おうとしたら多分
不具合あるでしょう(このPICの詳細は知らないので断言しませんが)
また、VREF へのアナログ電圧を外部から与えるとしたら、どのような回路で与えてるのか。
抵抗値を変えてるというが、接続の仕方が間違ってればおかしな動きになります。
試験的には、3端子の可変抵抗なら1に電源、3にGND、2で分圧された電圧をアナログ入力に与えるのがよく使われる方法だと思いますが、このようにしてますか?
ここら辺も「まず疑ってみる」姿勢で明記した方が解決に近づきます。
大抵は「いいと思ってたつもりがまちがってた」とか、
細かい部分は正しくても組合わせ方がまずいのが原因だったりします。

投稿日時 - 2012-06-12 21:11:07

ANo.1

可変抵抗器は、抵抗の変化のカーブにA・B・Cの3タイプがあります。(参考ページ参照)

音楽等のボリューム調整に使われるのはほとんどタイプAで、片方の端では緩く、もう片方の端では急激に変化します。

一度、テスターでゼロ値・MAX値・中央時の値を測ってみるとどうなるでしょうか。

中央時の抵抗値が、ゼロ値とMAX値の平均値から大きく外れているようなら、本当にその様な変化をしていて、PICプログラミングは間違っていなかった、ということになります。

(参考)抵抗器 - 可変抵抗器
http://www.piclist.com/images/www/hobby_elec/resistor.htm#variable

投稿日時 - 2012-06-06 20:14:46

補足

使用している抵抗は半固定抵抗なのでBカーブのみです(´・ω・

投稿日時 - 2012-06-07 03:39:10

あなたにオススメの質問