温湿度采集实验

发布者:WanderlustGaze最新更新时间:2024-06-25 来源: elecfans关键字:STM32  温度传感器 手机看文章 扫描二维码
随时随地手机看文章

11.1 实验简介

11.1.1 温度采集方案概述

本实验采用三种方式来获取温湿度值,一种是STM32芯片内部自带的温度传感器,一种是基于单总线协议的DS18B20温度传感器,还有一种就是温湿度传感器DHT11或者DHT22,但是在成本上DHT22比较高,所以实验仅使用DHT11,DS18B20和内部温度传感器进行。

11.1.2 单线协议

单总线协议是美国的达拉斯公司推出的一款总线通信协议,所谓单线协议,就是通过一根线传输所有的数据,通俗地讲就是根据低电平的时间来判断总线上的数据是0还是1,比如拉低总线10us,就认为发送的是1,拉低总线50us,就认为发送的是0,单总线协议中,有3种时序,即写时序,读时序和检测时序。我们在51单片机开发中已经尝试用51单片机通过单总线协议读取DS18B20的温度值,故这里不再详细描述协议的具体内容。

11.2 传感器介绍

11.2.1 内部温度传感器

STM32F103有一个内部温度传感器,可以用于测量CPU以及周围的温度,这个温度传感器在内部和ADC模块的通道16相连,这个通道用于将传感器输出的电压值转换为数字编码,根据手册得到推荐的采样时间是17.1us,STM32内部温度传感器支持的温度范围为-40~+125℃,精度在±1.5℃左右。


   根据手册提供的电压与温度转换公式如下所示。

图片


其中V25代表传感器在25℃时候的数值,典型值为1.43



K代表温度与Vsense曲线的平均斜率,典型值为4.3mV/℃


Vsense代表实际温度传感器输出的数值。


通过上面的公式,我们就可以方便地计算出当前的实际温度。


11.2.2 DS18B20温度传感器

DS18B20是一款测温范围在-55~+125℃,精度在±0.5℃的高精度数字式温度传感器,可以通过单线接口直接读取出被测物体的温度,测温精度可以通过编程实现,工作电压3~5.5V。值得一提的是,DS18B20内部具有64位序列号是出厂就被设定的,每一个DS18B20的序列号均不相同,其中前8位是产品家族码,中间48位是序列号,最后8位是CEC校验码,这就可以实现1根总线上挂接多个DS18B20。

(1)复位与应答脉冲


单总线上的所有通信都是以初始化序列开始。主机输出低电平,保持低电平时间至少480us,以产生复位脉冲。接着主机释放总线,4.7K的上拉电阻将单总线拉高,延时15~60us,并进入接收模式。接着从设备拉低总线60~240us,以产生低电平应答脉冲,若为低电平,再延时480us。

(2)写时序


写时序包括写0时序和写1时序。所有写时序至少需要60us,且在2次独立的写时序之间至少需要1us的恢复时间,两种写时序均起始于主机拉低总线。写1时序:主机输出低电平,延时2us,然后释放总线,延时60us。写0时序:主机输出低电平,延时60us,然后释放总线,延时2us。

(3)读时序


必须马上产生读时序,以便从机能够传输数据。所有读时序至少需要60us,且在2次独立的读时序之间至少需要1us的恢复时间。每个读时序都由主机发起,至少拉低总线1us。主机在读时序期间必须释放总线,并且在时序起始后的15us之内采样总线状态。典型的读时序过程为:主机输出低电平延时2us,然后主机转入输入模式延时12us,然后读取单总线当前的电平,然后延时50us。

(4)DS18B20测温时序


DS18B20的典型温度读取过程为:复位->发送跳过ROM读取命令(0XCC)->发开始转换命令(0X44)->延时复位->发送跳过ROM读取命令(0XCC)->发读存储器命令(0XBE)->连续读出两个字节温度->结束。

11.2.3 DHT11温湿度传感器

DHT11是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。通过单片机等微处理器简单的电路连接就能够实时的采集本地湿度和温度。DHT11与单片机之间能采用简单的单总线进行通信,仅仅需要一个I/O口。传感器内部湿度和温度数据40Bit的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。DHT11功耗很低,5V电源电压下,工作平均最大电流0.5mA。


   DHT11的电参数如下所示。

(1)工作电压:3.3V~5.5V


(2)工作电流:平均0.5mA


(3)测量范围:湿度2090%RH,温度050℃


(4)测量精度:湿度±5%,温度±2%℃


(5)分辨率:湿度1%,温度1℃


DHT11数字式温湿度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由5个字节组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。DHT11的数据格式为:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和。其中校验和数据为前四个字节相加。传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。


   DHT11的 **开始时序** ,即:拉低数据线,保持至少18ms,然后拉高数据线20~40us,然后读取DHT11的响应,正常的话,DHT11会拉低数据线,保持40~50us,作为响应信号,然后DHT11拉高数据线,保持40~50us后,开始输出数据。

11.3 STM32片内ADC简介

11.3.1 内部ADC概述

STM32F103拥有1~3个ADC,这些ADC可以独立使用,也可以使用双重模式(提高采样率)。STM32的ADC是12位逐次逼近型的模拟数字转换器。它有18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。STM32F103系列最少都拥有2个ADC,我们选择的STM32F103ZET包含有3个ADC。


STM32的ADC最大的转换速率为1Mhz,也就是转换时间为1us(在ADCCLK=14M,采样周期为1.5个ADC时钟下得到),不要让ADC的时钟超过14M,否则将导致结果准确度下降。STM32将ADC的转换分为2个通道组:规则通道组和注入通道组。规则通道相当于你正常运行的程序,而注入通道就相当于中断。在程序正常执行的时候,中断是可以打断执行的。同这个类似,注入通道的转换可以打断规则通道的转换,在注入通道被转换完成之后,规则通道才得以继续转换。

11.3.2 ADC相关寄存器

(1)ADC控制寄存器1:ADC_CR1

31302928272625242322212019181716
-AWDENAWDENJ-FUALMOD[3:0]










1514131211109876543210
DISCNUM[2:0]DISCENJDISCENJAUTOAWDSGLSCANJEOCIEAWDIEEOCIEAWDCH[4:0]





Bit 23:在规则通道上开启模拟看门狗


0:在规则通道上禁用模拟看门狗


   1:在规则通道上使用模拟看门狗

Bit 22:在注入通道上开启模拟看门狗


0:在注入通道上禁用模拟看门狗


   1:在注入通道上使用模拟看门狗

Bit 19~Bit16:双模式选择


0000:独立模式


   0001:混合的同步规则+注入同步模式


   0010:混合的同步规则+交替触发模式


   0011:混合同步注入+快速交叉模式


   0100:混合同步注入+慢速交叉模式


   0101:注入同步模式


   0110:规则同步模式


   0111:快速交叉模式


   1000:慢速交叉模式


   1001:交替触发模式

Bit 15~Bit 13:间断模式通道计数


000:1个通道


   001:2个通道


   ……


   111:8个通道

Bit 12:在注入通道上的间断模式


0:注入通道组上禁用间断模式


   1:注入通道组上使用间断模式

Bit 11:在规则通道上的间断模式


0:规则通道组上禁用间断模式


   1:规则通道组上使用间断模式

Bit 10:自动的注入通道组转换


0:关闭自动的注入通道组转换


   1:开启自动的注入通道组转换

Bit 9:扫描模式中在一个单一的通道上使用看门狗


0:在所有的通道上使用模拟看门狗


   1:在单一通道上使用模拟看门狗

Bit 8:扫描模式


0:关闭扫描模式


   1:使用扫描模式

Bit 7:允许产生注入通道转换结束中断


0:禁止JEOC中断


   1:允许JEOC中断

Bit 6:允许产生模拟看门狗中断


0:禁止模拟看门狗中断


   1:允许模拟看门狗中断

Bit 5:允许产生EOC中断


0:禁止EOC中断


   1:允许EOC中断

Bit 4~Bit 0:模拟看门狗通道选择位


00000:ADC模拟输入通道0


   00001:ADC模拟输入通道1


   ……


   01111:ADC模拟输入通道15


   10000:ADC模拟输入通道16


   10001:ADC模拟输入通道17


(2)ADC控制寄存器2:ADC_CR2

31302928272625242322212019181716
-TSVREFSWSTARTSWSTARTJEXTTRIGEXTSEL[2:0]-








1514131211109876543210
JEXTTRIGJEXTSEL[2:0]ALIGN-DMA-RSTCALCALCONTADON






Bit 23:温度传感器和VREFINT使能


0:禁止温度传感器和VREFINT


   1:启用温度传感器和VREFINT

Bit 22:开始转换规则通道


0:复位状态


   1:开始转换规则通道

Bit 21:开始转换注入通道


0:复位状态


   1:开始转换注入通道

Bit 20:规则通道的外部触发转换模式


0:不用外部事件启动转换


   1:使用外部事件启动转换

Bit 19~Bit 17:选择启动规则通道组转换的外部事件


ADC1和ADC2的触发配置如下


   000:定时器1的CC1事件


   001:定时器1的CC2事件


   010:定时器1的CC3事件


   011:定时器2的CC2事件


   100:定时器3的TRGO事件


   101:定时器4的CC4事件


   110:EXTI线11/TIM8_TRGO事件,仅大容量产品具有TIM8_TRGO功能


   111:SWSTART


   ADC3的触发配置如下


   000:定时器3的CC1事件


   001:定时器2的CC3事件


   010:定时器1的CC3事件


   011:定时器8的CC1事件


   100:定时器8的TRGO事件


   101:定时器5的CC1事件


   110:定时器5的CC3事件


   111:SWSTART

Bit 15:注入通道的外部触发转换模式


0:不用外部事件启动转换;


1:使用外部事件启动转换。


Bit 14~Bit 12:选择启动注入通道组转换的外部事件


ADC1和ADC2的触发配置如下


   000:定时器1的TRGO事件


   001:定时器1的CC4事件


   010:定时器2的TRGO事件


   011:定时器2的CC1事件


   100:定时器3的CC4事件


   101:定时器4的TRGO事件


   110:EXTI线15/TIM8_CC4事件,仅大容量产品具有TIM8_CC4


   111:JSWSTART


   ADC3的触发配置如下


   000:定时器1的TRGO事件


   001:定时器1的CC4事件


   010:定时器4的CC3事件


   011:定时器8的CC2事件


   100:定时器8的CC4事件


   101:定时器5的TRGO事件


   110:定时器5的CC4事件


   111:JSWSTART

Bit 11:数据对齐


0:右对齐


   1:左对齐

Bit 8:直接存储器访问模式


0:不使用DMA模式


   1:使用DMA模式

Bit 3:复位校准


0:校准寄存器已初始化


   1:初始化校准寄存器

Bit 2:A/D校准


0:校准完成


   1:开始校准

Bit 1:连续转换


0:单次转换模式


   1:连续转换模式

Bit 0:开/关A/D转换器


0:关闭ADC转换/校准,并进入断电模式


   1:开启ADC并启动转换


(3)ADC采样事件寄存器1:ADC_SMPR1

31302928272625242322212019181716
-SMP17[2:0]SMP16[2:0]SMP15[2:1]











1514131211109876543210
SMP15_0SMP14[2:0]SMP13[2:0]SMP12[2:0]SMP11[2:0]SMP10[2:0]









SMPx[2:0]:选择通道x的采样时间


000:1.5周期


   001:7.5周期


   010:13.5周期


   011:28.5周期


   100:41.5周期


   101:55.5周期


   110:71.5周期


   111:239.5周期

(4)ADC采样事件寄存器2:ADC_SMPR2

31302928272625242322212019181716
-SMP9[2:0]SMP8[2:0]SMP7[2:0]SMP6[2:0]SMP5[2:1]









1514131211109876543210
SMP5_0SMP4[2:0]SMP3[2:0]SMP2[2:0]SMP1[2:0]SMP0[2:0]










SMPx[2:0]:选择通道x的采样时间


000:1.5周期


   001:7.5周期


   010:13.5周期


   011:28.5周期


   100:41.5周期


   101:55.5周期


   110:71.5周期


   111:239.5周期

(5)ADC规则序列寄存器1:ADC_SQR1

31302928272625242322212019181716
-L[3:0]SQ16[4:1]












1514131211109876543210
SQ16_0SQ15[4:0]SQ14[4:0]SQ13[4:0]











Bit 23~Bit 20:规则通道序列长度


0000:1个转换


   0001:2个转换


   ……


   1111:16个转换

Bit 19Bit 15:规则序列中的第16个转换,这些位由软件定义转换序列中的第16个转换通道的编号(017)


Bit 14~Bit 10:规则序列中的第15个转换


Bit 9~Bit 5:规则序列中的第14个转换


Bit 4~Bit 0:规则序列中的第13个转换


(6)ADC规则序列寄存器2:ADC_SQR2

31302928272625242322212019181716
-SQ12[4:0]SQ11[4:0]SQ10[4:0]











1514131211109876543210
SQ10_0SQ9[4:0]SQ8[4:0]SQ7[4:0]











Bit 29~Bit 25:规则序列中的第12个转换

Bit 24~Bit 20:规则序列中的第11个转换

Bit 19~Bit 15:规则序列中的第10个转换

Bit 14~Bit 10:规则序列中的第9个转换

Bit 9~Bit 5:规则序列中的第8个转换

Bit 4~Bit 0:规则序列中的第7个转换

(7)ADC规则序列寄存器3:ADC_SQR3

31302928272625242322212019181716
-SQ6[4:0]SQ5[4:0]SQ4[4:0]











1514131211109876543210
SQ4_0SQ3[4:0]SQ2[4:0]SQ1[4:0]











Bit 29~Bit 25:规则序列中的第6个转换

Bit 24~Bit 20:规则序列中的第5个转换

Bit 19~Bit 15:规则序列中的第4个转换

Bit 14~Bit 10:规则序列中的第3个转换

Bit 9~Bit 5:规则序列中的第2个转换

Bit 4~Bit 0:规则序列中的第1个转换

(8)ADC数据寄存器:ADC_DR和ADC_JDR


数据寄存器分为DR和JDR,其中DR中存储的是规则序列转换后的值,JDR存储的则是注入序列转换后的值。其中ADC_DR寄存器的结构如下图所示。


31302928272625242322212019181716
ADC2_DATA[15:0]














1514131211109876543210
DATA[15:0]














Bit 31~Bit16:ADC2转换的数据,在ADC1中:双模式下,这些位包含了ADC2转换的规则通道数据

Bit 15~Bit 0:规则转换的数据:包含了规则通道的转换结果,数据是左对齐或右对齐

(9)ADC状态寄存器:ADC_SR

1514131211109876543210
-STRTJSTARTJEOCEOCAWD









Bit 4:规则通道开始位


0:规则通道转换未开始


   1:规则通道转换已开始

Bit 3:注入通道开始位


0:注入通道组转换未开始


   1:注入通道组转换已开始

Bit 2:注入通道转换结束位


0:转换未完成


   1:转换完成

Bit 1:转换结束位


0:转换未完成


   1:转换完成

Bit 0:模拟看门狗标志位


0:没有发生模拟看门狗事件


   1:发生模拟看门狗事件

11.4 内部温度传感器例程

功能实现:采用内部温度传感器读取温度显示在TFTLCD上。


(1)创建adc.h文件,并输入以下代码。


#ifndef _ADC_H_

#define _ADC_H_



#include 'sys.h'

/*********************************************************************************************************

                    函    数    列    表

*********************************************************************************************************/

void ADC_Init( void ) ;                                          //初始化ADC1

u16 Get_Adc_Average( u8 ch, u8 times ) ;                                //获取通道ch的转换均值

short Get_Temprate( void ) ;                                      //获取温度值



#endif

(2)创建adc.c文件,并输入以下代码。


#include 'adc.h'

#include 'delay.h'

/***************************************************

Name    :ADC_Init

Function  :初始化ADC1

Paramater  :None

Return    :None

***************************************************/

void ADC_Init()

{

  //先初始化IO口

   RCC->APB2ENR |= 1<<2 ;                                        //使能PORTA口时钟

  GPIOA->CRL &= 0XFFFFFF0F ;                                      //PA1 anolog输入

  RCC->APB2ENR |= 1<<9 ;                                        //ADC1时钟使能

  RCC->APB2RSTR |= 1<<9 ;                                        //ADC1复位

  RCC->APB2RSTR &= ~( 1<<9 ) ;                                    //复位结束

[1] [2] [3] [4]
关键字:STM32  温度传感器 引用地址:温湿度采集实验

上一篇:舵机中的直流电机控制原理和方法
下一篇:一种新型室内盆栽智能浇灌系统

推荐阅读最新更新时间:2026-03-21 06:08

简述温度传感器DS18B20原理内附STM32例程代码
DS18B20是一款常用的高精度的单总线数字温度测量芯片。具有体积小,硬件开销低,抗干扰能力强,精度高的特点。 传感器参数 测温范围为-55℃到+125℃,在-10℃到+85℃范围内误差为±0.4° 返回16位二进制温度数值 主机和从机通信使用单总线,即使用单线进行数据的发送和接收 在使用中不需要任何外围元件,独立芯片即可完成工作 掉电保护功能 DS18B20 内部含有 EEPROM ,通过配置寄存器可以设定数字转换精度和报警温度,在系统掉电以后,它仍可保存分辨率及报警温度的设定值 每个DS18B20都有独立唯一的64位-ID,此特性决定了它可以将任意多的DS18b20挂载到一根总线上,通过ROM搜索读取相应DS1
[单片机]
简述<font color='red'>温度传感器</font>DS18B20原理内附<font color='red'>STM32</font>例程代码
STM32学习日志——内部温度传感器实验
一、内部温度传感器简介 STM32有一个内部温度传感器,与ADCx的通道16相连,主要用来测量CPU及周围的温度,推荐采样时间为17us,测量温度范围为-40至125度,精度较差,可能有正负1.5度的误差,更适合用来检测温度的变化,因为它的温度差值还是比较准确的。 二、配置函数 1)设置ADC,开启内部温度传感器,与上一讲类似; 2)读取ADC值,读取平均值,也与上一讲类似; 3)根据得到的ADC值转换成温度值;公式如下: T(℃)={(V25-Vsense)/Avg_Slope}+25 其中:V25=Vsense 在 25 度时的数值(典型值为:1.43)。 Avg_Slope=温度与 Vsense 曲线的平均斜率(单位
[单片机]
STM32入门开发: 编写DS18B20温度传感器驱动(读取环境温度、支持级联)
一、环境介绍 编程软件: keil5 操作系统: win10 MCU型号: STM32F103C8T6 STM32编程方式: 寄存器开发 (方便程序移植到其他单片机) 温度传感器: DS1820 DS18B20是一个数字温度传感器,采用的是单总线时序与主机通信,只需要一根线就可以完成温度数据读取; DS18B20内置了64位产品序列号,方便识别身份,在一根线上可以挂接多个DS18B20传感器,通过64位身份验证,可以分别读取来至不同传感器采集的温度信息。 二、DS18B20介绍 2.1 DS18B20 的主要特征 1. 全数字温度转换及输出。 2. 先进的单总线数据通信。 3. 最高 12 位
[单片机]
<font color='red'>STM32</font>入门开发: 编写DS18B20<font color='red'>温度传感器</font>驱动(读取环境温度、支持级联)
STM32中ADC的使用/printf函数重定向串口显示内部温度传感器测量值
STM32F334C8T6这款MCU中有两个12位ADC(模数转换器),ADC1的通道16连接到内置的一个温度传感器,本文使用该温度传感器测量MCU和周围的环境温度,并且通过串口发送到PC的串口助手进行显示。 1. ADC的使用 1. select the ADC clock using the function RCC_ADCCLKConfig() 2. Enable the ADC interface clock using RCC_AHBPeriphClockCmd(); 3. ADC pins configuration  Enable the clock for the ADC GPIOs using the fo
[单片机]
<font color='red'>STM32</font>中ADC的使用/printf函数重定向串口显示内部<font color='red'>温度传感器</font>测量值
STM32的内部温度传感器
1、STM32的内部温度传感器 STM32内部温度传感器与ADC的通道16相连,与ADC配 合使用实现温度测量。测量范围–40~125℃,精度 ± 1.5℃ 操作流程: 1)、设置ADC相关参数 // ADC1 configuration ----------------------------- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructu
[单片机]
基于STM32的MS5540c压强温度传感器的应用
3.5的库函数,stm32f10x系列的mcu,网上这个芯片的实例较少,而官方的代码an510这个文档找不到下载,datasheet写的也不甚明了。下面贴上我的基本程序给大家一个参考: #include main.h #include Flash_LED.h #include SPI_MS5540C.h #include SysTick.h vu32 led_timer = 0; extern vu32 global_timer; uint8_t detect_timer=0; vu16 var_D1=0,var_D2=0; int main() { SystemInit(); NVIC_SetVectorTable(NVIC
[单片机]
STM32单片机(11) DS18B20温度传感器实验
本程序主要实现 DS18B20温度传感器数据获取,并利用串口通信把温度数据传至计算机 注:使用普中科技开发板测试时,需要拔掉Boot1插口,因为用到的是PA15管脚, 由开发板电路图可知,需要改变PA15 管脚的映射,将其设置成普通IO口 参考资料 DS18B20中文手册.pdf http://download.csdn.net/detail/leytton/7742193 STM32-外设篇 视频教程(Cortex-M3)-主讲人:刘洋 http://yun.baidu.com/pcloud/album/info?uk=2853967793&album_id=5492137931588632574 main.c /**
[单片机]
基于STM32 I2C的TMP101温度传感器的C源码
搞这个历程差不多花了我一个周末的时间,一片小小的TMP101确实让我破费脑筋。最后甚至使用了示波器直接观察SDA SCL 的波形。不过示波器的使用确实纠正我一个严重且低级的错误。这期间也在网上搜过STM32 的I2C 应用 大多都是在说 STM32 的I2C固件库写的烂、STM32的硬件有问题、I2C接口没法用等等,最后解决方式都是用软件像51那样用IO口软件模拟IIC时序。但我看了STM32最新的勘误表,根本没有所谓STM32的IIC硬件设计缺陷。我可不想把STM32用的像8051一样。我要用高效的硬件I2C而且要用ST官方库来实现~! 心得: 函数 I2C_CheckEvent () 这个典型的用法是 while(!
[单片机]
基于<font color='red'>STM32</font> I2C的TMP101<font color='red'>温度传感器</font>的C源码
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved