NTC电阻温度上升,阻值减小,假设有一NTC电阻,型号XXX,搜索型号可以得知官方数据25摄氏度时的电阻,
需要注意两个数据,一为该元件25摄氏度时的电阻值R25,二为该元件的B值,B值有时在元件型号名中有所体现.
假设有一NTC电阻的R25 = 100K欧姆 B值为4200;
有这两个数据就可以求得不同温度下该NTC电阻的阻值,即 温度--电阻 之间形成映射关系
(网上找到热心老哥分享的自动换算表格,填入对应值就可以得到温度和阻值的数据)
再求得 电阻--ADC检测值 之间的映射关系,即可求得 温度---ADC检测值 之间的关系
那么已知ADC检测值,如何求得对应的NTC电阻?
需要结合电路图来看,已知ADC检测NTC电阻两端的电压,总输入电压固定,有一个固定的分压电阻和动态的NTC电阻,
NTC电阻的值随温度变化改变,它分到的压也不同,那么ADC检测值自然也不同
根据电路分析,得到NTC电阻值两端电压随温度的变化的映射关系,提取出对应的ADC值,应用查表法不断检查实际的ADC值,就可以得到温度数据啦
#define NTC_DIAG_TICK (10)
#define NTC_DIAG_TIME (100)
#define NTC_ADC_MAX 137
/*检测范围 -30--105摄氏度 合计136量程*/
const unsigned short ADC_NTC[NTC_ADC_MAX]= // 温度电阻对应表
{ 2782, 2782, 2782, 2781, 2781, 2781, 2780, 2780, 2780, 2779,//-30 -21
2779, 2778, 2778, 2777, 2776, 2776, 2775, 2775, 2774, 2773,//-20 -11
2772, 2771, 2771, 2770, 2769, 2768, 2767, 2765, 2764, 2763,//-10 -01
2762, 2760, 2759, 2757, 2756, 2754, 2752, 2750, 2748, 2746,//0 9
2744, 2742, 2740, 2737, 2735, 2732, 2730, 2727, 2724, 2721,//10 19
2718, 2714, 2711, 2707, 2703, 2700, 2696, 2691, 2687, 2683,//20 29
2678, 2673, 2668, 2663, 2657, 2652, 2646, 2640, 2634, 2628,//30 39
2621, 2615, 2608, 2600, 2593, 2585, 2578, 2570, 2561, 2553,//40 49
2544, 2535, 2526, 2516, 2506, 2496, 2486, 2476, 2465, 2454,//50 59
2443, 2431, 2419, 2407, 2395, 2383, 2370, 2357, 2343, 2330,//60 69
2316, 2302, 2288, 2273, 2258, 2243, 2228, 2213, 2197, 2181,//70 79
2165, 2149, 2132, 2115, 2098, 2081, 2064, 2046, 2029, 2011,//80 89
1993, 1975, 1956, 1938, 1919, 1901, 1882, 1863, 1844, 1825,//90 99
1806, 1787, 1767, 1748, 1729, 1709 //100 105
};
char Get_temper(unsigned short adc_value) // 返回查表对应的温度值 -20~80度 根据电路最大5V,NTC电压范围 = 5V* (NTC阻值)/总阻值
{
int i;
for(i=0;i<NTC_ADC_MAX;i++)
{
if(adc_value >= ADC_NTC[i]) //当没有ADC值对应温度的时候,就取相近的,也就是大于的情况
{
return i-30;
break;
}
}
return 105;
}
void NTC_Check_MainFunc(void)
{
uint16_t ntc_adc_val[3] = {0};
uint8_t adc_seq = 0;
char temp = 0;
for(adc_seq = 0; adc_seq < 3; adc_seq++) //一共三个NTC检测模块,循环访问
{
ntc_adc_val[adc_seq] = ADC_GetArray(DRIVER_TEMP_CHECK_SEQ + adc_seq);
ntc_array_counter[adc_seq] += ntc_adc_val[adc_seq];
ntc_check_counter[adc_seq]++;
if(ntc_check_counter[adc_seq] >= (NTC_DIAG_TIME / NTC_DIAG_TICK)) //检测10次,求平均值
{
ntc_adc_val[adc_seq] = (ntc_array_counter[adc_seq] / ntc_check_counter[adc_seq]);
ntc_check_counter[adc_seq] = 0;
ntc_array_counter[adc_seq] = 0;
temp = Get_temper(ntc_adc_val[adc_seq]);
if(temp<-30 || temp >105)
{
temp = 0;
}
printf("ntc_%d 值是 %d, 温度是%d \r\n" ,adc_seq+1,ntc_adc_val[adc_seq],temp);
}
}
文件分享:
NTC温度阻值对应表:
https://chhhcooh.lanzouo.com/ivEcj1lj86ri
密码:SCP001
NTC阻值与ADC换算表:
https://chhhcooh.lanzouo.com/ipw4R1ljauah
密码:SCP002