본문 바로가기
코스웨어/15년 스마트컨트롤러

20150902 20번 천정호

by 알 수 없는 사용자 2015. 9. 3.
728x90
반응형

NTC 서미스터를 이용한 온도계


ATmega2560 ADC0은 97번핀부터 ADC15 82번핀까지 구성되어있다.

현재 연결은 ADC0 97번핀에 연결이 되어있다.

연결방법은 ADC0번에 10K 저항을 연결하고 같은 핀라인에 NTC 서미스터를 연결한다.

저항을 연결하고 NTC 서미스터를 연결하는 이유는 ADC에서 나오는 전압값을 조절하기 위해서인데 ADC에서 나오는 전압을 10K 저항으로 줄여주고

그 줄여진 값을 NTC 서미스터가 받아 코드부분에서 온도값을 계산한다.

NTC 서미스터 출력값은 0 ~ 1023으로 출력이 되므로 그에 따른 공식은 (출력값 / 6.4) - 55로 계산이 된다.


ADC와 저항, NTC 서미스터 그리고 LCD의 전체적인 연결 구성


연결 후 코드의 삽입까지 마치면 NTC 서미스터에서 받은 값을 계산하여 LCD에 출력하게 된다.



코드


main.c

#include "LCD.h"

#include <avr/io.h>

#include <stdlib.h>

#include <util/delay.h>


// NTC 서미스터 출력값에 따른 온도값

/* const unsigned int ad_table[] = {

991,989,987,985,983,980,978,975,973,970, //-40'C ~-31'C

966,963,960,957,953,949,945,941,937,932, //-30'C ~-21'C

927,922,918,912,907,900,895,889,882,875, //-20'C ~-11'C

868,861,854,847,839,830,822,814,806,796, //-10'C ~ -1'C


786,778,769,759,749,737,728,718,707,696, //  0'C ~  9'C

684,674,663,652,640,627,617,606,595,582, // 10'C ~ 19'C

569,559,548,536,524,511,501,490,478,466, // 20'C ~ 29'C

454,444,434,423,411,400,390,381,370,360, // 30'C ~ 39'C

349,341,332,322,313,303,295,287,279,270, // 40'C ~ 49'C

262,254,247,240,232,225,219,212,206,199, // 50'C ~ 59'C

193,187,182,176,170,165,160,155,151,146, // 60'C ~ 69'C

141,137,133,129,124,120,117,113,110,106, // 70'C ~ 79'C

103,100, 97, 94, 91, 88, 85, 83, 80, 78, // 80'C ~ 89'C

75, 73, 71, 69, 66, 64, 62, 61, 59, 57, // 90'C ~ 99'C

55, 53, 50, 47, 44, 42, 41, 41, 41, 41, //100'C ~109'C

41, 40, 39, 38, 36, 35, 34, 33, 32, 32, //110'C ~119'C

31 };

*/


void ADC_Init() {

ADCSRA = 0x85; // Enable ADC - 분주비 32

ADCSRB = 0x00; // Free Running Mode

ADMUX = 0x40; // Select ADC Input 0

}


int main(void) {

int Count;

char Buf[10];

unsigned int Sum = 0;


LCD_Init();

ADC_Init();


LCD_Print("  Current Temp.");


while (1) {

_delay_ms(1000);

ADCSRA = 0xD5;


while ((ADCSRA & 0x10) != 0x10);


Sum = 0;

for (Count = 0; Count < 16; Count++) {

ADCSRA = 0xD5;

while ((ADCSRA & 0x10) != 0x10);

Sum += ((int)ADCL + ((int)ADCH << 8));

}


Sum >>= 4; // 아날로그 출력신호의 불안정값을 줄이기 위하여 여러번 값을 받고 평균을 내준다.

Sum = (Sum / 6.4) - 55; // 온도센서 출력값으로 도씨온도 구하는 공식


itoa(Sum, Buf, 10); // 정수형을 문자형으로 변경


LCD_Inst(0xC0);

LCD_Print("      ");

LCD_Print(Buf);

LCD_Data('C');

_delay_ms(1000);

}

return 0;

}



LCD.c

#include "LCD.h"

#include <avr/io.h>


#define Delay(x) for(uiCnt = 0; uiCnt < x; ++uiCnt);


void LCD_AVR_PIN_INIT(void) {

// DataBus 모두를 사용하기 위하여 0XFF로 값을 준다.

LCD_BUS_DDR = 0XFF;


// HeaderFile에서 RS 0, RW 1, EN 2의 값을 넣었다.

// 그 값을 기본으로 하여 (0001 << 0) | (0001 << 1) | (0001 << 2)설정하여 값을 지정한다.

// LCD_CTL_DDR 0x07의 설정과 같다.

LCD_CTL_DDR = (1 << LCD_PIN_RS) | (1 << LCD_PIN_RW) | (1 << LCD_PIN_EN);


return;

}


void LCD_Inst(unsigned char ucinst) {


volatile unsigned int uiCnt;


LCD_BUS = ucinst;


// RS를 Low으로 설정하면 Instruction Reg으로 전송 High로 설정하면 Data Reg로 전송이 된다.

// RW를 Low로 지정하면 Write High로 설정하면 Read로 설정이 된다.

// Enable을 Low로 설정하면 데이터 전송 X, High로 설정하면 데이터 전송 O => 현재는 데이터 전송 비활성화

LCD_CTL = (0 << LCD_PIN_RS) | (0 << LCD_PIN_RW) | (0 << LCD_PIN_EN);


// 설정의 적용이 바로 이루어지지 않기 설정이 적용되기까지의 시간 40ns로 지연시킨다.

Delay(500);


// Enable을 High로 설정하여야지 AVR -> LCD로 데이터의 전송이 이루어진다.

LCD_CTL = (0 << LCD_PIN_RS) | (0 << LCD_PIN_RW) | (1 << LCD_PIN_EN);


// Tw(230) - Tsu2(80) = 150 E가 활성화 된 후 BUS를 통하여 데이터가 전송되는 시간이다.

Delay(500);


// RS를 Low으로 설정하면 Instruction Reg으로 전송 High로 설정하면 Data Reg로 전송이 된다.

// RW를 Low로 지정하면 Write High로 설정하면 Read로 설정이 된다.

// Enable을 Low로 설정하면 데이터 전송 X, High로 설정하면 데이터 전송 O => 현재는 데이터 전송 비활성화

LCD_CTL = (0 << LCD_PIN_RS) | (0 << LCD_PIN_RW) | (0 << LCD_PIN_EN);


// 설정의 적용이 바로 이루어지지 않기 설정이 적용되기까지의 시간 40ns로 지연시킨다.

Delay(500);


return;

}


void LCD_Data(unsigned char ucinst) {


volatile unsigned int uiCnt;


LCD_BUS = ucinst;


// RS를 Low으로 설정하면 Instruction Reg으로 전송 High로 설정하면 Data Reg로 전송이 된다.

// RW를 Low로 지정하면 Write High로 설정하면 Read로 설정이 된다.

// Enable을 Low로 설정하면 데이터 전송 X, High로 설정하면 데이터 전송 O => 현재는 데이터 전송 비활성화

LCD_CTL = (1 << LCD_PIN_RS) | (0 << LCD_PIN_RW) | (0 << LCD_PIN_EN);


// 설정의 적용이 바로 이루어지지 않기 설정이 적용되기까지의 시간 40ns로 지연시킨다.

Delay(500);


// Enable을 High로 설정하여야지 AVR -> LCD로 데이터의 전송이 이루어진다.

LCD_CTL = (1 << LCD_PIN_RS) | (0 << LCD_PIN_RW) | (1 << LCD_PIN_EN);


// Tw(230) - Tsu2(80) = 150 E가 활성화 된 후 BUS를 통하여 데이터가 전송되는 시간이다.

Delay(500);


// RS를 Low으로 설정하면 Instruction Reg으로 전송 High로 설정하면 Data Reg로 전송이 된다.

// RW를 Low로 지정하면 Write High로 설정하면 Read로 설정이 된다.

// Enable을 Low로 설정하면 데이터 전송 X, High로 설정하면 데이터 전송 O => 현재는 데이터 전송 비활성화

LCD_CTL = (0 << LCD_PIN_RS) | (0 << LCD_PIN_RW) | (0 << LCD_PIN_EN);


// 설정의 적용이 바로 이루어지지 않기 설정이 적용되기까지의 시간 40ns로 지연시킨다.

Delay(500);


return;

}


// LCD의 지정사용을 위하여 외부 접근을 금지시킨다.

void LCD_Init(void) {

volatile unsigned int uiCnt;


LCD_AVR_PIN_INIT();


Delay(65000);


LCD_Inst(LCD_INST_FUNC);

LCD_Inst(LCD_INST_DSP);

LCD_Inst(LCD_INST_ENT);

LCD_Inst(LCD_INST_CUR);

LCD_Inst(LCD_INST_CLR);

LCD_Inst(LCD_INST_HOME);


return;

}


// 문자 하나가 아닌 문자열을 출력하기위하여 함수 선언

void LCD_Print(const unsigned char * cstring) {


// 문자열의 끝이 NULL 일때까지 반복

while (*cstring != 0) {

// 문자열의 첫 번째 주소의 값부터 출력

LCD_Data(*cstring);

// 문자열의 주소를 증가

++cstring;

}

return;

}




LCD.h

#ifndef __LCD_H__

#define __LCD_H__


#include <avr/io.h>


// PORT 입력 설정

#define LCD_BUS PORTC

#define LCD_BUS_DDR DDRC

#define LCD_CTL PORTG

#define LCD_CTL_DDR DDRG


// PIN 설정

#define LCD_PIN_RS 0

#define LCD_PIN_RW 1

#define LCD_PIN_EN 2


// LCD 화면 설정

#define LCD_INST_CLR 0X01 // LCD Clear 설정

#define LCD_INST_HOME 0X02 // LCD 포인터를 가장 처음으로 이동

#define LCD_INST_ENT 0X06 // Shfit ON, INCRIGE MODE => I/D = 1, S = 0

#define LCD_INST_DSP 0X0F // Display의 ON / OFF를 지정, 커서 표시, 커서의 깜박임 표시

#define LCD_INST_CUR 0X14

#define LCD_INST_FUNC 0X38 // D/L : Interface Data의 길이를 8Bit/4Bit 설정, N : 2Line / 1Line 설정, Font의 Type을 지정 5x10 / 5x8


void LCD_Init(void);

void LCD_Data(unsigned char);

void LCD_Print(const unsigned char *);

void LCD_INST(unsigned char);


#endif //__LCD_H__


File Download

LCD.c


LCD.h


main.c



728x90