锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

STM32 计算机课程设计技术点记录

时间:2022-12-23 00:00:00 0550传感器

目录

  • DS18B20
    • 一、DS18b20 相关背景知识
    • 二、DS18b20原理图和数据手册
      • 1、内部方框图:
      • 2、DS18B20 Memory Map
      • 3.详细说明内部寄存器:
      • 4、DS18b20 单总线协议
    • 三、时序图
      • 1、初始化时序:
      • 2、读写时序
    • 四、ds18b20温度转换
  • AD转换
    • 一、AD转换及相关背景知识
      • 1、基本概念
      • 2、A/D转换的原理
      • 3、A/D转换中的主要概念
    • 二、实战 AD 转换
      • 1.原理图和数据手册
  • MQ2 研究

DS18B20

ds18b20的使用:

  • ds18b20 是一个单总线的设备,定制化我们必须通过协议编程实现此协议。
  • 协议是一种规定的语言,或者需要通过编程来执行。

单许多形式的单总线:

  • uart 的 RX、TX。
  • IIC 的 data 线。
  • SPI 的 data 线。

一、DS18b20 相关背景知识

1.温度传感器

(1)测温方法:物理(汞柱、气压)、电子(金属电性能随温度变化)

(2)早期:热敏电阻(模拟接口)

  • 这很麻烦。我们需要自己添加一个 AD 转换通道。(电压也是模拟信号,0、1是数字信号)
  • 你必须使用电压值来转换温度,这将涉及到校准等等一堆麻烦。

(3)现代:专用sensor

  • 数字接口,如I2C、DS18B单总线接口等。

  • DS18b20 会温度值直接返回,我们只需要按照一定的顺序读取。

  • 我们不需要这样做 AD 当然,转化也节省了验证工作。

总结:现代比早期有什么优势?

  • 我们根本不需要知道测温的原理是什么,只需要看数据手册。
  • 只需通过数据手册知道如何读取温度。

2、DS18B20的基本特征

(1)内置集成ADC,外部数字接口。布线成本低

(2)温度范围宽,精度高(相对)分辨率位数软件设置。

  • 测量精度高 DS18B20 测量范围为 -55 ℃ ~ 125 ℃ ; 在 -10~ 85°C精度在范围内 ± 0.5°C 。
  • 通过程序设置测量分辨率 9~12 位。

(3)温度阈值报警功能,阈值可内置存储,不丢失

  • DS18B20 内部含有EEPROM,系统断电后,仍能保存分辨率和报警温度的设定值。

(4)温度采集速度快(750ms)

  • 在给他发送收集命令后,我们至少需要等待 750ms 读取相应的温度值。

(5)内置唯一64位序列码,CPU可以单线串联无限多个DS18B20。

(6)支持VDD寄生电源可通过数据总线和内部电容供电。

  • 数据线 DQ 在高电平时,会给其内部充电。当他处于低电平时,电容器会放电,从而给它 DS18b20进行供电。
  • 所以数据线 DQ 也可作为供电总线。(只是续航时间短)
  • 因此,当数据线闲置时,有必要 DQ 拉高电平。

二、DS18b20原理图和数据手册

1、内部方框图:

前一部分:与供电有关。 64-bit ROM:存放唯一的 64 位序列码。

临时存储器:相当于寄存器 RAM 和 ROM 组合。(里面有 9 个字节)

image-20211120173329974


2、DS18B20 Memory Map

  • 内部一共有 9 个字节,有 RAM ,也有 ROM。
  • power-up state:上电状态。
  • 0x0550 代表 85℃。


3.详细说明内部寄存器:

(1)温度寄存器:

  • 分为高字节和低字节。记录当前温度传感器的温度值。
  • 最多只有 12 bit 它是有效的,可以通过配置寄存器进行调整。默认上电 12 bit。
  • S = 0 代表温度, S = 1 代表温度
  • 默认值为 0x0550 代表 85℃。

(2)用户定制温度阈值:

  • 掉电不丢失
  • 我们通常不使用这个温度阈值寄存器。

(3)Configuration Reegister:

  • bit5、bit6 可组合。其他位置是固定的。
  • 用来配置 9bit、10bit、11bit、12bit 的模式。(0.5、0.25、0.125、0.0625)(默认是 12 位)

(4)64bit 的ROM标识码


4、DS18b20 单总线协议

(1)单总线协议概述:

  • 先搞定自己的系统。 单点或多点。
  • DS18b20 总线上的数据是 LSB (一个字节是从最低水平开始先传输的)

(2)讨论单总线系统分为以下三个方面:

  • 硬件结构:

    • 单总线要求:漏极开路式 5K欧姆的上拉电阻
    • 总线低电平超过 480us,将从设备中复位。
  • 执行顺序 (transaction sequence)

    • 初始化
    • ROM Command
    • DS18B20 Function Command

三、时序图

1、初始化时序:

注意点:

  • 要及时切换 GPIO 注意他是输出状态还是输入状态。(输入状态应检查其对设备的响应)
  • 先由控制发送一个 复位脉冲。(将总线拉到低电平 480us 即可)
  • 再从机发送一个 存在脉冲。(让制器知道总线上面的 18b20 已经准备好了,本质也是拉低电平)


2、读写时序

(1)写时序:

  • 所有的写时序必须持续 60 us。(18b20 会自动读取这这个写时序)
  • 两个写周期之间,必须要有 1us 的恢复时间
  • 当总线控制器把数据线 从逻辑高电平拉到低电平的时候,写时序开始,然后低电平持续15us,然后进行释放总线。(外部的上拉电阻,保证了默认情况下总线是低电平)
  • DS18B20 会自动在一个 15us-60us 对总线上的数据进行采样。

注意!!!

写 “0” 的时候注意点:

  • 这里省略了一步:从逻辑高电平拉到低电平的时候,写时序开始,然后低电平持续15us,然后进行释放总线。(没有释放总线)
  • 我们要保证在 15-60 us 的区间,保持电平为 0。
  • 写完一个 bit 之后,恢复时间至少要有 1us。

写 “1” 的时候注意点:(这个就很典型)

  • 写时序的开始,必须先拉低总线,然后再释放总线。
  • 有一个阴影部分:说明释放时间是没有被严格要求的,可以有一定的余量。(只是至少要有 1us 的持续低电平的时间)
void DS18B20_Write_Byte(u8 dat)     
 { 
                     
    u8 j;
    u8 testb;
	DS18B20_IO_OUT();	//SET PG11 OUTPUT;
    for (j=1;j<=8;j++) 
	{ 
        
        testb=dat&0x01;  // 先取出 data 的最低位,因为这个总线式 LSB 模式,先发送低字节。
        dat=dat>>1;  	
        if (testb) 
        { 
        
            // Write 1
            setDS18B20(0);	// 先将总线拉低,标志写时序的开始
            delay_us(2);    // 延时 
            setDS18B20(1);  // 然后将总线拉高,实际写入 1
            delay_us(60);             
        }
        else 
        { 
        
            // Write 0
            setDS18B20(0);	// 先将总线拉低,标志写时序的开始 (省略 释放总线的过程)
            delay_us(60);   // 直接写入 0 
            setDS18B20(1);  // 写入完成之后,再释放总线
            delay_us(2);    // 确保恢复时间 
        }
    }
}

(2)读时序:

  • 也要注意 GPIO 的模式变换,注意什么时候搞成输入模式、什么时候搞成输出模式。

  • 控制器先拉低总线,并且在 1us 后释放总线。(拉高、配置成上拉输入模式) (时序图在读 “0” 的时候没有体现释放,读 “1” 的时候体现)

  • 然后 ds18b20 就会将对应的值,放到总线上面。控制器必须要 在前15us,将其读走。

  • 后面 45us 没有什么作用。只需要进行延时即可。(因为整个读周期,必须持续 60us,所以需要进行等待)

u8 DS18B20_Read_Bit(void) 	 
{ 
        
    u8 data;
	DS18B20_IO_OUT();	// 将其配置为输出模式
    setDS18B20(0);  // 将总线拉低
	delay_us(2);      // 延时 2 us
    setDS18B20(1);  // 释放总线(低电平可以覆盖高电平)(将总线拉高,然后配置成输入模式)
	DS18B20_IO_IN();	// SET PG11 INPUT
	delay_us(12);     // 
	if(getDS18B20()) data=1;
    else data=0;	 
    delay_us(50);   // 恢复时间 
    return data;
}

u8 DS18B20_Read_Byte(void)     
{ 
                
    u8 i,j,dat;
    dat=0;
	for (i=1;i<=8;i++) 
	{ 
        
        j=DS18B20_Read_Bit();   // 先读到了最低位
        dat=(j<<7)|(dat>>1);    // 先放到最高位,然后不断左移
        // dat |= ( j << (8-i)) // 直接按照顺序进行存放 
    }						    
    return dat;
}

四、ds18b20进行温度转换

1、温度获取流程
(1)DS18B20自己本身不会主动去进行温度测量,而是需要主控CPU主动发起一个温度转换的过程,这么设计是因为温度转换本身是要耗电的,所以设计为平时待机等待温度转换命令后才去进行温度AD转换。

(2)主控CPU和DS18B20之间的通信是分周期的,譬如我们要让DS18B20进行温度转换就是一个周期。这个周期包含一个初始化+N个命令。(每个周期的开始都要有一个初始化,然后跟着N个命令)

(3)初始化过程主要是探测目标DS18B20是否存在,若存在将芯片初始化。

(4)命令很重要。所以DS18B20是一个典型的“命令-响应”型外设。学习这种外设的关键是命令集。

2、ROM操作指令

(1)DS18B20支持多个芯片串联在一根总线上,也就是所谓的单总线协议,所以必须要主控CPU要能够区分总线上多个18B20,因此有个ROM操作指令来完成这个任务。

(2)ROM操作指令和温度采集一点关系都没有,所以当我们总线上只有一个18B20的时候ROM操作指令我们不需要去管。

(3)一旦系统中单总线上有多个18B20,那么我们必须借助ROM操作指令来区分多个18B20,而且这个区分过程可能需要多条ROM指令来完成。

(4)如果系统中只有一个18B20,那么就用一条skip rom命令(0xCC)就可以跳过这个阶段。

3、功能指令

(1)ROM操作指令目的是为了在单总线上多个18B20中挑选到那个当前我们要操作的18B20,而功能指令是为了和选定的18B20通信从而获取温度


1、基本概念

(1)什么是AD转换?(A:analog,模拟的, D:digital,数字的)

  • 现实世界是模拟的连续分布的,无法被分成有限份;(数值是不能突变的)
  • 计算机世界是数字的离散分布的,是可以被分成有限份的;(数值是可以突变的)

举例:

模拟量:电压、电流、温度、液位等等。

  • 在任何情况下被测温度都不可能发生突跳,所以测得的电压信号无论在时间上还是在数量上都是连续的.
  • 这个电压信号在连续变化过程中的任何一个取值都是具体的物理意义,即表示一个相应的温度.
  • 4-20MA 指的是模拟量,对应0–1000ppb 是指的对应值,不是信号。
  • 3.3v 和 3.4v 等价于 25° 和 26 °,同样也是可以被分成无限多个,并不是说他带个 “电” 字,他就是数字的。

数字量:开关(二进制),除了 0 就是 1。(然后再进行换算,才出来其他数字,其实本质就是 0 和 1

(2)AD转换的意义?

  • AD转换就是把一个物理量从模拟的转换成数字的。

  • 将现实世界,在计算机当中进行量化

(3)什么情况下需要AD转换

  • 51单片机只能接入数字量,不能接收模拟量,所以只能先进行 AD 转换。

2、A/D转换的原理

(1)

(2)A/D转换器的实现方法:

  • 计数器式 A/D 转换
  • 双积分式 A/D 转换
  • 逐次逼近式 A/D 转换 (主要分析这一个)

(3)常用的 A/D 转换器件

  • 8位的 ADC0808、ADC0809
  • 12位的 ADC574

(4)AD转换在系统当中的存在方式:

  • CPU 外部扩展专用 AD 芯片。
  • CPU 内部集成 AD 模块。

3、A/D转换当中的主要概念

(1)位数:转换出来的数字,由几个二进制来进行表示。(决定了其每一个位的精度

  • 位数多的,精度越高,每一位表示的更加精准
  • 位数少的,精度越低,每一位表示的更加模糊

(2)量程:A/D转换器 所对应的模拟量的范围

  • 若量程为 4-20mA ,则输入的电流大小不能超过 20 ma,否则会将 AD 转换器烧掉
  • 量程规定了 A/D 转换器对应输入的范围。

(3)精度:表示测量值和真实值的接近程度,有点类似于误差范围。

  • 比如尺子的精度有:0.1mm的,1mm的,1cm的。

  • 它的值和分辨率的值没有关系。是由电子器件的物理因素有关。

  • 在器件生产出来就定好了。

比如一个精度为 0.5、 另外一个精度为 0.1,这两个 A/D 转换器测到值为 3.6

精度为 0.5:只能量出 0.5、1.0、1.5 这样的数字,不认识 3.6 ,所以进行四舍五入后得 3.5,此时误差就成了 0.1。

精度为 0.1:可以直接测出 3.6 ,没有误差。

(4)分辨率:代表AD转换器转出来的二进制数,每一格表示多少

  • 也就是代表每一个二进制位的权值

(5)转换速率(转换时间)

  • 采样率:代表 A/D 转换器,每秒可以采样多少次数据。

举个例子:输入电压范围0-5V,AD转换输出位数是10,精度是0.01V ?

  • 位数:10位

  • 量程:0-5V

  • 分辨率:(5-0)/2exp(10)=0.00488V

  • 譬如一次AD转换后得到的数据是1010101010(170),则对应的电压值为:3.328V,考虑精度后为3.33V


二、实战 AD 转换

1、原理图和数据手册

  • 我们使用的外扩的 AD 转换芯片(ET2046)。

  • AD 转化芯片和CPU 通过 SPI 总线进行连接。(将转化之后的值,通过 SPI 总线进行传输)

(1)分析芯片 ET2046 的特性

  • 支持 1.5V-5.5V 的低压 IO 接口。

  • 高速度:采样率高达 125KHZ (每秒可以采样 125K 次)

  • 支持的接口: SPI、QSPI。

  • 分析一下引脚图:

    • X+、Y+、X-、Y- :这四个引脚为模拟接口,可以输入模拟量
    • DCLK、CS、DIN、DOUT:这四个引脚为 SPI 接口,可以进行 SPI 通信。

  • 分析一下开发板的接线图:
    • 一共有四路的 AD模拟输入:AIN0、AIN1、AIN2、AIN3.
    • X-、Y- 接地,与 X+、Y+ 形成一个参考电压。
    • JSPI:引出来四个SPI通信线,
    • AUX、VBAT :也可以用作 模拟量的输入。
  • 分析一下,怎么讲物理量转化为电压值的呢?
    • 这个电路分为 3 路,3路分别是并联的状态。
    • AIN0 : 是一个滑动变阻器,通过它来改变 AIN0 的电压值。
    • AIN1 :通过电阻103、和 NTC(热敏电阻),来决定它的电压值。
    • AIN1 :通过电阻104、和 GR(光敏电阻),来决定它的电压值。



MQ2 研究

(1)分析传感器的特性:

  • 模拟量输出 0-5V 的电压,气体浓度越高电压越高。(适用于家庭或工厂的气体泄漏监测装置,适宜于液化气、丁烷、丙烷、甲烷、酒精、氢气、烟雾等监测装置。)
  • 4个引脚: VCC 、 GND、 DO0 (数字量输出)、AO0(模拟量输出)

(2)模拟量输出,接到 STM32 单片机的 ADC通道上面,进行 AD 转换。

(3)电压值和浓度的对应关系:在数据手册当中进行查看。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章