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,然后拉高数据线2040us,然后读取DHT11的响应,正常的话,DHT11会拉低数据线,保持4050us,作为响应信号,然后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
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | AWDEN | AWDENJ | - | FUALMOD[3:0] | |||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
DISCNUM[2:0] | DISCENJ | DISCEN | JAUTO | AWDSGL | SCAN | JEOCIE | AWDIE | EOCIE | AWDCH[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