前言:
ntc热敏电阻的R值是10k,B值是3950
使用的是STM32F103RCT6的ADC

文章目录

  • 1.电路理论
  • 2. NTC热敏电阻阻值与温度之间的转换
  • 3.NTC热敏电阻温度采集与adc转换

其中最主要的是
温度变化,引起了热敏电阻的变化,然后导致的电压的变化,从而导致了adc的值发生改变,所以核心变成了,怎样根据adc值得到温度值

1.电路理论


不要问我图为啥是这个样子,这是硬件工程师画的板子
其中R_ntc指的是热敏电阻,R1是个平衡电阻,电容不知道干啥子用的,觉得是防止信号干扰,但是电容并不影响理解,v_out就是ADC的输出
每次热敏电阻检测到温度变化的时候,输出电压都会随之改变,通常使用分压器
由于是串联电路,电流相等,分压,因此可得到公式

Vout/Rntc=VCC/(Rntc+R1)V_{out} /R_{ntc} = V_{CC}/(R_{ntc}+R_{1})Vout​/Rntc​=VCC​/(Rntc​+R1​)

由此可以得到:
VCC/Vout=(Rntc+R1)/RntcV_{CC}/V_{out} = (R_{ntc} + R_{1})/R_{ntc}VCC​/Vout​=(Rntc​+R1​)/Rntc​

在数学上成立下式:
Dmax/Dout=(Rntc+R1)/RntcD_{max}/D_{out} = (R_{ntc} + R_{1})/R_{ntc}Dmax​/Dout​=(Rntc​+R1​)/Rntc​

其中Dmax指的是最大的ADC值也就是在3.3V的时候ADC等于4096,Dout也就是实际电压输出的ADC值。

所以我们要得到的就变成了电阻与温度之间的对应关系

2. NTC热敏电阻阻值与温度之间的转换

有一个这样子的公式
Rt=R∗e(B∗(1/T1−1/T2))Rt = R*e^{(B*{(1/T1-1/T2)})}Rt=R∗e(B∗(1/T1−1/T2))

其中:
Rt就是随着温度变化阻值
R就是25℃时的阻值,也就是开头说的10k
B值等于3950
T1:指的时开尔文温度等于273.15+热敏电阻当前阻值对应的摄氏度
T2:273.15+25

看到网上有很多种办法,最常规的一种就是写代码,加一个math库
但是最后发现最好的办法其实是EXCEL表,如下

最上面红色方框是公式,下面红色框中可以发现当25摄氏度时,阻值等于10k,温度与阻值的变化曲线如下:

看看大致曲线就行了,其实灵敏度就没那么好

电阻值与ADC的对应关系就是
Dmax/Dout=(Rntc+R1)/RntcD_{max}/D_{out} = (R_{ntc} + R_{1})/R_{ntc}Dmax​/Dout​=(Rntc​+R1​)/Rntc​

所以就得到了ADC值对应的温度。ADC值得到的方式也是通过excel表计算得到

关系曲线如下:

3.NTC热敏电阻温度采集与adc转换

这里是重点部分了
首先是ADC相关函数,这里我用的是PC4端口,主要是想用用新的,对应的通道关系如下:

所以PC4对应的通道14,使用的是ADC1,关于ADC的配置方式可以看我的另一篇博客【STM32】学习笔记之ADC(模拟/数字转换)

下面是我的adc.c文件中的内容:(将温度与adc值的对应关系保存在数组中,得到adc值之后只要在数组中查找,没有考虑复杂度,要优化的话,查找算法可以改成更快的二分法查找,快速查找等等,如果得到的adc值在数组中没有对应温度,就取那个相近的温度值)

#include "adc.h"
#include "delay.h"const u16 ADC_NTC[NTC_ADC_MAX] =
{2048 ,2043 ,2039 ,2034 ,2030 ,2025 ,2021 ,2016 ,2012 ,2007,  //25-25.92003 ,1998 ,1994 ,1989 ,1985 ,1980 ,1976 ,1971 ,1967 ,1962,  //26-26.91958 ,1953 ,1949 ,1944 ,1940 ,1935 ,1931 ,1926 ,1922 ,1917,  //27-27.91913 ,1909 ,1904 ,1900 ,1895 ,1891 ,1886 ,1882 ,1878 ,1873,  //28-28.91869 ,1864 ,1860 ,1856 ,1851 ,1847 ,1843 ,1838 ,1834 ,1829,  //29-29.91825 ,1821 ,1816 ,1812 ,1808 ,1803 ,1799 ,1795 ,1790 ,1786,  //30-30.91782 ,1778 ,1773 ,1769 ,1765 ,1760 ,1756 ,1752 ,1748 ,1743,  //31-31.91739 ,1735 ,1731 ,1726 ,1722 ,1718 ,1714 ,1710 ,1705 ,1701,  //32-32.91697 ,1693 ,1689 ,1684 ,1680 ,1676 ,1672 ,1668 ,1664 ,1660,  //33-33.91655 ,1651 ,1647 ,1643 ,1639 ,1635 ,1631 ,1627 ,1623 ,1618,  //34-34.91614 ,1610 ,1606 ,1602 ,1598 ,1594 ,1590 ,1586 ,1582 ,1578,  //35-35.91574 ,1570 ,1566 ,1562 ,1558 ,1554 ,1550 ,1546 ,1542 ,1538,  //36-36.91534 ,1530 ,1526 ,1523 ,1519 ,1515 ,1511 ,1507 ,1503 ,1499,  //37-37.91495 ,1491 ,1488 ,1484 ,1480 ,1476 ,1472 ,1468 ,1464 ,1461,  //38-38.91457 ,1453 ,1449 ,1445 ,1442 ,1438 ,1434 ,1430 ,1427 ,1423,  //39-39.91419 ,1415 ,1412 ,1408 ,1404 ,1401 ,1397 ,1393 ,1389 ,1386,  //40-40.91382 ,1378 ,1375 ,1371 ,1368 ,1364 ,1360 ,1357 ,1353 ,1349,  //41-41.91346 ,1342 ,1339 ,1335 ,1332 ,1328 ,1324 ,1321 ,1317 ,1314,  //42-42.91310 ,1307 ,1303 ,1300 ,1296 ,1293 ,1289 ,1286 ,1282 ,1279,  //43-43.91275 ,1272 ,1269 ,1265 ,1262 ,1258 ,1255 ,1251 ,1248 ,1245   //44-44.9
};void Adc_Init(void)
{ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_ADC1 , ENABLE ); //使能 ADC1 通道时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置 ADC 分频因子 6 ,72M/6=12,ADC 最大时间不能超过 14M//PC4 作为模拟通道输入引脚GPIO_InitStructure.GPIO_Pin =GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化 GPIOC.4ADC_DeInit(ADC1); //复位 ADC1,将外设 ADC1 的全部寄存器重设为缺省值ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC 独立模式ADC_InitStructure.ADC_ScanConvMode = DISABLE; //单通道模式ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //单次转换模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//转换由软件而不是外部触发启动ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC 数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC 通道的数目ADC_Init(ADC1, &ADC_InitStructure); //根据指定的参数初始化外设 ADCxADC_Cmd(ADC1, ENABLE); //使能指定的 ADC1ADC_ResetCalibration(ADC1); //开启复位校准while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束ADC_StartCalibration(ADC1); //开启 AD 校准while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
}//获得 ADC 值
u16 Get_Adc(u8 ch)
{//设置指定 ADC 的规则组通道,设置它们的转化顺序和采样时间ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );//通道 1,规则采样顺序值为 1,采样时间为 239.5 周期ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能软件转换功能while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束return ADC_GetConversionValue(ADC1); //返回最近一次 ADC1 规则组的转换结果
}//多取几次,取平均值
u16 Get_Adc_Average(u8 ch,u8 times)
{u32 temp_val=0;u8 t;for(t=0;t<times;t++){temp_val+=Get_Adc(ch);delay_ms(5);}return temp_val/times;
}//这是一个ADC值转温度值的函数
float Get_temper(u16 adc_value)
{int i;for(i=0;i<NTC_ADC_MAX;i++){if(adc_value >= ADC_NTC[i]) //当没有ADC值对应温度的时候,就取相近的,也就是大于的情况{return 0.1*i+25;break;}}return 65;
}

main函数不想贴上来了,因为我用的是工业级的屏幕,结果如下:

因为加了其他的外设,不方便把整个屏幕露出来

有问题记得给我指出来呀

NTC热敏电阻温度采集与adc转换相关推荐

  1. GC0053-STM32单片机NTC热敏电阻温度采集及控制LCD1602

    实践制作DIY- GC0053-NTC热敏电阻温度采集 一.功能说明: 基于STM32单片机设计-NTC热敏电阻温度采集 二.功能介绍: STM32单片机+LCD1602显示器+NTC热敏电阻温度传感 ...

  2. 51单片机NTC热敏电阻温度采集及控制ADC0832 LCD1602

    实践制作DIY- GC0051-NTC热敏电阻温度采集及控制 一.功能说明: 基于51单片机设计-NTC热敏电阻温度采集及控制 功能介绍: STC89C52单片机(STC89C51/52 AT89C5 ...

  3. c语言ntc程序,NTC热敏电阻温度计算以及C语言实现

    一:硬件设计 这里使用的是MF52-103热敏电阻,其中B为3950,它与10K电阻串联,由于热敏电阻随着温度的升高,电阻值降低,所以10K电阻两端的电压将上升. 二:NTC热敏电阻的计算 NTC 热 ...

  4. ntc温度控制程序 c语言,NTC热敏电阻温度计算以及C语言实现

    一:硬件设计 这里使用的是MF52-103热敏电阻,其中B为3950,它与10K电阻串联,由于热敏电阻随着温度的升高,电阻值降低,所以10K电阻两端的电压将上升. 二:NTC热敏电阻的计算 NTC 热 ...

  5. NTC热敏电阻温度计算公式

    NTC 热敏电阻温度计算公式 Rt = R *EXP(B*(1/T1-1/T2)) 这里T1和T2指的是K度即开尔文温度,K度=273.15(绝对温度)+摄氏度:其中T2=(273.15+25) Rt ...

  6. 基于8086步进电机定时启动设计-基于8086八路智能抢答器系统控制设计-基于8086八路PT100热敏电阻温度采集-基于8086 8253定时计数器方波发生器仿真-基于8086的1602动态显示仿真

    1157基于8086八路智能抢答器系统控制设计-微机原理资料 以8086为核心,设计一个8位竞赛抢答器:同时供8名选手或8个代表队比赛,分别用8个按钮S0-S7表示. 设置一个系统清除和抢答控制开关S ...

  7. 【资料转发分享】基于8086八路智能抢答器系统控制设计、基于8086八路PT100热敏电阻温度采集、基于8086步进电机定时启动设计-仿真设计资料

    1157基于8086八路智能抢答器系统控制设计-微机原理资料 以8086为核心,设计一个8位竞赛抢答器:同时供8名选手或8个代表队比赛,分别用8个按钮S0-S7表示. 设置一个系统清除和抢答控制开关S ...

  8. STM32f103 ADC+DMA采集NTC热敏电阻温度10K(3950)

    利用ADC+DMA采集 计算,查表(T-R表:百度) /*---------------------------------------ntc.h--------------------------- ...

  9. stc5 采集adc值越来越小_热敏电阻温度采集简述

    热敏电阻NTC 一. 热敏电阻总体说明 本简述是说明 NTC热敏电阻器对温度的测量.热敏电阻器把温度的变化转换为电阻阻值的变化, 再应用相应的测量电路把阻值的变化转换为电压的变化:然后通过芯片或处理电 ...

最新文章

  1. htop 和 bashtop 的一些不足
  2. SATA硬盘如何使用GHOST
  3. 代理服务器工作原理是什么?
  4. Java高并发程序设计(六)--线程池(1)
  5. 取两个数较小值c语言_如何提升C语言安全性,达到RUST的安全性
  6. 堆栈溢出 java_堆栈溢出回答了我们所不知道的Java首要问题
  7. 非关型数据库之MongoDB
  8. antdesign 地图_React 使用recharts实现散点地图的示例代码
  9. python makefile
  10. qt 如何 指针 自动 释放内存_要是面试官再问你智能指针的问题,就拿这篇文章“盘他”!!!...
  11. CSS多行文本溢出省略号...显示设置
  12. python400集视频教程-微软官方出品的400集Python精品视频教程,这正是我们急需的!...
  13. 通过代码自定义cell
  14. mysql数据库库推荐书籍
  15. LoadLibraryA加载dll失败
  16. spring boot结合shiro实现用户-角色-权限的控制(包含用户名密码登陆和手机号验证码登陆)
  17. 蜜蜂的群体决策:一万只蜜蜂如何投票选择最佳巢穴?
  18. 你应该知道的计算机网络知识 【转】
  19. Centos 7.2 及php7环境下升级memcache未果,改安装 memcached
  20. Leetcode之无重复字符的最长字符串

热门文章

  1. 手把手教你轻松下载百度网盘超大文件
  2. 消息中间件ActiveMQ 4: 传输协议
  3. 机器视觉光源选型攻略
  4. gradle linux中文乱码,Gradle 构建 Android 应用常见问题解决指南
  5. 搭档之家:“假欧冠决赛”竟1万多人观看,刺不刺激,惊不惊喜,意不意外?
  6. IOS系统ipa软件包在线安装
  7. SOC与SIP小芯片两种IP互联技术
  8. ADO数据库连接中的Persist Security Info参数的作用
  9. android 函数库,Android Studio 实现开源函数库的离线依赖-greenDAO 3 为例
  10. android bilibili弹幕技术解析,bilibili弹幕爬取与比对分析