온도센서


온도센서의 역할

온도는 원자 또는 분자가 가지고 있는 미세한 범위의 진동에너지 크기라고 할 수 있다. 이 물리적인 성질의 온도를 우리가 처리할 수 있도록 전기적인 데이터로 변환시켜 주는게 온도센서 이다.


온도센서 측정 방식

금속선이나 반도체의 저항값은 온도에 따라 변화하는 성질이 있는데, 그 변하는 저항값을 측정하여 온도를 구한다.


온도센서의 용도

말그대로 온도를 감지하는 모든곳에 쓰인다 불이 일어날 가능성이 있는곳 및 지하철 건물등 여러 용도로 쓰인다.


DK128-EXT2에서 LM35DZ(U2) 구조


트랜지스터 모양으로서 3개의 다리로 되있고 왼쪽핀 : +VS, 중간핀 : Vout, 오른쪽핀 : GND LM35센서에서는 2번핀으로 출력이 나오는데, 출력은 전압으로 나타내어지고, 출력 전압과 온도와의 관계는 다음과 같다.


LM35DZ의 특징

출력 전압 (0mV + 10.0mV/C) 예를 들어서 출력 전압이 50mV 라면

온도 = 50mV / 10mV = 5, 즉 5도가 된다. 출력전압을 10mV로 나누게 되면 그 값이

온도가 되는 것이다.(10mV당 섭씨 1도) 이렇게 해서 섭씨0~100도까지 측정가능하다 실제로는 150도까지도 측정이 가능하다고 하고 화씨온도를 섭씨온도로 변환할 필요 없이 바로 섭씨온도 측정이 가능 하다고 한다. 그리고 선형그래프로 표시, 4V~30V다양한 전압사용 가능, 저렴한가격, 자체발열량이 적다.


본문


ADC모듈을 써야되기 때문에 ATmaga128부분 에서는 F포트를 사용하게 된다.

F핀중에 60번 59번이 PF1(ADC1) PF2(ADC2)이기 때문이다.

ADC1번을 TMP_OUT1으로 지정하고 ADC2번을 TMP_OUT2로 지정 한다.

TMP_OUT1은 온도 변화에 따라 0~1V의 출력 전압범위를 가지며 ADC모듈로 입력됬을경우 5V/1024(10bit) 출력값의 범위는 0~204(204.8)까지만 출력하게된다.

TMP_OUT2는 LM324라는 증폭소자이용 5배를 증폭시켜서 출력 전압값범위가 아까 TMP_OUT1보다 5배인 0~5V가된다 그러므로 0~1024까지 모두 사용할수있기 때문에

100도를 감지하는센서에서 X도 일 경우 100:X로 표기가 가능하다.

보통의 경우에는 회로에 나와 있듯이 증폭기 LM324가 달린TMP_OUT2를 이용해서 측정을 하지만 50도인 경우에는 TMP_OUT2번 같은경우에는 오버플로우가 발생해서 오류를 일으키므로 증폭이 안된 TMP_OUT1번을 사용하면된다.


온도 계산식


최대 감지 온도 : 현재 온도 = ADC 최대값 : ADC 결과값

100 : X = 1024 : Y


1000 : X = 1024 : Y

1024 * X = 1000 * X

X = (1000 * Y) / 1024

X = (125 * Y) / 128 (둘다 8로 나누어서 간단하게 표기)



TMP_OUT1(ADC1번 60번핀)을 J2커넥터 5번에 연결하고

TMP_OUT2(ADC2번 59번핀)을 J2커넥터 6번에 연결해준다.


소스분석

ex5.1.h


#include <avr/io.h>

#include <avr/interrupt.h>

#include <stdlib.h>

#define CPU_CLOCK 16000000

#define BAUD_RATE 19200

#define BAUD_RATE_L (CPU_CLOCK / (16l * BAUD_RATE)) - 1

#define BAUD_RATE_H ((CPU_CLOCK / (16l * BAUD_RATE)) - 1) >> 8

//위에는 기본 헤더파일


#include "EXT2_ex5_1.h"

// 1 byte 전송 함수

void uart_send_byte(unsigned char byte)

// 전송 버퍼가 빌 때까지 기다린다.

while (!(UCSR1A & (1 << UDRE1)));


UDR1 = byte;

}

// return 문자 전송 함수

void uart_send_return(void)

{

uart_send_byte('\n');

uart_send_byte('\r');

}

// 공백문자(space) 전송 함수

void uart_send_space(void)

{

while (!(UCSR1A & (1 << UDRE1)));

UDR1 = 0x20;

}

// 문자열 전송 함수

void uart_send_string(unsigned char *str, unsigned char len)

{

int i;

for (i = 0; i < len; i++)

{

if (!(*(str + i)))

{

break;

}

uart_send_byte(*(str + i));

}


}

// 딜레이 루틴

void m_delay(unsigned int m)

{

unsigned int i,j;

cli();

for(i=0;i<m;i++)

for(j=0;j<2650;j++); // 16MHz : 1msec

sei();

}

// 온도센서의 증폭되지 않은 값을 출력

void tmp_out_1(void)

{

unsigned char buf[5];

int int_buf = 0;

// ADMUX = (01 0 00001), AVCC를 레퍼런스로사용, 채널 1

ADMUX = (0<<REFS1) | (1<<REFS0) | (1<<MUX0); // 채널 1 선택

ADCSR |= 0x40; // ACD Start Conversion

while((ADCSR & 0x10) == 0); // ADC의 변환이 종료될때까지 대기

int_buf += ADCL + ADCH * 256; // 결과값을 int_buf 에 저장

itoa(int_buf, buf, 10);

uart_send_string(buf, sizeof(buf)); // 시리얼 통신상으로 출력

}

// ADC 초기화

void adc_init(void)

{

DDRF &= 0x00; // F 포트 입력 설정

// ADMUX = (01 0 00001), AVCC를 레퍼런스로사용, 채널 1

ADMUX = (0<<REFS1) | (1<<REFS0) | (1<<MUX0);


// ADCSR = (1000 0 111), ADC enable, 128분주

ADCSR = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);

}

// 시리얼 통신(UART) 초기화

void uart_init(void)

{

// baud rate 설정

UBRR1L = (unsigned char)BAUD_RATE_L;

UBRR1H = (unsigned char)BAUD_RATE_H;

// no parity, 1 stop bit, 8bit 설정

UCSR1C = (0 << UPM1) | (0 << UPM0) | (0 << USBS) |

(1 << UCSZ1) | (1 << UCSZ0);

// Tx, Rx Enable, 8bit 설정

UCSR1B = (1 << TXEN) | (1 << RXEN) | (0 << UCSZ2);

}

int main(void)

{

adc_init(); // ADC 초기화

uart_init(); // LED 포트 초기화

while(1){

m_delay(1000);

tmp_out_1();

uart_send_space();

tmp_out_2();


uart_send_return();

m_delay(1000);

}

return 1;

}



이 소스는 현재 사용 포트는 PF1(AD1:60번핀), PF2(AD2:59번핀)을 사용하고있고

현재 연결상태는 PF1(AD1:60번핀) - TMP_OUT_1(J2:5번핀) PF2(AD2:59번핀) - TMP_OUT_2(J2:6번핀)에 연결되어 있다


우선 11~18행에 1바이트 전송함수를 만들어서 전송버퍼가 빌때까지 기다린다음 20~25행에 터미널상 개행문자를 표기하기위해 함수를 생성하고 29~34행에 터미널상 공백 문자를 표시하기 위해 함수를 생성한다. 그다음 38~50행사이 문자열을 전송하는 함수를 넣는데 공백(NULL)을 만나면 중단하게되고 전송할 문자열의 시작주소와 크기를 인자로 받은다음에 1바이트씩 전송해준다 54~63행은 딜레이를 줘서 ms단위의 시간지연을 만들기위해서 만들어진 함수이다. 68~84행은 온도 센서에서 증폭되지 않은 값을 출력하기 위한 함수이다.

TMP_OUT_1으로 통하게 되고 나중에 TMP_OUT_1값을 출력하게 된다. 88~105행은 이제 TMP_OUT_2 즉 증폭된값을 출력하기위해 만든 함수이다. 111~117행 사이는 일단 ADC가 F포트에 있으므로 입력을 으로 설정한다음에 AVCC(아날로그 전압)를 레퍼런스전압 으로 사용하도록 설정한후 채널을 선택하게 되는데 60번핀인 PF1(ADC1)으로 설정해준뒤 ADC를 Enable(ADEN)-(장애를 제거하여 사용 가능한 또는 작동 가능한 상태로 만드는 것. 흔히 어떤 시스템이나 프로그램을 시동시키거나 능력을 회복시키는 것을 말한다) 시키고 분주비(일정한 시간에 얼마나 많은 데이터를 읽어올 수 있는 지에 대한 체크타임)를 128로 설정을 한다 122~134행은 UART(범용 비동기화 송수신) 통신부분이다 142~152행 부분은 폴링(단말 제어 장치 따위에서 여러 개의 단말 장치에 대하여 순차적으로 송신 요구의 유무를 문의하고, 요구가 있을 경우에는 그 단말 장치에 송신을 시작하도록 지령하며, 없을 때에는 다음 단말 장치에 대하여 문의하는 전송 제어 방식) 방식으로 1초에 1번씩 센서의 두가지 출력을 하이퍼 터미널 상으로 출력해주는 부분이다.


결과


PF1(AD1:60번핀) - TMP_OUT_1(J2:5번핀)

PF2(AD2:59번핀) - TMP_OUT_2(J2:6번핀) 두 군데에 연결되어 있고

F포트 쪽에 입력을 연결한 뒤 TMP_OUT_1은 온도센서의 증폭되지 않은 값을 TMP_OUT_2는 온도센서의 증폭된 값을 1초에 1번씩 하이퍼터미널상으로 출력하여주게 된다.

'컴퓨터 > c관련 숙제' 카테고리의 다른 글

dk128 과제  (0) 2013.12.29
노드 입력 후 부자노드 찾기  (0) 2013.12.29
조도센서 부분작동  (0) 2013.12.29
조도센서 관련 파일  (0) 2013.12.29
c로배우는 자료구조 8장-5번~6번문제  (0) 2013.12.29
by 리베리온 2013. 12. 29. 23:29