BASIC4MCU | 질문게시판 | atmega128 온도센서 선풍기 질문이요!!!!!!!!!!!
페이지 정보
작성자 녜진스 작성일2018-12-06 15:54 조회7,265회 댓글0건본문
atmega128과 avr 트레이닝 키트를 이용해서 온도에 따라(25도를 기준으로) 자동으로 선풍기(쿨링팬)가 꺼지고 켜지고 하도록 하고, 온도센서를 이용하여 온도가 7-segment에 표시 되도록 만드려고 합니다. 코드를 짜봤는데 온도가 7-segment에 표시되지 않고, 선풍기가 조건에 상관없이 돌아가기만 합니다. 코드 보고 무엇이 문제인지 수정좀 해주세요..
#include <avr/io.h>
#include <util/delay.h>#define PERIOD 50
#define DUTY_PERCENT 100#define PERIOD_1SEC (1000000L/(PERIOD*DUTY_PERCENT))
#define X0 0
#define X1 1
#define X2 2
#define X3 3
#define X4 4
#define X5 5
#define X6 6
#define X7 7unsigned int ADC_Temp=0;
unsigned int ADC_average=0;int ADC_Temperature=250;
struct NTC{
int temp;
unsigned long res;
};const struct NTC NTC10K[]={
{-50, 10240000}, {-40, 5120000}, {-30, 110881}, {-25, 86603},
{-20, 67683}, {-19, 64519}, {-18, 61519}, {-17, 58675}, {-16, 55976},
{-15, 53416}, {-14, 50986}, {-13, 48679}, {-12, 46488}, {-11, 44407},
{-10, 42431}, {-9, 40552}, {-8, 38766}, {-7, 37068}, {-6, 35454},
{-5, 33918}, {-4, 32456}, {-3, 31065}, {-2, 29741}, {-1, 28480},
{0, 27280}, {1, 26135}, {2, 25045}, {3, 24006}, {4, 23016},
{5, 22071}, {6, 21170}, {7, 20311}, {8, 19490}, {9, 18708},{10, 17960}, {11, 17247}, {12, 16565}, {13, 15914}, {14, 15291},
{15, 14697}, {16, 14128}, {17, 13584}, {18, 13064}, {19, 12567},{20, 12091}, {21, 11636}, {22, 11200}, {23, 10782}, {24, 10382},
{25, 10000}, {26, 9633}, {27, 9281}, {28, 8944}, {29, 8621},{30, 8312}, {31, 8015}, {32, 7730}, {33, 7456}, {34, 77194},
{35, 6942}, {36, 6701}, {37, 6468}, {38, 6246}, {39, 6032},{40, 5826}, {41, 5628}, {42, 5438}, {43, 5256}, {44, 5080},
{45, 4911}, {46, 4749}, {47, 4593}, {48, 4443}, {49, 4298},{50, 4159}, {51, 4025}, {52, 3896}, {53, 3771}, {54, 3652},
{55, 3536}, {56, 3425}, {57, 3318}, {58, 3215}, {59, 3115},{60, 3019}, {61, 2917}, {62, 2838}, {63, 2752}, {64, 2669},
{65, 2588}, {66, 2511}, {67, 2436}, {68, 2364}, {69, 2295},{70, 2227}, {71, 2162}, {72, 2100}, {73, 2039}, {74, 1980},
{75, 1924}, {76, 1869}, {77, 1816}, {78, 1765}, {79, 1715},{80, 1668}, {81, 1621}, {82, 1576}, {83, 1533}, {84, 1491},
{85, 1451}, {86, 1411}, {87, 1373}, {88, 1336}, {89, 1301},{90, 1266}, {91, 1232}, {92, 1200}, {93, 1168}, {94, 1138},
{95, 1108}, {96, 1080}, {97, 1052}, {98, 1025}, {99, 999},{100, 974}, {110, 758}, {120, 597}, {130, 475}
};unsigned char FND_Buffer[8];
unsigned char FND_Font[]={
0B11111100,
0B01100000,
0B11011010,
0B11110010,
0B01100110,
0B10110110,
0B10111110,
0B11100100,
0B11111110,
0B11110110
};void ADC_Read(unsigned char);
unsigned int ADC_10Read(unsigned char);
void FND_Display(void);
int ADC_CalTemp(unsigned long ADC_Value);
int main(void){
unsigned char fan=0;
DDRF=0B11111110;
DDRE=0B11111111;
DDRB=0B11111111;DDRA=0B11111111;
ADMUX=(0<<REFS1)|(1<<REFS0);
ADMUX|=0x00;ADCSR=(1<<ADEN);
ADCSR|=0x01;while(1){
ADC_average=ADC_10Read(0);PORTA=~(ADC_average>>8);
PORTC=~(ADC_average&0xFF);ADC_Temperature = ADC_CalTemp(ADC_average);
if(ADC_Temperature >= 270) {
fan=(0<<X5)|(1<<X4);
fan|=(1<<X6);
PORTA=fan;
}
else if(ADC_Temperature < 270) {
fan&=~(1<<X6);
PORTA=fan;}
else {
if(ADC_Temperature < 0) {
ADC_Temperature = -ADC_Temperature;
FND_Buffer[0] = 0x02;
}
else {
FND_Buffer[0] = 0x00;
}FND_Buffer[1] = FND_Font[(ADC_Temperature % 1000) / 100];
FND_Buffer[2] = FND_Font[(ADC_Temperature % 100) / 10];
FND_Buffer[2] |= 0X01;
FND_Buffer[3] = FND_Font[(ADC_Temperature % 10) / 1];
}
FND_Display();
}
return 1;
}
void ADC_Read(unsigned char chn){
ADMUX = (ADMUX & 0B11100000) | chn;
ADCSRA |= (1<<ADSC);
while((ADCSRA & 0X10) == 0);
ADC_Temp = (int)ADCL + ((int)ADCH << 8);
}
unsigned int ADC_10Read(unsigned char chn){
int cnt = 0;
unsigned int average = 0;
for(cnt = 0; cnt < 10; cnt++){
ADC_Read(chn);
average += ADC_Temp ;
}
average /= 10;return average;
}int ADC_CalTemp(unsigned long ADC_Value){
static int dis_temp;
unsigned char i;
long res, res_div, dif_temp;
if(ADC_Value <= 50) ADC_Value = 50;
else if(ADC_Value > 1022) ADC_Value = 1023;
res = (10000 * ADC_Value) / (1024 - ADC_Value);
for(i = 1; i < (sizeof(NTC10K) / sizeof(struct NTC)); i++){
if(NTC10K[i].res < res){
res_div = (NTC10K[i-1].res - NTC10K[i].res) / 10;
dif_temp = (NTC10K[i-1].res - res) / res_div;
dis_temp = (NTC10K[i-1].temp) * 10 + dif_temp;
return dis_temp;
}
else if(NTC10K[i].res == res){
dis_temp = (NTC10K[i].temp) * 10;
return dis_temp;
}
}
return dis_temp;
}
void FND_Display(void){
unsigned char i;
for(i = 0; i < 8; i++){
PORTE = ~(1 << i);
PORTB = FND_Buffer[i];
_delay_us(100);
}
}
댓글 0
조회수 7,265등록된 댓글이 없습니다.