본문 바로가기

AVR 기초/CDS

[AVR 기초] CDS를 이용해 LED on-off

*키트는 Atmega128A를 사용하였습니다*

 

 

CDS란 빛의 양에 따라 저항값이 변하는 가변저항입니다. 조도 센서라고도 하는데 이 센서는 광센서의 가장 기본적인 센서로서 빛의 밝기에 대하여 전기적인 성질로 변환시켜주는 역할을 하는 센서입니다.

 

CDS를 이용하기 전에 ADC에 대해 설명하겠습니다.

ADC란 Analog to Digital Converter으로 간단히 말하자면 아날로그 신호를 디지털로 바꿔주는 것입니다.

 

 

아날로그 신호
디지털 신호

이미지 출처 : https://m.blog.naver.com/PostView.nhn?blogId=ansdbtls4067&logNo=220873048333&proxyReferer=https:%2F%2Fwww.google.com%2F

 

Analog to Digital Converter(ADC)란 무엇인가?

오늘은 여러분들이 잘 알고 계신 내용일 수도 혹은 잘 모르지만, 으레 MCU를 이용하여 펌웨어 설계 및 ...

blog.naver.com

이것을 이용해 CDS로 들어오는 아날로그 값을 디지털 값으로 변환시켜 작동하게 합니다.

 

코드는 다음과 같습니다.

 

#include <avr/io.h>

#define  CDS_VALUE 870		//외부 빛의 값이 약 10Lux일떄의 값


/*
void init_adc();

unsigned short read_adc();

void show_adc(unsigned short value);
*/


void init_adc(){			//ADC초기 설정을 하는 함수


	ADMUX = 0x00;			//ADC Multiplexer Selection Register// 
/*		ADMUX
*	Bit 7:6 - REFS 1:0(ADC 에서 사용하는 기준전압을 선택) = "00" 으로 외부의 AREF 단자로 입력된 전압 사용
*	Bit 5 - ADLAR(ADC Adjust Result) = 0 으로 10비트 ADC값을 오른쪽으로 정렬. //1이라면 왼쪽정렬
*	Bit 4~0 - Mux 4:0 ( ADC의 아날로그 입력 채널 및 이득을 선택한다. 0000이므로, 단극입력
*/ 
	ADCSRA = 0x87;			//... 비트7에있는 ADEN에 1을 주어서 Interrupt를 enable,, 분주비 128로 설정
	//ADCSRA(ADC Control and Status Register A)레지스터
/*	Bit 7 - ADEN (ADC Enable) -- 1일때 enalbe, 0이면 ADC off. 여기서는 1이므로 ADC를 enable 하게 해줌.
*	Bit 6 - ADSC (ADC Start Convertion) -- 1일때 단일  변환모드에서 A/D변환을 시작, 0일때 A/D 변환이 완료되면 하드웨어적으로 0이됨.
*											여기에서는 0으로 시작 X
*	Bit 5 - ADFR (ADC Free Running Selection) -- 1이면 프리러닝모드. 프리러닝모드에서는 ADC가 연속적으로 데이터 레제스터를 샘플링하고 업데이트. 0이라면 프리런닝모드 종료
*	Bit 4 - ADIF (ADC Interrupt Flag) -- 1일때 ADC 변환이 완료되고 데이터 레지스터가 업데이트 되면 1이 됨. ADIE 비트가 1이고 SREG 레지스터의 비트가 1이면 ADC 변환종료 -> 인터럽트가 수행.
*										 0이라면 인터럽트가 벡터가수행되면 하드웨어적으로 0이 됨.
*	Bit 3 - ADIE (ADC Interrupt Enable) -- 1일때 SREG 레지스터의 I-비트가 1이고 이 비트가 1이면 ADC 변환종료 인터럽트가 활성화됨.
*	Bit 2:0 - ADPS (ADC Prescaler Select Bit) -- 분주비 결정
*/

}



unsigned short read_adc()

{

	unsigned char adc_low, adc_high;

	unsigned short value;

	ADCSRA |= 0x40;   //logical OR

	while ((ADCSRA & 0x10) != 0x10);//ADC 변환이 되었는지 검사

	

	adc_low = ADCL;		//변환된 LOW값인 ADCL 을 adc_low에 저장

	adc_high = ADCH;	//변환된 HIGH 값인 ADCH 를 adc_high에 저장

	value = (adc_high << 8) | adc_low;		// adc_high의 값을 8비트 왼쪽으로 쉬프트 하여 16비트로 만듬. 이 값이랑 adc_low값이랑 더함 (앞의 6자리는 쓰지않음)
							//이 더한값을 value에 저장.

	

	return value;		//value 값 반환

}



void show_adc(unsigned short value)	//main함수에서 value값을 받아 비교한 후 LED 를 나타내는 함수

{

	if (value < CDS_VALUE)	//만약 받아온 value 값이 CDS_VALUE 보다 작다면,,

	PORTA = 0xff;	//LED 8개 ON

	else
					//작지 않다면?
	PORTA = 0x00;	//LED 전부 OFF

}



int main(void)		//main 함수

{

	unsigned short value;	//변수 value

	DDRA= 0xff;		//LED 입/출력 설정

	init_adc();		//함수 init_adc 호출

	while (1)

	{

		value = read_adc();	//read_adc함수에서 반환된 value 값을 main함수 내의 변수 value에 저장

		show_adc(value);	//show_adc에 전에 저장한 값 value를 던짐

	}

}

 

'AVR 기초 > CDS' 카테고리의 다른 글

[AVR 기초] 밝기에 따른 LED  (0) 2020.07.13