求NTC热敏电阻与温度对照表
哪位大师有不同阻值负温度系数NTC热敏电阻与温度的对照表可分享?另外请教一下单片机怎样实现对NTC的温度转换?给你来一个。
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com---------------------------------------*/
/* --- QQ:800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
/*************功能说明 **************
本例程基于STC32G为主控芯片的实验箱进行编写测试。
使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。
edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。
读ADC和测温度.
用STC的MCU的IO方式驱动8位数码管。
使用Timer0的16位自动重装来产生1ms节拍,程序运行于这个节拍下,用户修改MCU主时钟频率时,自动定时于1ms.
左边4位数码管显示ADC2接的电压基准TL431的读数, 右边4位数码管显示温度值, 分辨率0.1度.
NTC使用1%精度的MF52 10K@25度.
测温度时, 使用12位的ADC值, 使用对分查找表格来计算, 小数点后一位数是用线性插补来计算的.
下载时, 选择时钟 24MHZ (用户可自行修改频率).
******************************************/
#include "..\..\comm\STC32G.h"
#include "stdio.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define MAIN_Fosc 24000000UL
/****************************** 用户定义宏 ***********************************/
#define Timer0_Reload (65536UL -(MAIN_Fosc / 1000)) //Timer 0 中断频率, 1000次/秒
/*****************************************************************************/
#define DIS_DOT 0x20
#define DIS_BLACK 0x10
#define DIS_ 0x11
/*************本地常量声明 **************/
u8 code t_display[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black- H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码
/*************本地变量声明 **************/
u8LED8; //显示缓冲
u8display_index;//显示位索引
bit B_1ms; //1ms标志
u16 msecond;
/*************本地函数声明 **************/
u16 get_temperature(u16 adc);
u16 Get_ADC12bitResult(u8 channel); //channel = 0~15
/**********************************************/
void main(void)
{
u8i;
u16 j;
WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x30; P0M0 = 0x30; //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
P1M1 = 0x38; P1M0 = 0x30; //设置P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.3 为 ADC 高阻输入口
P2M1 = 0x3c; P2M0 = 0x3c; //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V)
P3M1 = 0x50; P3M0 = 0x50; //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
P4M1 = 0x3c; P4M0 = 0x3c; //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
P5M1 = 0x0c; P5M0 = 0x0c; //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
P6M1 = 0xff; P6M0 = 0xff; //设置为漏极开路(实验箱加了上拉电阻到3.3V)
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
display_index = 0;
ADCTIM = 0x3f; //设置 ADC 内部时序,ADC采样时间建议设最大值
ADCCFG = 0x2f; //设置 ADC 时钟为系统时钟/2/16/16
ADC_CONTR = 0x80; //使能 ADC 模块
AUXR = 0x80; //Timer0 set as 1T, 16 bits timer auto-reload,
TH0 = (u8)(Timer0_Reload / 256);
TL0 = (u8)(Timer0_Reload % 256);
ET0 = 1; //Timer0 interrupt enable
TR0 = 1; //Tiner0 run
EA = 1; //打开总中断
for(i=0; i<8; i++)LED8 = 0x10; //上电消隐
while(1)
{
if(B_1ms) //1ms到
{
B_1ms = 0;
if(++msecond >= 300) //300ms到
{
msecond = 0;
// j = Get_ADC12bitResult(2);//参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误
//
// if(j < 4096)
// {
// LED8 = j / 1000; //显示ADC值
// LED8 = (j % 1000) / 100;
// LED8 = (j % 100) / 10;
// LED8 = j % 10;
// if(LED8 == 0) LED8 = DIS_BLACK;
// }
// else //错误
// {
// for(i=0; i<4; i++)LED8 = DIS_;
// }
j = Get_ADC12bitResult(3);//参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误
if(j < 4096)
{
/*
LED8 = j / 1000; //显示ADC值
LED8 = (j % 1000) / 100;
LED8 = (j % 100) / 10;
LED8 = j % 10;
if(LED8 == 0) LED8 = DIS_BLACK;
*/
j = get_temperature(j); //计算温度值
if(j >= 400) F0 = 0, j -= 400; //温度 >= 0度
else F0 = 1, j= 400 - j; //温度 <0度
LED8 = j / 1000; //显示温度值
LED8 = (j % 1000) / 100;
LED8 = (j % 100) / 10 + DIS_DOT;
LED8 = j % 10;
if(LED8 == 0) LED8 = DIS_BLACK;
if(F0)LED8 = DIS_; //显示-
}
else //错误
{
for(i=0; i<8; i++)LED8 = DIS_;
}
}
}
}
}
/**********************************************/
//========================================================================
// 函数: u16 Get_ADC12bitResult(u8 channel)
// 描述: 查询法读一次ADC结果.
// 参数: channel: 选择要转换的ADC.
// 返回: 12位ADC结果.
// 版本: V1.0, 2012-10-22
//========================================================================
u16 Get_ADC12bitResult(u8 channel)//channel = 0~15
{
ADC_RES = 0;
ADC_RESL = 0;
ADC_CONTR = (ADC_CONTR & 0xf0) | channel; //设置ADC转换通道
ADC_START = 1;//启动ADC转换
_nop_();
_nop_();
_nop_();
_nop_();
while(ADC_FLAG == 0); //wait for ADC finish
ADC_FLAG = 0; //清除ADC结束标志
return(((u16)ADC_RES << 8) | ADC_RESL);
}
//MF52E 10K at 25, B = 3950, ADC = 12 bits
u16 code temp_table[]={
140, //;-400
149, //;-391
159, //;-382
168, //;-373
178, //;-364
188, //;-355
199, //;-346
210, //;-337
222, //;-328
233, //;-319
246, //;-3010
259, //;-2911
272, //;-2812
286, //;-2713
301, //;-2614
317, //;-2515
333, //;-2416
349, //;-2317
367, //;-2218
385, //;-2119
403, //;-2020
423, //;-1921
443, //;-1822
464, //;-1723
486, //;-1624
509, //;-1525
533, //;-1426
558, //;-1327
583, //;-1228
610, //;-1129
638, //;-1030
667, //;-9 31
696, //;-8 32
727, //;-7 33
758, //;-6 34
791, //;-5 35
824, //;-4 36
858, //;-3 37
893, //;-2 38
929, //;-1 39
965, //;0 40
1003, //;1 41
1041, //;2 42
1080, //;3 43
1119, //;4 44
1160, //;5 45
1201, //;6 46
1243, //;7 47
1285, //;8 48
1328, //;9 49
1371, //;10 50
1414, //;11 51
1459, //;12 52
1503, //;13 53
1548, //;14 54
1593, //;15 55
1638, //;16 56
1684, //;17 57
1730, //;18 58
1775, //;19 59
1821, //;20 60
1867, //;21 61
1912, //;22 62
1958, //;23 63
2003, //;24 64
2048, //;25 65
2093, //;26 66
2137, //;27 67
2182, //;28 68
2225, //;29 69
2269, //;30 70
2312, //;31 71
2354, //;32 72
2397, //;33 73
2438, //;34 74
2479, //;35 75
2519, //;36 76
2559, //;37 77
2598, //;38 78
2637, //;39 79
2675, //;40 80
2712, //;41 81
2748, //;42 82
2784, //;43 83
2819, //;44 84
2853, //;45 85
2887, //;46 86
2920, //;47 87
2952, //;48 88
2984, //;49 89
3014, //;50 90
3044, //;51 91
3073, //;52 92
3102, //;53 93
3130, //;54 94
3157, //;55 95
3183, //;56 96
3209, //;57 97
3234, //;58 98
3259, //;59 99
3283, //;60 100
3306, //;61 101
3328, //;62 102
3351, //;63 103
3372, //;64 104
3393, //;65 105
3413, //;66 106
3432, //;67 107
3452, //;68 108
3470, //;69 109
3488, //;70 110
3506, //;71 111
3523, //;72 112
3539, //;73 113
3555, //;74 114
3571, //;75 115
3586, //;76 116
3601, //;77 117
3615, //;78 118
3628, //;79 119
3642, //;80 120
3655, //;81 121
3667, //;82 122
3679, //;83 123
3691, //;84 124
3702, //;85 125
3714, //;86 126
3724, //;87 127
3735, //;88 128
3745, //;89 129
3754, //;90 130
3764, //;91 131
3773, //;92 132
3782, //;93 133
3791, //;94 134
3799, //;95 135
3807, //;96 136
3815, //;97 137
3822, //;98 138
3830, //;99 139
3837, //;100140
3844, //;101141
3850, //;102142
3857, //;103143
3863, //;104144
3869, //;105145
3875, //;106146
3881, //;107147
3887, //;108148
3892, //;109149
3897, //;110150
3902, //;111151
3907, //;112152
3912, //;113153
3917, //;114154
3921, //;115155
3926, //;116156
3930, //;117157
3934, //;118158
3938, //;119159
3942 //;120160
};
/********************计算温度 ***********************************************/
// 计算结果: 0对应-40.0度, 400对应0度, 625对应25.0度, 最大1600对应120.0度.
// 为了通用, ADC输入为12bit的ADC值.
// 电路和软件算法设计: Coody
/**********************************************/
#define D_SCALE 10 //结果放大倍数, 放大10倍就是保留一位小数
u16 get_temperature(u16 adc)
{
u16 code *p;
u16 i;
u8j,k,min,max;
adc = 4096 - adc; //Rt接地
p = temp_table;
if(adc < p) return (0xfffe);
if(adc > p) return (0xffff);
min = 0; //-40度
max = 160; //120度
for(j=0; j<5; j++)//对分查表
{
k = min / 2 + max / 2;
if(adc <= p) max = k;
else min = k;
}
if(adc == p)i = min * D_SCALE;
else if(adc == p)i = max * D_SCALE;
else // min < temp < max
{
while(min <= max)
{
min++;
if(adc == p) {i = min * D_SCALE; break;}
else if(adc < p)
{
min--;
i = p; //min
j = (adc - i) * D_SCALE / (p - i);
i = min;
i *= D_SCALE;
i += j;
break;
}
}
}
return i;
}
/********************** 显示扫描函数 ************************/
void DisplayScan(void)
{
P7 = ~T_COM;
P6 = ~t_display];
if(++display_index >= 8) display_index = 0;//8位结束回0
}
/********************** Timer0 1ms中断函数 ************************/
void timer0 (void) interrupt 1
{
DisplayScan();//1ms扫描显示一位
B_1ms = 1; //1ms标志
}
视频教学:《STC32位8051单片机原理及应用》,200万大奖, 送实验箱; 冲哥版
各B值,对照表都不同, 每个厂家也多少有点差异,由配方和工艺差异决定的。 这种根据购买的传感器参数去找供应商要就好了,要是网上买的就注意组织和B值参数去网上找 送你一个NTC电阻的小工具,相信你会喜欢的
不同厂家的NTC在不同温度下的电阻值略有差异,虽然有公式可以计算,但是公式都有偏差,实际厂家出厂的时候会对每个型号和批次的进行全范围的测试,好的传感器会有0.0几度测试一次阻值,可以向他们要EXCEL表格,然后根据表格通过分压的公式去计算adc数值,可以去看下我的视频教程,关于NTC的那集,有详细说明 B值不一样的
我觉得只能参考而已。
xxkj2010 发表于 2024-2-22 08:54
我觉得只能参考而已。
根据你这个表,我做的10k的。大家可以参考一下。
关于NTC热电阻的标定之我的方式
10k NTC分压电阻10K
温度 电阻 ADC
-20 97120 2284908 68746 68746 137.492 137.492
-15 72980 2216162 82122 82122 164.244 164.244
-10 55340 2134040 95490 95490 190.98 190.98
-5 42340 2038550 108914 108914 217.828 217.828
0 32660 1929636 121186 121186 242.372 242.372
5 25400 1808450 131027 131027 262.054 262.054
10 19900 1677423 137343 137343 274.686 274.686
15 15710 1540080 140140 140140 280.28 280.28
20 12490 1399940 139163 139163 278.326 278.326
25 10000 1260777 136222 136222 272.444 272.444
30 8058 1124555 128705 128705 257.41 257.41
35 6532 995850 120050 120050 240.1 240.1
40 5326 875800 109615 109615 219.23 219.23
45 4368 766185 98915 98915 197.83 197.83
50 3602 667270 88040 88040 176.08 176.08
55 2986 579230 77530 77530 155.06 155.06
60 2488 501700 67800 67800 135.6 135.6
65 2082 433900 58800 58800 117.6 117.6
70 1751 375100
标定方式电阻箱
例子:
if (adc_average<=1399940 && adc_average>1260777)
{
wendu=200+(1399940-adc_average)/2783.26;
}
输入10K电阻测试时,ADC值 1261484-adc1261489
收←◆adc1261485
xsbl24.9
wendu24.9
收←◆adc1261489
xsbl24.9
wendu24.9
收←◆adc1261487
xsbl24.9
wendu24.9
收←◆adc1261484
xsbl24.9
wendu24.9
真实数据。STC棒棒的。不用放大器超准了。采集600个求平均
// 计算平均值 下面是采集的关键代码
adc_average = adc_calculate_average()*2525000/4096;
效果一会发图
总结一下。网上说了各种的方法。我认为都不可取。应该是结合软件和硬件才可以。硬件电路方面就是10k对10k分压。然后出现0~2.5伏给到AdC脚。然后用电阻箱给对应的电阻值测得相对应的Adc值。然后每隔五度进行线性标定。根据我的经验。测-20-70还是可以的。再高了或者低了可能效果就不好了。也就是说NPC测温度测温范围比较小。这样也容易比较准确。以上只是我自己的观点。希望对你有用。
页:
[1]
2