最近,学校安排了一次课程实训,需要完成的目标是,依据电路图自己焊接元器件,组建 STM32F103 为主控的开发板,并在开发板上配置各类传感器,完成测量任务。

开发板焊接

硬件电路设计

硬件设计思路:采用 STM32F103RCT6 芯片采用 DS18B20 来采集温度数据其测量范围大且精度高适用的范围广,利用 DHT11 来进行湿度采集并传输到 STM32FRCT6 上。由 LCD1602 显示出温湿度值,和它们的阈值,通过按键可以修改阈值的大小并且设置阈值还原键,通过 LED5 来做电源显示,表示电路可以进行外部供电,用 LED3 和 LED4 来做警报灯当超出阈值或低于阈值时发出警报。
image.png

DHT11 电路设计

image.png

DS18B20 电路设计

image.png

电源电路设计

image.png

按键电路设计

image.png

LED 灯电路设计

image.png

LCD 电路设计

image.png

总体电路设计

image.png

原始 PCB 版图片

QQ图片20220110183143.jpg

硬件调试

由于缺少经验,焊的时候温度没太注意,把焊盘烫坏一个,飞线解决。在测试过程中,发现一个 LED 灯不亮,无论怎么调整代码,其依 k 旧无法亮起。用万用表测试,三极管虚焊,好家伙。.

软件编写

代码已经开源在 https://github.com/HELLOWORLD1030/STM32TempAndHumid

文件结构

├───CORE   #stm32的启动代码
├───FWLIB
│   └───STM32F10x_FWLib #STM32库函数
│       ├───inc
│       └───src
├───HARDWARE # 外设及外部中断
│   ├───DHT11#湿度传感器
│   ├───DS18B20 #DS18B20温度传感器
│   ├───EXTI# 外部中断
│   ├───KEY#按键
│   ├───LCD1602#LCD1602
│   └───LED #LED灯
├───MALLOC
├───OBJ #编译后的文件
├───SYSTEM #系统函数,延时,串口等
│   ├───delay
│   ├───sys
│   └───usart
├───UCOSII #UCOSii库函数
│   ├───CONFIG
│   ├───CORE
│   └───PORT
├───USER #工程文件所在
│   └───DebugConfig
└───USMART

设计思路

首先在主函数中进行硬件的初始化,如 LED,LCD,按键,外部中断,串口,中断嵌套控制器等的配置,而后调用 ucos 的初始化函数,启动 ucos,初始化开始任务,而后在开始任务中,初始化温湿度测量任务,显示任务,阈值显示任务。在温湿度测量任务中,进行 DS18B20、DHT11 的初始化,温度湿度的测量,对何时闪烁 LED 的判断等,最后向显示温湿度任务发送消息,实现任务间的调度通信,显示温湿度任务则等待温湿度测量任务的消息,而后显示出来,显示温度阈值,独立出来,可以更快速的显示温湿度阈值的改动。

流程框图

image.png
image.png
image.png
image.png

软件调试

我们首先依据 UCOS 的官网相关例程,将 UCOS 移植到 STM32F103 上,并在正点原子的 MINI 开发板上跑通跑马灯程序,跑通后,将程序下载到自己焊接的实验板上,依据电路原理图修改 LED 引脚定义,LED 成功点亮,而后在 UCOS 上依据 DS18B20 的 DataSheet 修改延时,按文档拉高,拉低总线,从而获得 DS18B20 的回应,但是我们遇到问题,UCOS 的延时依赖系统滴答,DS18B20 对是虚的要求较高,UCOS 的系统任务调度则会破坏这个时序,导致系统卡死,或者读出的数据为 0,我们使用定时器 Tim1 构造了一个延时,将 UCOS 系统的时钟和 DS18B20 的时钟分开,解决问题。我们也同样按照 DHT11 的 DataSheet 修改延时,从而实现实验板上对 DS18B20 和 DHT11 的调用,而后将测得的数据显示到 LCD1602 中,在正确依据电路原理图修改引脚定义后,我们遇到问题,就是能够让 LCD1602 正确点亮,却显示不出字符,经过反复查找,我们发现,是可调电阻的阻值没有调好,调好后,温湿度显示成功。
hexo 推送测试