글
온도센서
온도센서의 역할
온도는 원자 또는 분자가 가지고 있는 미세한 범위의 진동에너지 크기라고 할 수 있다. 이 물리적인 성질의 온도를 우리가 처리할 수 있도록 전기적인 데이터로 변환시켜 주는게 온도센서 이다.
온도센서 측정 방식
금속선이나 반도체의 저항값은 온도에 따라 변화하는 성질이 있는데, 그 변하는 저항값을 측정하여 온도를 구한다.
온도센서의 용도
말그대로 온도를 감지하는 모든곳에 쓰인다 불이 일어날 가능성이 있는곳 및 지하철 건물등 여러 용도로 쓰인다.
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 |
RECENT COMMENT