反固定抵抗をセンサーの代わりに用いた際は、以下のプログラムで、0~1023の値を読むことが出来ました。
しかし、このセンサーに変更して値を読むと、8~19程度のとても小さな値しか返ってこないのです。
マイコンへの接続は、ADCピンに直で繋いでいます。
PSDセンサーの故障かとも思い、いくつかのセンサーで試してみましたが、どれも同じ結果でした。
プログラムの問題なのでしょうか、それともセンサーとマイコンの間に、コンデンサなどのフィルタを入れるなどの、ハード的な問題なのでしょうか。
回答のほど宜しくお願いします。
#include<avr/io.h> /*DDR,PORTの指定が可能*/
#include<util/delay.h> /*delayが利用可能*/
#include<math.h>
//#define F_CPU 1000000UL; /*CPUのクロック周波数を設定*/
volatile unsigned short cnt=0; /*ADC格納用,最適化防止, 0~65535*/
volatile unsigned short sum=0;
unsigned short adc[100];
unsigned char data[6]; /*Tera term転送用データ 格納用配列*/
static unsigned int i=0;
static unsigned int j=0;
int main(void){
/////////////////////////////////////////////////////*Port*////////////////////////////////////////////////////////////////////
/*LED用*/
DDRB = 0b11111111; /*PORTB全てを出力モード*/
PORTB = 0b00000000; /*PORTBを初期化*/
/*PSD用*/
DDRC = 0b11101111; /*PC5のみ入力モード*/
PORTC = 0b00000000; /*PORTCを初期化*/
/*Speaker用*/
DDRD = 0b11111111; /*PORTD全てを出力モード*/
PORTD = 0b00000000; /*PORTDを初期化*/
///////////////////////////////////////////////////*Resister*///////////////////////////////////////////////////////////////////
/*ADC用*/
ADCSRA = 0b10001111; /*1/1024のプリスケーラ*/
ADMUX = 0b00000101; /*ADC5を使用*/
_delay_ms(5); /*ADMUXの設定終了まで待機*/
/*Speaker用*/
TCCR1A = 0b10000010;
TCCR1B = 0b00011001;
TCCR1C = 0x00;
TIMSK1 = 0x00;
OCR1A = 1300; /*音色変更*/
/*Serial用*/
UBRR0 = 25; /*動作周波数/(ボーレート*16)-1*/
UCSR0A = 0b00100000;
UCSR0B = 0b00011000;
UCSR0C = 0b00000110;
while(1){
sum = 0;
for(j=0;j<9;j++){
ADCSRA = ADCSRA | 0b01010000; /*ADCスタート,ADC割り込みスタート*/
while(bit_is_set(ADCSRA,ADSC)); /*ADCが終了(ADSC=0)するまでloop*/
adc[j] = ADC;
sum += adc[j];
}
cnt = sum/10;
data[0]='0'+(cnt/10000)%10;
data[1]='0'+(cnt/1000)%10;
data[2]='0'+(cnt/100)%10;
data[3]='0'+(cnt/10)%10;
data[4]='0'+cnt%10;
data[5]='\n';
for(i=0;i<6;i++){
while(!(UCSR0A&0b00100000));
UDR0 = data[i];
_delay_ms(30);
}
while(!(UCSR0A&0b00100000));
UDR0 = '\r';
_delay_ms(10);
if(0<=cnt && cnt<=10){
PORTB = 0b01111101;
ICR1 = 0;
}
else if(20<cnt && cnt<=25){
PORTB = 0b00000101;
ICR1 = 3821;/*C*/
}
else if(15<cnt && cnt<=20){
PORTB = 0b00001101;
ICR1 = 3404;/*D*/
}
else if(10<cnt && cnt<=15){
PORTB = 0b00011101;
ICR1 = 3032;/*E*/
}
else if(5<cnt && cnt<=10){
PORTB = 0b00111101;
ICR1 = 2862;/*F*/
}
else if(30<cnt && cnt<=35){
PORTB = 0b01111101;
ICR1 = 2550;/*G*/
}
else if(35<cnt && cnt<=40){
PORTB = 0b01111101;
ICR1 = 2271;/*A*/
}
else {
PORTB = 0b00000000;
ICR1 = 2023;/*B*/
}
}
return 0;
}