아트메가/이론

아트메가128 센서제어하기(ADC제어) 2편

원원 2017. 7. 4. 17:47

안녕하세요. 실제로 ADC를 이용해여 조도센서의 값을 측정해보겠습니다.


아트메가128 센서제어하기(ADC제어) 1편

위의 사이트에 레지스터 설명이 있습니다.



조도센서로부터 값을 읽어서 컴퓨터 시리얼모니터로 볼 것입니다.


조도센서는 저항으로써 밝기에 따라 값이 변합니다. 밝으면 저항이 작아지고 어두우면 저항이 올라갑니다.


그림과 처럼 연결해줍니다. 전압분배법칙에 의해서 CDS의 값이 커지면(어두워지면) 전압이 커지게됩니다.(큰값이 감지됩니다.)



실제로 연결한 모습입니다.




연속변환모드를 사용했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "usart.h"
#define F_CPU 16000000UL
 
volatile char BUFF[100];
volatile unsigned char flag;


void adc_init()
{
    DDRF=0x00;
    ADCSRA=0xe7//1110 0111
    ADMUX=0x40;
}
 
 
int main(void)
{
   usart_init();
   adc_init();
   int i;
 
    while(1)
    { 
        i=ADC;
        sprintf(BUFF,"wowon.tistory.com : %d \n",i);
        USART0_str(BUFF);
        _delay_ms(1000);
    }
}
cs



usart.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
extern volatile unsigned char flag;
 
ISR(USART0_RX_vect)
{
    flag=UDR0;
}
 
 
void usart_init() 
{
 
    UCSR0A=0x00;
      UCSR0B=0x98;
      UCSR0C=0x06;
      UBRR0H=0;
      UBRR0L=103; 
    SREG=0x80;
}
 
void USART0_Transmit( char data )
{
    while(!(UCSR0A&0x20));
    UDR0 = data;
}
 
 
void USART0_str( char *str)
{
    while( *str )    
    USART0_Transmit(*str++);
}