学习目标
学习内容
NTC(Negative Temperature Coefficient)是指随温度上升电阻减小、具有负温度系数的热敏电阻现象和材料。
原理图

| ADC功能 | 引脚 |
|---|---|
| ADC0 | P1.0 |
| ADC1 | P1.1 |
| ADC2 | P5.4 |
| ADC3 | P1.3 |
| ADC4 | P1.4 |
| ADC5 | P1.5 |
| ADC6 | P1.6 |
| ADC7 | P1.7 |
| ADC8 | P0.0 |
| ADC9 | P0.1 |
| ADC10 | P0.2 |
| ADC11 | P0.3 |
| ADC12 | P0.4 |
| ADC13 | P0.5 |
| ADC14 | P0.6 |
温度计算步骤
通过ADC得到电压
这里ADC_V就是通过ADC通道读到的数值,范围是0-4096V_ntc即为对应的电压值
通过欧姆定律得到阻值
即整个线路上的电流是固定的,则热敏电阻的阻值X_r = V_ntc * 10 / (3.3 - V_ntc)
通过阻值查表得到温度
热敏电阻与温度对照表

采用表的方式来记录 电阻值和温度的关系。
其中,表中记录的是阻值,下标记录的是温度。可以通过阻值比对,查询出下标,下标就是对应的温度。
u16 code temp_table[]= {58354, // -5555464, // -5452698, // -5350048, // -5247515, // -5145097, // -5042789, // -4940589, // -4838492, // -4736496, // -4634597, // -4532791, // -4431075, // -4329444, // -4227896, // -4126427, // -4025034, // -3923713, // -3822460, // -3721273, // -3620148, // -3519083, // -3418075, // -3317120, // -3216216, // -3115361, // -3014551, // -2913785, // -2813061, // -2712376, // -2611728, // -2511114, // -2410535, // -239986, // -229468, // -218977, // -208513, // -198075, // -187660, // -177267, // -166896, // -156545, // -146212, // -135898, // -125601, // -115319, // -105053, // -94801, // -84562, // -74336, // -64122, // -53920, // -43728, // -33546, // -23374, // -13211, // 03057, // 12910, // 22771, // 32639, // 42515, // 52396, // 62284, // 72177, // 82076, // 91978, // 101889, // 111802, // 121720, // 131642, // 141568, // 151497, // 161430, // 171366, // 181306, // 191248, // 201193, // 211141, // 221092, // 231044, // 241000, // 25957, // 26916, // 27877, // 28840, // 29805, // 30771, // 31739, // 32709, // 33679, // 34652, // 35625, // 36600, // 37576, // 38552, // 39530, // 40509, // 41489, // 42470, // 43452, // 44434, // 45417, // 46401, // 47386, // 48371, // 49358, // 50344, // 51331, // 52318, // 53306, // 54295, // 55284, // 56274, // 57264, // 58254, // 59245, // 60236, // 61228, // 62220, // 63212, // 64205, // 65198, // 66191, // 67184, // 68178, // 69172, // 70166, // 71160, // 72155, // 73150, // 74145, // 75140, // 76135, // 77131, // 78126, // 79122, // 80118, // 81115, // 82111, // 83107, // 84104, // 85101, // 8697, // 8794, // 8891, // 8989, // 9086, // 9183, // 9281, // 9378, // 9476, // 9574, // 9671, // 9769, // 9867, // 9965, // 10063, // 10161, // 10260, // 10358, // 10456, // 10555, // 10653, // 10752, // 10850, // 10949, // 11047, // 11146, // 11245, // 11343, // 11442, // 11541, // 11640, // 11739, // 11838, // 11937, // 12036, // 12135, // 12234, // 12333, // 12432, // 125};
代码参考
创建NTC.h,写入如下内容
#ifndef __NTC_H__#define __NTC_H__#include "Config.h"// 求绝对值#define abs(x) ((x > 0) ? (x) : (-(x)))#define NTC_GPIO GPIO_P0#define NTC_GPIO_PIN GPIO_Pin_4#define NTC_ACD_CH ADC_CH12// 初始化NTCvoid NTC_init();// 获取温度值int NTC_get_temperature();#endif
创建一个NTC.c文件,写入如下内容,请自行将temp_table拷贝进来
#include "NTC.h"#include "GPIO.h"#include "ADC.h"#include "NVIC.h"#include <stdio.h>static void GPIO_config(void) {GPIO_InitTypeDef GPIO_InitStructure; //结构定义GPIO_InitStructure.Pin = NTC_GPIO_PIN; //指定要初始化的IO,GPIO_InitStructure.Mode = GPIO_HighZ; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(NTC_GPIO, &GPIO_InitStructure);//初始化}/******************* AD配置函数 *******************/void ADC_config(void){ADC_InitTypeDef ADC_InitStructure; //结构定义ADC_InitStructure.ADC_SMPduty = 31; //ADC 模拟信号采样时间控制, 0~31(注意: SMPDUTY 一定不能设置小于 10)ADC_InitStructure.ADC_CsSetup = 0; //ADC 通道选择时间控制 0(默认),1ADC_InitStructure.ADC_CsHold = 1; //ADC 通道选择保持时间控制 0,1(默认),2,3ADC_InitStructure.ADC_Speed = ADC_SPEED_2X1T; //设置 ADC 工作时钟频率 ADC_SPEED_2X1T~ADC_SPEED_2X16TADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED; //ADC结果调整, ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIEDADC_Inilize(&ADC_InitStructure); //初始化ADC_PowerControl(ENABLE); //ADC电源开关, ENABLE或DISABLENVIC_ADC_Init(DISABLE,Priority_0); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3}// 初始化NTCvoid NTC_init() {GPIO_config();ADC_config();}static int search_temp(float rst_Rx10){int i, min_index = 0;// 计算数组长度int len = sizeof(temp_table) / sizeof(u16);// 记录最小差值float min_diff = abs(rst_Rx10 - temp_table[0]);for (i = 1; i < len; i++){// 计算数组里每一个阻值和rst_Rx10的差值float diff = abs(rst_Rx10 - temp_table[i]);// 得到差值最小元素对应的索引iif(diff < min_diff){// 如果有更小的差值,赋值min_diff = diff;min_index = i;}}printf("len: %d R: %.2f min_diff: %.2f min_index: %d \n", len, rst_Rx10, min_diff, min_index);return min_index;}// 获取温度值int NTC_get_temperature() {u16 adc_value;float rst_V;float rst_R;int rst_T;// 获取对应的ADC值adc_value = Get_ADCResult(NTC_ACD_CH);// adc_value返回的值范围 0 -> 4096// 等同于P05引脚的电压值和Vref的占比 1024// X = ADC_V * Vref / 4096// 计算电压rst_V = adc_value * 2.5 / 4096;// 计算电阻值rst_R = rst_V * 10 / (3.3 - rst_V);// 9.36KΩ 将阻值兑换成温度rst_T = search_temp(rst_R * 100) - 55;printf("ADC: %d voltage: %.2f R = %.2f T = %d℃ \n", adc_value, rst_V, rst_R, (int)rst_T);return rst_T;}
main函数中:
int rst_T;NTC_init();rst_T = NTC_get_temperature();printf("温度:%d \n", rst_T);
