수요일, 4월 01, 2009

카메라용 노출계 회로(Light meter)

평소 머릿속으로 생각만 하던 노출계를 실제로 만들어 보았습니다.
노출계란 물건은 센서로 빛의 양을 측정하여 카메라의 조리개값과 셔터 스피드를 측정 및 산출해주는 물건입니다.
소스나 회로를 구할 길이 없어 전부 스스로 설계하고 프로그램 했습니다.
센서로 들어오는 아날로그 신호를 ATmega8535 칩 안에서 디지털 신호로 컨버팅하여 값을 처리하였는데 이 A/D 컨버팅과정과 결과 값을 튜닝하는 과정이 가장 어려웠습니다.
원래 값을 좀 더 정확하게 잡으려면 '수치 해석법'을 이용하여야 하지만 이 과목을 공부하지 않은 관계로 근사값으로 방정식을 세웠습니다.
시행착오도 많았지만 보람된 작업이었습니다.
방식은 셔터 우선 방식과 조리개 우선식 어느쪽으로 할까 고민하다 조리개 우선식으로 제작했습니다.

Schematic Design


프로테우스로 설계했습니다.


실물



땜질하는 건 정말 노가다임.


소스 코드 일부(저작권을 위해 극히 일부만 적어둡니다.)

void main(void)
{
// I/O setting
DDRA = 0xfd; // PA1 : ADC
DDRB = 0xff; // 7Seg.
DDRC = 0xff; // LED

PORTA = 0x00; // 7Seg. place
PORTB = 0x00; // 7Seg. No.

// ADC setting
ADMUX = 0x21; // ADC1 8bit resolution, Use external AREF
ADCSRA = 0x87; // Allow ADC, prescaler 128

// timer setting
TCCR0 = 0x03; // prescaler : 64
TCNT0 = 0xff; // 1ms
TIMSK = 0x01; // Allow timer0 overflow interrupt

// external interrupt setting
MCUCR = 0x0a; // INT0 : falling edge
// INT1 : falling edge
GICR = 0xc0; // INT0,INT1 : interrupt enable

#asm("SEI");

while(1)
{
if(adc_stop == 0)
{
PORTC = 0xff;
delay_ms(32);
PORTC = 0x7f;
delay_ms(32);
}
else if(adc_stop == 1)
{
PORTC = 0x7f;
}

if(shutter_speed2 == 1)
{
PORTC = 0xff;
delay_ms(8);
PORTC = 0x7f;
delay_ms(8);
}
}
}