cjtdz 发表于 2024-2-3 11:43:15

求NTC热敏电阻与温度对照表

哪位大师有不同阻值负温度系数NTC热敏电阻与温度的对照表可分享?另外请教一下单片机怎样实现对NTC的温度转换?

angmall 发表于 2024-2-3 11:53:57

给你来一个。

/*---------------------------------------------------------------------*/
/* --- 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标志
}

国学芯用 发表于 2024-2-3 11:58:48

视频教学:《STC32位8051单片机原理及应用》,200万大奖, 送实验箱; 冲哥版


NTC 发表于 2024-2-3 13:28:30

各B值,对照表都不同, 每个厂家也多少有点差异,由配方和工艺差异决定的。

咫尺天涯 发表于 2024-2-20 13:51:58

这种根据购买的传感器参数去找供应商要就好了,要是网上买的就注意组织和B值参数去网上找

daw85 发表于 2024-2-20 14:29:51

送你一个NTC电阻的小工具,相信你会喜欢的

电子DIY小家 发表于 2024-2-20 14:46:13

不同厂家的NTC在不同温度下的电阻值略有差异,虽然有公式可以计算,但是公式都有偏差,实际厂家出厂的时候会对每个型号和批次的进行全范围的测试,好的传感器会有0.0几度测试一次阻值,可以向他们要EXCEL表格,然后根据表格通过分压的公式去计算adc数值,可以去看下我的视频教程,关于NTC的那集,有详细说明

gentleman 发表于 2024-2-21 22:21:09

B值不一样的

xxkj2010 发表于 2024-2-22 08:54:36

我觉得只能参考而已。

qepuemc 发表于 2024-4-24 14:44:02

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
查看完整版本: 求NTC热敏电阻与温度对照表