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

Posted 想文艺一点的程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32 计算机课程设计技术点记录相关的知识,希望对你有一定的参考价值。

DS18B20

ds18b20的使用:

  • ds18b20 是一个单总线的设备,定制化的一种协议,我们要通过编程来实现这种协议。
  • 协议就是一种规定语言,还是需要通过编程来将他具体的落实。

单总线:有很多种形式

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

一、DS18b20 相关背景知识

1、温度传感器

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

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

  • 很麻烦,我们需要自己添加一个 AD 转换通道。(电压其实也是一个模拟信号,0、1才是一个数字信号)
  • 自己得利用电压值,来自己进行温度的换算,这就又会涉及到校准等等一堆麻烦事情。

(3)现代:专用sensor

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

  • 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 个字节)


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通信从而获取温度


AD转换

一、AD转换及其相关背景知识

铺垫:

传感器:将其他的模拟信号(温度、液位、气压等等),统一转换成 电压 这个模拟量

A/D 转换:电压这个模拟量,再通过 A/D 通道,转换成计算机所能处理的二进制。(0 和 1)

  • 只不过有的传感器,内部已经做好了 A/D 转换,不需要再占用我们的通道。

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)电压值和浓度的对应关系:在数据手册当中进行查看。

以上是关于STM32 计算机课程设计技术点记录的主要内容,如果未能解决你的问题,请参考以下文章

毕业设计 - 题目:基于 stm32 的病房呼叫系统

课程实习stm32主从蓝牙计算器+温度测量

基于STM32设计智能称重系统(华为云IOT)

基于STM32设计智能称重系统(华为云IOT)

毕业设计 : 基于stm32的智能水杯 - 恒温控制 饮水杯 单片机 物联网 嵌入式

stm32输出pwm频率是如何计算的,请尽量详细点