专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
电桥测ntc,ad读到的值如何转换为温度
2020-01-26 12:49
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
6822
10
10
电桥测ntc,ad读到的值如何转换为温度?
MF 52 103 H 3435 F A
NTC热敏电阻 环氧系列 电阻值 阻值允差 B值 B值允差 B值类别
10KΩ ±5% 3435K ±1% B25/50
程序应该怎么写
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
lmt50211
1楼-- · 2020-01-26 13:54
本帖最后由 lmt50211 于 2013-10-31 13:57 编辑
uchar code table_temp[]=//定义温度数据表
{
42, 44, 45, 47, 49, 51, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 79,
81, 83, 85, 87, 90, 92, 94, 96, 99,101,103,106,108,110,112,115,117,119,122,124,
126,129,131,133,135,138,140,142,144,146,148,150,151,155,157,159,161,163,165,167,
169,171,173,174,176,178,180,182,183,185,187,188,190,191,193,194,196,197,199,200,
201,203,204,205,206,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223
};
//====================================================================
//=== 温度转换函数 ===//
void temp_process(void)
{
uchar i;
r_temp_adc=adc_conver(); //ADC转换
if(r_temp_adc>=223) //开路判断
{
r_temp_room=100;
}
else if(r_temp_adc<=42) //短路判断
{
r_temp_room=0;
}
else
{
while(r_temp_adc>=table_temp
)//比较采集AD值和表格温度点值,以判断出温度
{
i++;
}
r_temp_room=i; //查表计算温度值
}
}
这个方法精度比较低,表格也会比较大,但用于精度要求不高的地方还是很有优势的。
加载中...
gzhuli
2楼-- · 2020-01-26 18:14
基本参数:
B = 3435
R0 = 10K
T0 = 273.15 + 25
预先计算好常数:
r∞ = R0 * e^(-B / T0)
测出NTC电阻值R,通过下式即可换算为温度T:
T = B / ln(R / r∞) - 273.15
如果要求精度较高,还要对T做多点曲线拟合校正。
加载中...
cityfuture
3楼-- · 2020-01-26 19:11
gzhuli 发表于 2013-10-27 14:31
基本参数:
B = 3435
R0 = 10K
这个算法在单片机中是如何表达呢,有示例程序吗
加载中...
amxx
4楼-- · 2020-01-26 21:19
精彩回答 2 元偷偷看……
加载中...
techbaby
5楼-- · 2020-01-27 02:32
我都是查表的。
先在excel内算好电压对应的采样值(相隔1度),然后再做简单的线性计算。
加载中...
techbaby
6楼-- · 2020-01-27 05:36
/*
*******************************************************************************
* ntc对应采样电压值数组
*------------------------------------------------------------------------------
* 注释第一行:对应温度
*-------------------------------------------------------------------------------
* 测量温度范围定为-10℃-150℃(可能会有零点几的数据出入)
********************************************************************************
*/
static int16u code ntc_adc[] =
{
62454 , 61415 , 60359 , 59286 , 58199 , 57098 , 55985 , 54862 ,
53730 , 52592 , 51448 , 50302 , 49153 , 48005 , 46858 , 45715 ,
44576 , 43444 , 42320 , 41205 , 40101 , 39009 , 37930 , 36865 ,
35816 , 34783 , 33767 , 32769 , 31790 , 30829 , 29889 , 28968 ,
28068 , 27189 , 26331 , 25494 , 24678 , 23883 , 23110 , 22358 ,
21627 , 20916 , 20226 , 19557 , 18908 , 18279 , 17669 , 17078 ,
16506 , 15952 , 15416 , 14898 , 14396 , 13912 , 13444 , 12991 ,
12554 , 12132 , 11724 , 11331 , 10951 , 10584 , 10230 , 9889 ,
9559 , 9241 , 8935 , 8639 , 8353 , 8078 , 7813 , 7557 ,
7310 , 7072 , 6842 , 6620 , 6407 , 6201 , 6002 , 5810 ,
5625 , 5446 , 5274 , 5108 , 4948 , 4793 , 4644 , 4500 ,
4361 , 4227 , 4098 , 3973 , 3852 , 3735 , 3623 , 3514 ,
3409 , 3308 , 3210 , 3115 , 3024 , 2936 , 2850 , 2768 ,
2688 , 2611 , 2536 , 2464 , 2394 , 2327 , 2262 , 2198 ,
2137 , 2078 , 2021 , 1966 ,
};
#define NTC_ADC_ARRAY_NUM (sizeof(ntc_adc)/sizeof(int16u))
#define INDEX_MAX NTC_ADC_ARRAY_NUM-2 /* 数组下标的最大可用取值,对应 80℃采样值下标 */
#define INDEX_MIN 2 /* 数组下标的最小可用取值,对应-10℃采样值下标 */
#define TEMPER_REF -15 /* 温度基准点,即下标为0时对应的温度 */
#define TEMPER_LAST 100 /* 温度最后值,即数组最后一个对应的温度 */
/*
*******************************************************************************
* 函数名称: search_data()
* 输 入: search_value 查找基准值
* 输 出:
* 作 者:
* 日 期: 2010.08.11
* 功能描述: 二分查找adc采样值
*------------------------------------------------------------------------------
*注 意:
* 1. 返回值为查找表格中第一个小于查找值(search_value)的下标;
* 2. 查找值(search_value)大于查找表格中最大值时,返回1
* 查找值(search_value)小于查找表格中最小值时,返回查找表格数量,即最大下标+1
*******************************************************************************
*/
static int16u search_data(int16u search_value)
{
register int16u max = NTC_ADC_ARRAY_NUM - 1;
register int16u min = 1;
register int16u mid;
while(min <= max)
{
mid = (max + min) / 2;
if(search_value > ntc_adc[mid])
{
max = mid - 1;
}
else
{
min = mid + 1;
}
}
return min;
}
/*
*******************************************************************************
* 函数名称: temper_calc()
* 输 入: index 数组下标
* adc0_value ad滤波后的采样值
* 输 出: ntc温度测量值
* 作 者:
* 日 期: 2010.10.26
* 功能描述: 温度计算(分段线性插值算法)
*******************************************************************************
*/
static int16s temper_calc(int16u index, int16u adc0_value)
{
if (index > INDEX_MAX || index < INDEX_MIN)
{
return TEMPER_ERROR; // 返回错误采样温度
}
// else if (index < INDEX_MIN)
// {
// return -150; // 返回-15.0℃
// }
else
{
/*************************************************
=== 直线近似计算 ===
y1 = kx1+b x <-> adc_value
y2 = kx2+b y <-> temper
yn = kxn+b
y2 - y1 yn - y1
k = --------- = ---------
x2 - x1 xn - x1
(y2 - y1)*(xn - x1)
yn = --------------------- + y1
(x2 - x1)
*************************************************/
int16s temper;
temper = 10*(ntc_adc[index-1] - adc0_value); // 放大10倍,temper放大10倍
temper /= (ntc_adc[index-1] - ntc_adc[index]); // (xn - x1)
temper += 10*(index + TEMPER_REF - 1);
return temper;
}
}
/*
*******************************************************************************
* 函数名称: adc0_battery_temper_calc()
* 输 入: adc0_sample_num ad采样次数
* adc0_sample_sum ad采样总和
* 输 出:
* 作 者:
* 日 期: 2011.11.23
* 功能描述: 输出220V电压计算
*******************************************************************************
*/
void adc0_battery_temper_calc(int16u adc_value)
{
register int16s temper; // 温度值
register int16u index; // 查表下标值
index = search_data(adc_value); // 取温度数组下标
temper = temper_calc(index, adc_value); // 温度计算
battery_sample.battery_temper = temper;
}
复制代码
加载中...
1
2
下一页
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
东软载波ESF0654 PDS开发板串口USART0代码分享
1 个回答
普通32位单片机使用linux的应用代码
5 个回答
东软载波ESF0654 PDS开发板AT24C04的调试
9 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
uchar code table_temp[]=//定义温度数据表
{
42, 44, 45, 47, 49, 51, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 79,
81, 83, 85, 87, 90, 92, 94, 96, 99,101,103,106,108,110,112,115,117,119,122,124,
126,129,131,133,135,138,140,142,144,146,148,150,151,155,157,159,161,163,165,167,
169,171,173,174,176,178,180,182,183,185,187,188,190,191,193,194,196,197,199,200,
201,203,204,205,206,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223
};
//====================================================================
//=== 温度转换函数 ===//
void temp_process(void)
{
uchar i;
r_temp_adc=adc_conver(); //ADC转换
if(r_temp_adc>=223) //开路判断
{
r_temp_room=100;
}
else if(r_temp_adc<=42) //短路判断
{
r_temp_room=0;
}
else
{
while(r_temp_adc>=table_temp)//比较采集AD值和表格温度点值,以判断出温度
{
i++;
}
r_temp_room=i; //查表计算温度值
}
}
这个方法精度比较低,表格也会比较大,但用于精度要求不高的地方还是很有优势的。
B = 3435
R0 = 10K
T0 = 273.15 + 25
预先计算好常数:
r∞ = R0 * e^(-B / T0)
测出NTC电阻值R,通过下式即可换算为温度T:
T = B / ln(R / r∞) - 273.15
如果要求精度较高,还要对T做多点曲线拟合校正。
这个算法在单片机中是如何表达呢,有示例程序吗
先在excel内算好电压对应的采样值(相隔1度),然后再做简单的线性计算。
- /*
- *******************************************************************************
- * ntc对应采样电压值数组
- *------------------------------------------------------------------------------
- * 注释第一行:对应温度
- *-------------------------------------------------------------------------------
- * 测量温度范围定为-10℃-150℃(可能会有零点几的数据出入)
- ********************************************************************************
- */
- static int16u code ntc_adc[] =
- {
- 62454 , 61415 , 60359 , 59286 , 58199 , 57098 , 55985 , 54862 ,
- 53730 , 52592 , 51448 , 50302 , 49153 , 48005 , 46858 , 45715 ,
- 44576 , 43444 , 42320 , 41205 , 40101 , 39009 , 37930 , 36865 ,
- 35816 , 34783 , 33767 , 32769 , 31790 , 30829 , 29889 , 28968 ,
- 28068 , 27189 , 26331 , 25494 , 24678 , 23883 , 23110 , 22358 ,
- 21627 , 20916 , 20226 , 19557 , 18908 , 18279 , 17669 , 17078 ,
- 16506 , 15952 , 15416 , 14898 , 14396 , 13912 , 13444 , 12991 ,
- 12554 , 12132 , 11724 , 11331 , 10951 , 10584 , 10230 , 9889 ,
- 9559 , 9241 , 8935 , 8639 , 8353 , 8078 , 7813 , 7557 ,
- 7310 , 7072 , 6842 , 6620 , 6407 , 6201 , 6002 , 5810 ,
- 5625 , 5446 , 5274 , 5108 , 4948 , 4793 , 4644 , 4500 ,
- 4361 , 4227 , 4098 , 3973 , 3852 , 3735 , 3623 , 3514 ,
- 3409 , 3308 , 3210 , 3115 , 3024 , 2936 , 2850 , 2768 ,
- 2688 , 2611 , 2536 , 2464 , 2394 , 2327 , 2262 , 2198 ,
- 2137 , 2078 , 2021 , 1966 ,
- };
- #define NTC_ADC_ARRAY_NUM (sizeof(ntc_adc)/sizeof(int16u))
- #define INDEX_MAX NTC_ADC_ARRAY_NUM-2 /* 数组下标的最大可用取值,对应 80℃采样值下标 */
- #define INDEX_MIN 2 /* 数组下标的最小可用取值,对应-10℃采样值下标 */
- #define TEMPER_REF -15 /* 温度基准点,即下标为0时对应的温度 */
- #define TEMPER_LAST 100 /* 温度最后值,即数组最后一个对应的温度 */
- /*
- *******************************************************************************
- * 函数名称: search_data()
- * 输 入: search_value 查找基准值
- * 输 出:
- * 作 者:
- * 日 期: 2010.08.11
- * 功能描述: 二分查找adc采样值
- *------------------------------------------------------------------------------
- *注 意:
- * 1. 返回值为查找表格中第一个小于查找值(search_value)的下标;
- * 2. 查找值(search_value)大于查找表格中最大值时,返回1
- * 查找值(search_value)小于查找表格中最小值时,返回查找表格数量,即最大下标+1
- *******************************************************************************
- */
- static int16u search_data(int16u search_value)
- {
- register int16u max = NTC_ADC_ARRAY_NUM - 1;
- register int16u min = 1;
- register int16u mid;
- while(min <= max)
- {
- mid = (max + min) / 2;
- if(search_value > ntc_adc[mid])
- {
- max = mid - 1;
- }
- else
- {
- min = mid + 1;
- }
- }
- return min;
- }
- /*
- *******************************************************************************
- * 函数名称: temper_calc()
- * 输 入: index 数组下标
- * adc0_value ad滤波后的采样值
- * 输 出: ntc温度测量值
- * 作 者:
- * 日 期: 2010.10.26
- * 功能描述: 温度计算(分段线性插值算法)
- *******************************************************************************
- */
- static int16s temper_calc(int16u index, int16u adc0_value)
- {
- if (index > INDEX_MAX || index < INDEX_MIN)
- {
- return TEMPER_ERROR; // 返回错误采样温度
- }
- // else if (index < INDEX_MIN)
- // {
- // return -150; // 返回-15.0℃
- // }
- else
- {
- /*************************************************
- === 直线近似计算 ===
- y1 = kx1+b x <-> adc_value
- y2 = kx2+b y <-> temper
- yn = kxn+b
- y2 - y1 yn - y1
- k = --------- = ---------
- x2 - x1 xn - x1
- (y2 - y1)*(xn - x1)
- yn = --------------------- + y1
- (x2 - x1)
- *************************************************/
- int16s temper;
-
- temper = 10*(ntc_adc[index-1] - adc0_value); // 放大10倍,temper放大10倍
- temper /= (ntc_adc[index-1] - ntc_adc[index]); // (xn - x1)
- temper += 10*(index + TEMPER_REF - 1);
-
- return temper;
- }
- }
- /*
- *******************************************************************************
- * 函数名称: adc0_battery_temper_calc()
- * 输 入: adc0_sample_num ad采样次数
- * adc0_sample_sum ad采样总和
- * 输 出:
- * 作 者:
- * 日 期: 2011.11.23
- * 功能描述: 输出220V电压计算
- *******************************************************************************
- */
- void adc0_battery_temper_calc(int16u adc_value)
- {
- register int16s temper; // 温度值
- register int16u index; // 查表下标值
- index = search_data(adc_value); // 取温度数组下标
- temper = temper_calc(index, adc_value); // 温度计算
- battery_sample.battery_temper = temper;
- }
复制代码一周热门 更多>