2013年12月29日日曜日

秋月PINフォトダイオードガイガー制作(2)

秋月の回路図を改めて確認したところ、アナログ部の出力をPICマイコンのAD変換ピンに挿してるっぽいことに気づいた。

アナログ部の出力を外部割り込みするんじゃなくてAD変換するのが正解っぽい。

ということでAtmega8でAD変換してみた。

  • アナログ部出力をADC0に接続し、その結果をLEDに出力
  • Atmega8のAD変換は10bitなのだが上8bitのみを使用(ADLAR)
  • 連続AD変換と割り込みを利用してLED表示用バイト領域を更新
  • 200kHzを超えると変換精度が下がるらしいのでAD変換用タイマーをck/8にする
  • 基準電圧に内部2.56Vを使用
----
/*
atmega8 16pu
ISP
PC6 RESET
PB5 SCK
PB4 MISO
PB3 MOSI
ADC PC0 ADC0
*/
#define F_CPU 1000000UL // Clock Speed
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
/* DDRC |= (1 << PC0); */
#define DSET(p,n) (DDR##p|=(1<<P##p##n))
/* PORTC |= (1 << PC0); */
#define PSET(p,n,d) \
if ((d)) { \
(PORT##p|=(1<<P##p##n));\
} else { \
(PORT##p&=~(1<<P##p##n));\
}
volatile unsigned char v;
int
main(void)
{
unsigned char j;
// port c output setting
DSET(B,0);
DSET(B,1);
DSET(B,6);
DSET(B,7);
DSET(D,4);
DSET(D,5);
DSET(D,6);
DSET(D,7);
ADMUX = (1<<REFS1) | (1<<REFS0) | (1<<ADLAR);
// ck/8
ADCSRA = (1<<ADEN) | (0<<ADSC) | (1<<ADFR) | (1<<ADIE) |
(1<<ADPS2)| (1<<ADPS1)| (1<<ADPS0);
ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) |
(0<<ADPS2)| (1<<ADPS1)| (1<<ADPS0);
sei();
v = 0;
while (1) {
j = 0;
PSET(B,0,(v&(1<<j))>>j);j++;
PSET(B,1,(v&(1<<j))>>j);j++;
PSET(B,6,(v&(1<<j))>>j);j++;
PSET(B,7,(v&(1<<j))>>j);j++;
PSET(D,4,(v&(1<<j))>>j);j++;
PSET(D,5,(v&(1<<j))>>j);j++;
PSET(D,6,(v&(1<<j))>>j);j++;
PSET(D,7,(v&(1<<j))>>j);j++;
_delay_ms(10);
}
return 0;
}
ISR(ADC_vect)
{
v = ADCH;
}
view raw adc.c hosted with ❤ by GitHub
----

で、実験結果。

  • PINフォトダイオードのアルミ遮蔽が不十分らしく太陽光があたると電圧低下する様子
  •  →簡易照度計完成(アレ!?)
  •  →AD変換はできてるっぽい
  • やはり手を近づけるとLEDがチラチラする
  •  →静電気に弱し
  • マントルを近づけるとチラチラするものの静電気のせいかどうか判別不能


ふーむ。PINフォトダイオードのアルミ遮蔽をしっかりやって再実験の必要がありそうだ。

0 件のコメント:

amazonアソシエイト