- 打卡等级:偶尔看看III
- 打卡总天数:42
- 最近打卡:2025-06-29 14:58:57
注册会员
- 积分
- 188
|
发表于 2025-5-4 09:48:18
|
显示全部楼层
第20集 ADC_NTC测温
ADC有多种用途,比如测光线(光亮度),测声音,测气体(CO,CO2),测温度,测电流
NTC:Negative Temperature Coefficient 负温度系数热敏电阻。
注意:ADC引脚要高阻输入,P51供电时,配置为推挽输出;
因时间关系,冲哥在查表时,显示有点异常。我用递归函数优化二分法。如下:
/*
递归函数查询,优化二分法
数组NTC_Value用于存放NTC的阻值对温度的对应关系
为简化处理,这个3代表25℃,7代表26℃,33代表34℃
阻值应该程指数关系,而不是递差数列,故意使用随机数数列,从小到大排列
为简化运算,这里只显示25-34这10个温度数。
若ADC读取到4,5,6,均表示25.5℃,
为方便显示,不使用浮点数,温度显示值会乘10.比如25℃显示250,25.5℃显示255
NTC_Temp_Read函数中,adc是读取到的NTC值,
a表示NTC阻值数组中查询范围的下限,
b表示NTC阻值数组中查询范围的上限
*/
u8 NTC_Value[]={3,7,8,11,14,25,26,27,29,33};//定义NTC阻值数组
u16 NTC_Temp_Read(u8 adc,u8 a,u8 b)
{
u8 min=a; //替换下限,因为要回调函数本身,区分形参与实参
u8 max=b; //替换上限
if( adc < NTC_Value[0]) //判断读取的NTC阻值是否超温度对应阻值的下限
return 0xfffe;
else if(adc > NTC_Value[9])
return 0xffff; //判断读取的NTC阻值是否超温度对应阻值的上限
else if(adc == NTC_Value[min])
return ((min+25)*10); //判断读取的NTC阻值是否刚好等于温度对应阻值的下限
else if(adc == NTC_Value[max])
return ((max+25)*10); //判断读取的NTC阻值是否刚好等于温度对应阻值的上限
else if((max - min) == 1) //判断是否刚好处于两个相邻温度对应的阻值中间
return ((min+25)*10+5); //如果是,返回(相对较低温度+0.5)
else
{
if( adc == NTC_Value[(u8)((min+max)/2+0.5)]) //如果读取的NTC阻值刚为查询范围内的中间值,+0.5的效果等同于四舍五入
return (((u8)((min+max)/2+0.5)+25)*10); //返回中值对应的温度
else if( adc < NTC_Value[(u8)((min+max)/2+0.5)]) //如果读取的NTC阻值小于查询范围内的中间值
{
max=(u8)((min+max)/2+0.5); //更新上限,+0.5的效果等同于四舍五入
NTC_Temp_Read(adc,min,max); //回调此函数
}
else if( adc > NTC_Value[(u8)((min+max)/2+0.5)]) //如果读取的NTC阻值大于查询范围内的中间值,
{
min=(u8)((min+max)/2+0.5); //更新下限,+0.5的效果等同于四舍五入
NTC_Temp_Read(adc,min,max); //回调此函数
}
}
}
|
|