1. 회로

- PORTF3/2 : 온도 센서 Input Vcc/GND
- PORTD.6 : GND
2. 프로그램 설계
- 온도 센서는 스마트홈에서 알람이 끝난 후 외출하기 전 밖의 온도를 나가기 위함으로 타이머가 끝나면 온도 센서의 값을 받아오기 시작합니다.
[FND 필요 기능]
온도 센서 동작 | 타이머 끝난 후 동작하기 위해 플래그를 통해 타이머가 끝나는 것을 기다립니다. |
타이머 동작 중인 플래그(isRunning) 뿐만 아니라 타이머가 끝났다는 플래그(isTimerDone)도 있어야합니다. |
3. 동작 방식
- 온도센서는 아날로그 신호를 받는 소자입니다.
- ADC변환을 해주어야 하며 주요 성능은 샘플링 주파수와 분해능에 의해 결정됩니다.
- MUX를 사용하므로 Atmega128에 존재하는 8개의 채널을 동시 사용이 불가능하고 그 중 1개만 사용 가능합니다.
- LM35는 차동입력이며 타이머가 끝난 후에만 동작하도록 하였습니다..
4. 프로그램
[adc.c]
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
|
#include "lcd.h"
#include "header.h"
#include "adc.h"
void Init_adc(void)
{
ADCSRA = 0x00;
ADMUX = ADC_AVCC_TYPE | (0 << ADLAR) | (0 << MUX0);
ADCSRA = (1<<ADEN) | (1<<ADFR) | (3<<ADPS0);
}
unsigned int Read_ADC_Data_Diff(unsigned char adc_mux)
{
unsigned int ADC_Data = 0;
if(adc_mux < 8)
return 0xFFFF;
ADMUX &= ~(0x1F);
ADMUX |= (adc_mux & 0x1f);
ADCSRA |= (1<<ADSC);
while(!(ADCSRA & (1<< ADIF)));
ADC_Data = ADCL;
ADC_Data |= ADCH << 8;
return ADC_Data;
}
|
[adc_activate.c]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include "header.h"
#include "lcd.h"
#include "adc.h"
#include <stdio.h>
void lm35()
{
int temp_adcRaw = 0;
float adcmilliVoltage = 0;
float Celsius = 0;
char message[50] ={0, };
char message2[50] = {0, };
temp_adcRaw = Read_ADC_Data_Diff(0b01101);
adcmilliVoltage = ( (( (float)temp_adcRaw * 5000) / 512) /10);
Celsius = adcmilliVoltage / 20;
sprintf(message, "RawData: %04d ", temp_adcRaw);
sprintf(message2, "Temp(deg) : %2d.%2d ", (int)Celsius, (int)(Celsius * 100) % 100);
disp_some(message1, message2 , 0);
}
|
6. 결과

'C (Atmega128)' 카테고리의 다른 글
5. 불꽃 감지 센서 및 모터 개발 (0) | 2022.02.27 |
---|---|
4. 조도 센서 (KY-018) (0) | 2022.02.27 |
2. FND & Timer (0) | 2022.02.26 |
1. LCD (0) | 2022.02.26 |
스마트 홈 프로젝트 - 0 (0) | 2022.02.26 |