一、硬件

STM32F103C8T6、热敏电阻传感器、OLED。

二、热敏电阻传感器的介绍

一个DO输出口,输出数字量,根据外界的温度是否超过传感器的阈值,输出0或1;一个AO口,输出模拟量。温度的检测要通过模拟量转换而来。

三、代码实现

要使得单片机读到的模拟量转换成温度需要经过以下步骤:1、读取的数值转电压;2、电压转电阻、3、根据公式计算实际的温度。

1、ADC读取。ADC怎么读取可以看之前的读取光敏电阻的文章,过程类似,就是引脚不一样。代码如下。

//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3
void  temp_Adc_Init(void)
{     ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );      //使能ADC1通道时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M//PA1 作为模拟通道输入引脚                         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //模拟输入引脚GPIO_Init(GPIOA, &GPIO_InitStructure);    ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;    //ADC工作模式:ADC1和ADC2工作在独立模式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 = 6;    //顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure);    //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器ADC_Cmd(ADC1, ENABLE);    //使能指定的ADC1ADC_ResetCalibration(ADC1);    //使能复位校准  while(ADC_GetResetCalibrationStatus(ADC1));    //等待复位校准结束ADC_StartCalibration(ADC1);     //开启AD校准while(ADC_GetCalibrationStatus(ADC1));     //等待校准结束ADC_SoftwareStartConvCmd(ADC1, ENABLE);        //使能指定的ADC1的软件转换启动功能
}
//获得ADC值
//ch:通道值 0~3
u16 temp_Get_Adc(u8 ch)
{//设置指定ADC的规则组通道,一个序列,采样时间ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );    //ADC1,ADC通道,采样时间为239.5周期                      ADC_SoftwareStartConvCmd(ADC1, ENABLE);        //使能指定的ADC1的软件转换启动功能    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束return ADC_GetConversionValue(ADC1);           //返回最近一次ADC1规则组的转换结果
}u16 temp_Get_Adc_Average(u8 ch,u8 times)
{u32 temp_val=0;u8 t;for(t=0;t<times;t++){temp_val+=temp_Get_Adc(ch);Delay_ms(5);}return temp_val/times;
}

2、采样值转电压、求电阻

求电压,我用的STM32F103C8T6,采用12位ADC采样,所以采样的最大值也就是2^12=4096,而单片机的电压是3.3v,所以读到的电压 = 读取的采样值/4096 * 3.3V。

求电阻,如图

vcc = 3.3V,  热敏电阻的电压在上面求了,比值算一下就知道热敏电阻当前的阻值了

代码如下

//模拟量转电阻
float temp_Get_R(u16 adct)
{//单片机3.3v 供电 ==》 3v,先求出电压float v1 = (float)(adct*3.3)/4096;//ntc上的电压float v2 = 3.3 - v1;float r = (v1/v2)*10;return r;
}

3、温度计算

根据开尔文公式,可以直接得到当前的开尔文温度Tn公式如下:B=(lnR25 - lnRntc)/(1/T25 - 1/Tn)

其中单片机不能用math.h ,所以求对数的函数要自己实现。

参数介绍:

B,是一个系数,与热敏电阻本身系数有关(百度说这个由厂家提供),3435(问卖家即可)

R25是上拉电阻的阻值,

Rntc是上面求出来的热敏电阻的阻值

T25:25℃下的开尔文温度,也就是298.15K

Tn:此时计算得到的实际开尔文温度(要得到摄氏度 C=Tn-273.15 )

代码如下

在头问价中定义的一些参数

#define T25 298.15    //电压转温度的公式的采用
#define R25 10
#define B   3435
//实现ln(x) 的计算
double myln(double a)
{int N = 15;//取了前15+1项来估算int k,nk;double x,xx,y;x = (a-1)/(a+1);xx = x*x;nk = 2*N+1;y = 1.0/nk;for(k=N;k>0;k--){nk = nk - 2;y = 1.0/nk+xx*y;}return 2.0*x*y;
}float Get_Kelvin_Temperature(u16 t)
{float N1,N2,N3,N4;float Rntc = temp_Get_R(t);N1 = (myln(R25)-myln(Rntc))/B;N2 = 1/T25 - N1;N3 = 1/N2;N4 = N3-273.15;//开尔文转摄氏度return N4;
}

4、主函数

float temp2 = Get_Kelvin_Temperature(adct);
u16 t = (u16)temp2;
OLED_ShowNum(1,7,t,4);//工作范围是20-80

四、实物情况

T是热敏电阻测的温度 12度

temperature 是之前用DHT11测的温度,12度 ,两者之间误差很小,说明ok了家人们。。。。

STM32 热敏电阻测量温度相关推荐

  1. 传感器_高精度热敏电阻测量温度算法_有序浮点型数据使用二分法查询最接近的值

    引言 最近项目上做了一个利用热敏电阻测量温度的功能.热敏电阻的阻值可以通过ADC采集电压测量得到.NTC 热敏电阻的阻值和温度之间有一个关系. R t = R n ⋅ e B ( 1 T − 1 T ...

  2. 用STM32单片机ADC+NTC热敏电阻采集温度的设计思路 | 附参考电路

    目录 前言 一.热敏电阻NTC 二.参考电路 三.激励电压选择 前言 记录一些我在工作和学习过程中遇到的问题 NTC:在淘宝随便买的 单片机型号:STM32G030C8T6 目的:用单片机采集NTC温 ...

  3. 一种基于NTC热敏电阻测量的温度模块

    一种基于NTC热敏电阻测量的温度模块 设计初衷和经历: 设计这块温度采集模块时,最初的用途在冰箱的检测线,通过485总线的方式,采集每个工位的冰箱关键节点的温度.后因为工作变动,加以改进,增加了三相电 ...

  4. NTC热敏电阻检测温度

    1.NTC热敏电阻.PTC热敏电阻 下图是NTC热敏电阻和PTC热敏电阻随温度变化,电阻值的变化曲线,可以看到: NTC随温度变化阻值的变化比较明显,对温度变化比较灵敏. 但是,NTC阻值随温度变化并 ...

  5. NXP公司LPC21xx+热敏电阻实现温度检测

    LPC2131/32/34/36/38微控制器基于16位/32位Arm7TDMI-S™CPU,支持实时仿真和嵌入式跟踪,具有尺寸小,功耗低,多个32位定时器.单/双10位8通道ADC.10位DAC.P ...

  6. 51 Proteus仿真NTC热敏电阻温度测量温度控制系统-0016

    51 Proteus仿真NTC热敏电阻温度测量温度控制系统-0016 Proteus仿真小实验: 51 Proteus仿真NTC热敏电阻温度测量温度控制系统-0016 功能: 硬件组成:51单片机 + ...

  7. 影响NTC热敏电阻测量的三大因素-凯利讯半导体

    对热敏电阻器所指定的主要特征是电阻随温度的变化.这种变化允许使用的热敏电阻来测量温度.影响热敏电阻器性能的其它参数是自加热,热时间常数和误差.一个热敏电阻的效果是基于电阻-温度曲线,它提供了用于评估热 ...

  8. 如何利用PN结来测量温度?

    简 介: 根据PN结的电流电压方程,可以看到它与PN温度有关,基于此可以用于测量环境或者芯片内部的温度.选择NPN,PNN三极管(2N3906,2N3904)所得到的温度比起普通的PN届更加的精确.本 ...

  9. 18b20温度检测及其lcd显示_单片机使用DS18B20测量温度的程序

    \ 单片机使用DS18B20测量温度的程序 //main.c #include #include #include "18B20.h" #include"disp.h&q ...

  10. 【STM32学习】(30)STM32实现18B20温度采集(标准库和HAL库实现)

    单片机型号:STM32F103 源码下载链接:(2条消息) STM32实现18B20温度采集(标准库和HAL库实现)-电信文档类资源-CSDN下载 现要求完成温度采集并在串口或液晶屏上显示.我们这里使 ...

最新文章

  1. centos7下解决tomcat启动慢的问题
  2. 老web换新枝----Sails.js移动设备的全新生产力(五)
  3. ASP.NET Atlas简单控件介绍——Sys.Component基类与Sys.UI.Control基类
  4. .net ef 字段不区分大小写_第六节:框架搭建之EF的Fluent Api模式的使用流程
  5. 小数据作为解题关键:
  6. python界面-Python GUI 编程(Tkinter)
  7. Android中GridView实现互相添加和删除
  8. java synchronized互斥锁使用
  9. 将Windows网络适配器共享网络的ip:192.168.137.1 改为其他IP
  10. 2019年最新-等保测评机构、等保测评公司、信息安全厂商大全
  11. word使用学习总结
  12. R语言ROC分析、ROC曲线可视化及最佳阈值计算(threshold、cutoff)
  13. 线性方程组matlab解法,线性方程组解法及其MATLAB实践
  14. Oracle的LAST_DAY函数
  15. 计算机启动时滴滴两声,电脑开机时出现滴滴两声后,不能开机,怎么回事。
  16. 继电器分类及性能对比
  17. 平均获客成本_获客成本(线上,线下)如何计算?
  18. 12月2日科技资讯|微信回应发原图泄露位置信息;Linux Kernel 5.4.1 发布
  19. 万石谷,粒粒积累;千丈布,根根织成 ——随笔第二弹
  20. 手拉手微商俱乐部 微信营销实战课程开讲啦

热门文章

  1. 9个免费的矢量图网站
  2. java 多音词语转拼音_一种多音字汉字转拼音全拼的方法与流程
  3. 抢票软件开发(二) 模拟登录
  4. 判断单链表是否中心对称算法
  5. 1212:LETTERS
  6. 小知识:移动硬盘打不开是什么原因造成的?
  7. 愚人节,你的微信公众号图文排版够愚吗?
  8. 如何写好一篇技术型文档?
  9. flutter type ‘Null‘ is not a subtype of type ‘String‘
  10. 区块链入门导航-磨链社区