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();
}
}
お礼
回答ありがとうございます。