永发信息网

求助:AVR单片机ADC热敏电阻查测温度。要疯了

答案:2  悬赏:20  手机版
解决时间 2021-03-24 01:47
  • 提问者网友:人生佛魔见
  • 2021-03-23 13:44
10K热敏电阻测温。接法vcc-(10K电阻)-(热敏电阻)-GND。电阻分压法接AVR PA脚
我不知道程序出错在那里,调节温度(由高变低或者由低变低)测出来的温度变化变态的,由大变小再变大变小,有几段变的。要疯了
测温函数如下
#include<。。。。>
const unsigned long NTC_Tem_Table[90] PROGMEM= //热敏电阻 电阻电压 转换表
{
838,830,822,815,807,798,790,782,773,764, //-10~-1
755,746,737,728,719,709,700,690,680,670, //0~9
661,651,641,631,621,611,601,591,581,571, //10~19
561,551,541,531,521,512,502,492,483,473, //20~29
464,455,445,436,427,418,410,401,393,384, //30~39
376,368,360,352,344,337,329,322,315,307, //40~49
301,294,287,281,274,268,262,256,250,244, //50~59
238,233,228,222,217,212,207,202,198,193, //60~69
189,184,180,176,172,168,164,160,157,153 //70~79
};

uint16 ADC_Convert(uint8 ch) //ADC通道选择
{
uint8 i;
uint8 g_advalue[8]; //A/D转换缓冲区
uint16 ret=0;
uint8 max_id=1,min_id=1,max_val=0,min_val=0;
ADMUX=((1< //ADCSRA=_BV(ADEN); //使能ADC,单次转换模式

for(i=0;i<8;i++) //连续转换8次
{
ADCSRA|=_BV(ADSC);
loop_until_bit_is_set(ADCSRA,ADIF); // 等待AD转换结束
ADCSRA|=(1< g_advalue[i]=ADC;
}
ret=0;
for(i=1;i<8;i++)
{
ret+=g_advalue[i];
}
//找出最大值和最小值索引
ret/=7;
for(i=1;i<8;i++)
{
if(g_advalue[i]>ret)
{
if(g_advalue[i]-ret>max_val)
{
max_val=g_advalue[i]-ret;
max_id=i;
}
}
else
{
if(ret-g_advalue[i]>min_val)
{
min_val=ret-g_advalue[i];
min_id=i;
}
}
}
//去掉第一个、最大值和最小值后的平均值
ret=0;
for(i=1;i<8;i++)
{
if((i!=min_id)&&(i!=max_id))
ret+=g_advalue[i];
}
if(min_id!=max_id)
ret/=5;
else
ret/=6;
ADCSRA&=~(1< return ret;
}

//查表读取温度
char CH_Temp(uint8 c)
{
uint8 i;
uint8 temp;
uint16 v;
v=ADC_Convert(c);
for(i=0;i<91;i++)
{
if(v>=pgm_read_word(NTC_Tem_Table+i))
{
temp=i-10;
return temp;
}
}
temp=255;
return temp;
}
int main()
{
PORTA=0x00;
ADCSRA|=(1< ...
while(1)
{
//获取温度并显示
}
}

真的要找人帮帮忙了,自己一个人怎样看都不知道那里错。
先 谢谢了!
最佳答案
  • 五星知识达人网友:西岸风
  • 2021-03-23 13:51
呵呵,不知道有电子噪声吗,在热敏电阻上并个电容,不过你的程序我没看,应该是没错,建议用单次转换,转换几次后取平均值波动就小点了! 后来我看了下你转换8次再平均有点多了! 还有你串的电阻是否太大了点!
全部回答
  • 1楼网友:蓝房子
  • 2021-03-23 14:10
你好! 我现在也用的avr单片机进行电压数据采样,不过我处理方式是用中断方式,我是把采样过来的数据每个通道连续比较250次再取他的最大值,这样得到的值才能接近真实值,你不妨试试我这种方法,你用查询方式的话等待时间太多,可能会影响运行速度的。 如有疑问,请追问。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯