本帖最后由 eyancool 于 2023-4-5 17:18 编辑
NTC热敏电阻是常用的温度检测元件,电阻值会随着温度升高而减小.我们选用NTC热敏电阻时,厂家会提供一张温度特性表,里面有温度与电阻值的对应关系.
知道了温度和阻值的关系,我们借用网上找的一张计算表格,代入温度和阻值两个数据.
硬件电路图
NTC查表方式说明,把温度和ADC采样值做成两个数组存放,每隔1秒钟读取ADC数据,然后逐一比较ADC数组里的大小关系.
#define NTC_LEN 241
const uint16_t NTC_TAB[NTC_LEN]={
0xE7B,/*-20℃*/ 0xE71,/*-19.5℃*/ 0xE67,/*-19℃*/ 0xE5C,/*-18.5℃*/ 0xE51,/*-18℃*/ 0xE46,/*-17.5℃*/
0xE3B,/*-17℃*/ 0xE30,/*-16.5℃*/ 0xE24,/*-16℃*/ 0xE18,/*-15.5℃*/ 0xE0C,/*-15℃*/ 0xE00,/*-14.5℃*/
0xDF3,/*-14℃*/ 0xDE7,/*-13.5℃*/ 0xDDA,/*-13℃*/ 0xDCD,/*-12.5℃*/ 0xDBF,/*-12℃*/ 0xDB2,/*-11.5℃*/
0xDA4,/*-11℃*/ 0xD96,/*-10.5℃*/ 0xD88,/*-10℃*/ 0xD79,/*-9.5℃*/ 0xD6A,/*-9℃*/ 0xD5B,/*-8.5℃*/
0xD4C,/*-8℃*/ 0xD3D,/*-7.5℃*/ 0xD2D,/*-7℃*/ 0xD1E,/*-6.5℃*/ 0xD0D,/*-6℃*/ 0xCFD,/*-5.5℃*/ 0xCED,/*-5℃*/
0xCDC,/*-4.5℃*/ 0xCCB,/*-4℃*/ 0xCBA,/*-3.5℃*/ 0xCA9,/*-3℃*/ 0xC97,/*-2.5℃*/ 0xC85,/*-2℃*/
0xC73,/*-1.5℃*/ 0xC61,/*-1℃*/ 0xC4F,/*-0.5℃*/ 0xC3C,/*0℃*/ 0xC2A,/*0.5℃*/ 0xC17,/*1℃*/
0xC03,/*1.5℃*/ 0xBF0,/*2℃*/ 0xBDD,/*2.5℃*/ 0xBC9,/*3℃*/ 0xBB5,/*3.5℃*/ 0xBA1,/*4℃*/
0xB8D,/*4.5℃*/ 0xB78,/*5℃*/ 0xB64,/*5.5℃*/ 0xB4F,/*6℃*/ 0xB3A,/*6.5℃*/ 0xB26,/*7℃*/
0xB10,/*7.5℃*/ 0xAFB,/*8℃*/ 0xAE6,/*8.5℃*/ 0xAD0,/*9℃*/ 0xABB,/*9.5℃*/ 0xAA5,/*10℃*/
0xA8F,/*10.5℃*/ 0xA79,/*11℃*/ 0xA63,/*11.5℃*/ 0xA4D,/*12℃*/ 0xA37,/*12.5℃*/ 0xA20,/*13℃*/
0xA0A,/*13.5℃*/ 0x9F4,/*14℃*/ 0x9DD,/*14.5℃*/ 0x9C7,/*15℃*/ 0x9B0,/*15.5℃*/ 0x999,/*16℃*/
0x983,/*16.5℃*/ 0x96C,/*17℃*/ 0x955,/*17.5℃*/ 0x93E,/*18℃*/ 0x927,/*18.5℃*/ 0x911,/*19℃*/
0x8FA,/*19.5℃*/ 0x8E3,/*20℃*/ 0x8CC,/*20.5℃*/ 0x8B5,/*21℃*/ 0x89F,/*21.5℃*/ 0x888,/*22℃*/
0x871,/*22.5℃*/ 0x85A,/*23℃*/ 0x844,/*23.5℃*/ 0x82D,/*24℃*/ 0x817,/*24.5℃*/ 0x800,/*25℃*/
0x7EA,/*25.5℃*/ 0x7D3,/*26℃*/ 0x7BD,/*26.5℃*/ 0x7A7,/*27℃*/ 0x791,/*27.5℃*/ 0x77A,/*28℃*/
0x765,/*28.5℃*/ 0x74F,/*29℃*/ 0x739,/*29.5℃*/ 0x723,/*30℃*/ 0x70E,/*30.5℃*/ 0x6F8,/*31℃*/
0x6E3,/*31.5℃*/ 0x6CE,/*32℃*/ 0x6B9,/*32.5℃*/ 0x6A4,/*33℃*/ 0x68F,/*33.5℃*/ 0x67A,/*34℃*/
0x666,/*34.5℃*/ 0x651,/*35℃*/ 0x63D,/*35.5℃*/ 0x629,/*36℃*/ 0x615,/*36.5℃*/ 0x601,/*37℃*/
0x5EE,/*37.5℃*/ 0x5DA,/*38℃*/ 0x5C7,/*38.5℃*/ 0x5B4,/*39℃*/ 0x5A1,/*39.5℃*/ 0x58E,/*40℃*/
0x57B,/*40.5℃*/ 0x569,/*41℃*/ 0x556,/*41.5℃*/ 0x544,/*42℃*/ 0x532,/*42.5℃*/ 0x520,/*43℃*/
0x50F,/*43.5℃*/ 0x4FD,/*44℃*/ 0x4EC,/*44.5℃*/ 0x4DB,/*45℃*/ 0x4CA,/*45.5℃*/ 0x4B9,/*46℃*/
0x4A8,/*46.5℃*/ 0x498,/*47℃*/ 0x488,/*47.5℃*/ 0x478,/*48℃*/ 0x468,/*48.5℃*/ 0x458,/*49℃*/
0x449,/*49.5℃*/ 0x439,/*50℃*/ 0x42A,/*50.5℃*/ 0x41B,/*51℃*/ 0x40C,/*51.5℃*/ 0x3FE,/*52℃*/
0x3EF,/*52.5℃*/ 0x3E1,/*53℃*/ 0x3D3,/*53.5℃*/ 0x3C5,/*54℃*/ 0x3B7,/*54.5℃*/ 0x3AA,/*55℃*/
0x39C,/*55.5℃*/ 0x38F,/*56℃*/ 0x382,/*56.5℃*/ 0x375,/*57℃*/ 0x368,/*57.5℃*/ 0x35C,/*58℃*/
0x350,/*58.5℃*/ 0x343,/*59℃*/ 0x337,/*59.5℃*/ 0x32B,/*60℃*/ 0x320,/*60.5℃*/ 0x314,/*61℃*/
0x309,/*61.5℃*/ 0x2FD,/*62℃*/ 0x2F2,/*62.5℃*/ 0x2E7,/*63℃*/ 0x2DC,/*63.5℃*/ 0x2D2,/*64℃*/
0x2C7,/*64.5℃*/ 0x2BD,/*65℃*/ 0x2B3,/*65.5℃*/ 0x2A9,/*66℃*/ 0x29F,/*66.5℃*/ 0x295,/*67℃*/
0x28B,/*67.5℃*/ 0x282,/*68℃*/ 0x278,/*68.5℃*/ 0x26F,/*69℃*/ 0x266,/*69.5℃*/ 0x25D,/*70℃*/
0x254,/*70.5℃*/ 0x24C,/*71℃*/ 0x243,/*71.5℃*/ 0x23B,/*72℃*/ 0x232,/*72.5℃*/ 0x22A,/*73℃*/
0x222,/*73.5℃*/ 0x21A,/*74℃*/ 0x212,/*74.5℃*/ 0x20A,/*75℃*/ 0x203,/*75.5℃*/ 0x1FB,/*76℃*/
0x1F4,/*76.5℃*/ 0x1ED,/*77℃*/ 0x1E6,/*77.5℃*/ 0x1DE,/*78℃*/ 0x1D7,/*78.5℃*/ 0x1D1,/*79℃*/
0x1CA,/*79.5℃*/ 0x1C3,/*80℃*/ 0x1BD,/*80.5℃*/ 0x1B6,/*81℃*/ 0x1B0,/*81.5℃*/ 0x1AA,/*82℃*/
0x1A4,/*82.5℃*/ 0x19E,/*83℃*/ 0x198,/*83.5℃*/ 0x192,/*84℃*/ 0x18C,/*84.5℃*/ 0x186,/*85℃*/
0x181,/*85.5℃*/ 0x17B,/*86℃*/ 0x176,/*86.5℃*/ 0x170,/*87℃*/ 0x16B,/*87.5℃*/ 0x166,/*88℃*/
0x161,/*88.5℃*/ 0x15C,/*89℃*/ 0x157,/*89.5℃*/ 0x152,/*90℃*/ 0x14D,/*90.5℃*/ 0x148,/*91℃*/
0x144,/*91.5℃*/ 0x13F,/*92℃*/ 0x13B,/*92.5℃*/ 0x136,/*93℃*/ 0x132,/*93.5℃*/ 0x12D,/*94℃*/
0x129,/*94.5℃*/ 0x125,/*95℃*/ 0x121,/*95.5℃*/ 0x11D,/*96℃*/ 0x119,/*96.5℃*/ 0x115,/*97℃*/
0x111,/*97.5℃*/ 0x10D,/*98℃*/ 0x10A,/*98.5℃*/ 0x106,/*99℃*/ 0x102,/*99.5℃*/ 0xFF,/*100℃*/
};
///////-20℃---100℃
const float NTC_TEMP[NTC_LEN]={
-20, -19.5, -19, -18.5, -18, -17.5, -17, -16.5, -16, -15.5, -15, -14.5, -14,
-13.5, -13, -12.5, -12, -11.5, -11, -10.5, -10, -9.5, -9, -8.5, -8, -7.5,
-7, -6.5, -6, -5.5, -5, -4.5, -4, -3.5, -3, -2.5, -2, -1.5, -1, -0.5, 0,
0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9,
9.5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 13.5, 14, 14.5, 15, 15.5, 16, 16.5,
17, 17.5, 18, 18.5, 19, 19.5, 20, 20.5, 21, 21.5, 22, 22.5, 23, 23.5, 24,
24.5, 25, 25.5, 26, 26.5, 27, 27.5, 28, 28.5, 29, 29.5, 30, 30.5, 31, 31.5,
32, 32.5, 33, 33.5, 34, 34.5, 35, 35.5, 36, 36.5, 37, 37.5, 38, 38.5, 39,
39.5, 40, 40.5, 41, 41.5, 42, 42.5, 43, 43.5, 44, 44.5, 45, 45.5, 46, 46.5,
47, 47.5, 48, 48.5, 49, 49.5, 50, 50.5, 51, 51.5, 52, 52.5, 53, 53.5, 54,
54.5, 55, 55.5, 56, 56.5, 57, 57.5, 58, 58.5, 59, 59.5, 60, 60.5, 61, 61.5,
62, 62.5, 63, 63.5, 64, 64.5, 65, 65.5, 66, 66.5, 67, 67.5, 68, 68.5, 69,
69.5, 70, 70.5, 71, 71.5, 72, 72.5, 73, 73.5, 74, 74.5, 75, 75.5, 76, 76.5,
77, 77.5, 78, 78.5, 79, 79.5, 80, 80.5, 81, 81.5, 82, 82.5, 83, 83.5, 84,
84.5, 85, 85.5, 86, 86.5, 87, 87.5, 88, 88.5, 89, 89.5, 90, 90.5, 91, 91.5,
92, 92.5, 93, 93.5, 94, 94.5, 95, 95.5, 96, 96.5, 97, 97.5, 98, 98.5, 99, 99.5, 100,
};
/******************************************************************************
**函数信息 : ADC_Get_TempValue( uint16_t adcval)
**功能描述 :根据ADC数值计算实际温度
**输入参数 :无
**输出参数 :无
**说 明 :
******************************************************************************/
float ADC_Get_TempValue( uint16_t val)
{
uint8_t i;
float temp;
for(i = 0;i < NTC_LEN; i++)
{
if( (val <= NTC_TAB) & (val > NTC_TAB[i+1]) )
{
break;
}
}
return NTC_TEMP+(float)(NTC_TAB - val)/(NTC_TAB - NTC_TAB[i+1]);
}
ADC滤波说明,通过求多次ADC采样的平均值获得稳定的数值.为了快速运算,采样总次数设定为2的n次方,累加之后移位.
/*****************************************************************************
**函数信息 : DMA1_Channel1_IRQHandler(void)
**功能描述 : DMA1通道1中断服务程序
**输入参数 : 无
**输出参数 : 无
*****************************************************************************/
void DMA1_Channel1_IRQHandler()
{
uint16_t i;
uint32_t tmp;
tmp = 0;
if( DMA_GetITStatus(DMA1_IT_TC1) )
{
for(i=0; i<1024; i++)
{
tmp += Get_ConversionVal(ADC_ConvertedValue);
}
tmp = tmp>>10;
LCD_ShowNum(64,16,tmp,4,BLACK); //ntc adc数值
LCD_ShowNum1(64,32,ADC_Get_TempValue(tmp),4,BLACK); //ntc温度显示
DMA_ClearITPendingBit(DMA1_IT_TC1);
}
}
|
多谢楼主的资料分享,期待后续更多资料分享。