当前位置:网站首页>基于STM32+铂电阻设计的测温仪
基于STM32+铂电阻设计的测温仪
2022-08-09 11:53:00 【DS小龙哥】
1. 前言
设计一种针对特定企业气体温度测量的工况(要求测量精度较高的)进行实际测量。热电阻用来做测量用的电阻有两类,即铂和铜,它们与温度的函数关系是一样的,但实用测温范围不一样,工厂实际测温中要求的精度也不同,铂比铜的测温范围要宽一些,精度也高一些,要确定一个具体的企业。如:电子电路印刷焊接流水线、热水工厂、锅炉类企业、烟囱类等,他们的温度范围不同。
主要研究内容: 铂电阻传感器是利用电阻率随温度变化的特性(阻–温效应)而制成(实际上热金属电阻主要有铂和 铜两种)的一类热电阻传感器,测温范围大约是在-200—850摄氏度之间,有较宽的测温范围,广泛地应用于温度的基准、标准测量中。而气体的温度变化范围较大,有很大的不确定性。因此要求测气体温度的热电阻具有较好的物理化学性质,电阻温度系数要大,线性度要好,性能可靠,精度高,特性复现性好,有较好的标准电阻铂电阻的测量精度与铂的纯度有关系,纯度越高,测量的精度就越好,它有两段温区的特性方程,三种不同的温度系数,两种不同的标准电阻值,测量可通过分度表数值(对应的阻—温关系来确定,可以用方程表达出可测量和被测量的关系。
设计总结:
(1)采用铂电阻PT100测量温度
(2)采用MAX31865温度测量模块读取PT100电阻的温度
(3)采用LCD显示屏显示测量的温度
(4)主控单片机采用STM32F103RCT6


2. 硬件选型
2.1 STM32F103RCT6

2.2 USB数据线

2.3 PT100温度传感器

2. 4 MAX31865测温模块

3. STM32程序设计
3.1 文字取模

3.2 keil工程
需要整个工程源码的可以去这里下载:
https://download.csdn.net/download/xiaolong1126626497/85896877

3.3 硬件接线
硬件连接方式:
1. TFT 1.44 寸彩屏接线
GND 电源地
VCC 接5V或3.3v电源
SCL 接PC8(SCL)
SDA 接PC9(SDA)
RST 接PC10
DC 接PB7
CS 接PB8
BL 接PB11
2. 板载LED灯接线
LED1---PA8
LED2---PD2
3. 板载按键接线
K0---PA0
K1---PC5
K2---PA15
4. MAX31865测温模块
PA2(TX)--RXD 模块接收脚
PA3(RX)--TXD 模块发送脚
GND---GND 地
VCC---VCC 电源(5.0V)
3.4 main.c代码
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include <string.h>
#include "timer.h"
#include "oled.h"
#include <string.h>
#include <stdlib.h>
#include "font.h"
#include "MAX31865.h"
//JTAG模式设置,用于设置JTAG的模式
//mode:jtag,swd模式设置;00,全使能;01,使能SWD;10,全关闭;
#define JTAG_SWD_DISABLE 0X02
#define SWD_ENABLE 0X01
#define JTAG_SWD_ENABLE 0X00
void JTAG_Set(u8 mode)
{
u32 temp;
temp=mode;
temp<<=25;
RCC->APB2ENR|=1<<0; //开启辅助时钟
AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
AFIO->MAPR|=temp; //设置jtag模式
}
int main()
{
char *max31865_p=NULL;
u32 i=0;
u8 key=0;
u32 time_cnt=0;
JTAG_Set(JTAG_SWD_DISABLE); //释放PA15
LED_Init(); //LED灯初始化
KEY_Init(); //按键初始化
delay_init(72);
USART1_Init(115200); //串口1初始化-打印调试信息
Lcd_Init(); //LCD初始化
Lcd_Clear(0); //清屏为黑色
LCD_LED_SET; //通过IO控制背光亮
printf("系统开始运行...\r\n");
delay_ms(2000); //等待系统稳定
LCD_ShowChineseFont(16*0,0,16,HZ_FONT_16[6],RED,0);
LCD_ShowChineseFont(16*1,0,16,HZ_FONT_16[7],RED,0);
LCD_ShowChineseFont(16*2,0,16,HZ_FONT_16[8],RED,0);
LCD_ShowChineseFont(16*3,0,16,HZ_FONT_16[9],RED,0);
LCD_ShowChineseFont(16*4,0,16,HZ_FONT_16[10],RED,0);
LCD_ShowChineseFont(16*5,0,16,HZ_FONT_16[11],RED,0);
LCD_ShowChineseFont(16*6,0,16,HZ_FONT_16[12],RED,0);
LCD_ShowChineseFont(16*7,0,16,HZ_FONT_16[13],RED,0);
//温度传感器硬件检测
while(1)
{
key=MAX31865_Init();
if(key==0)break;
delay_ms(1000);
printf("MAX31865检测失败.\r\n");
}
printf("MAX31865检测成功.\r\n");
Lcd_Clear(0); //清屏为黑色
//文字提示
LCD_ShowChineseFont(16*1,0,16,HZ_FONT_16[0],WHITE,0);
LCD_ShowChineseFont(16*2,0,16,HZ_FONT_16[1],WHITE,0);
LCD_ShowChineseFont(16*3,0,16,HZ_FONT_16[2],WHITE,0);
LCD_ShowChineseFont(16*4,0,16,HZ_FONT_16[3],WHITE,0);
LCD_ShowChineseFont(16*5,0,16,HZ_FONT_16[4],WHITE,0);
LCD_ShowChineseFont(16*6,0,16,HZ_FONT_16[5],WHITE,0);
printf("系统正常运行.....\r\n");
while(1)
{
delay_ms(10);
//按键可以手动控制开启窗帘和LED灯
key=KEY_Scan();
if(key)
{
printf("key=%d\r\n",key);
LED2=!LED2;
}
//轮询时间到达
if(time_cnt>500)
{
time_cnt=0;
LED1=!LED1;
LED2=!LED2;
//获取一次温度
max31865_p=MAX31865_GetTemp();
printf("当前温度:%s\r\n",max31865_p);
//实时显示
Gui_DrawFont_GBK16(0,0,WHITE,0,(u8*)" ");
Gui_DrawFont_GBK16(52,72,WHITE,0,(u8*)max31865_p);
}
// 接收WIFI返回的数据
if(USART2_RX_FLAG)
{
USART2_RX_BUFFER[USART2_RX_CNT]='\0';
printf("串口收到的数据:\r\n");
for(i=0;i<USART2_RX_CNT;i++)
{
printf("%c",USART2_RX_BUFFER[i]);
}
USART2_RX_CNT=0;
USART2_RX_FLAG=0;
}
}
}
4. 代码分析
(1)系统常规硬件初始化

在main()函数开头的这一部分代码主要是完成对应的GPIO口初始化配置。比如:LED灯、按键、串口、延时函数、LCD显示屏初始化,并通过LCD显示屏显示一些提示文字。
初始化主要是完成硬件模块使用的GPIO口模式配置,时钟配置。
下面看看按键的初始化:

代码里主要做了2件事:(1)开启GPIO口对应的时钟。 (2)配置GPIO口的模式。按键作为输入器件,检测外部输入,模式就配置为输入模式。8就表示上下拉输入模式。
在keil软件里如果想看某个函数原型代码,可以双击选择这个函数或者变量,鼠标点击右键,选择Go to Defin…。

如果跳转失败,首先得确保工程可以正常编译,并且没有错误。
(2)MAX31865初始化

代码86行位置进行了MAX31865初始化,MAX31865是转化铂电阻温度的芯片,MAX31865内部采用串口协议与单片机通信,支持AT指令。单片机发送AT\r\n过去后,正常情况下MAX31865会返回OK\r\n,用这个方式检测MAX31865是否正常运行。检测成功就退出循环继续执行。
(3)实时转换温度显示

在代码的主循环里,按照500毫秒的频率读取一次铂电阻的温度,然后实时显示在LCD屏上。
并且控制开发板上的两盏LED灯改变一次状态,也就是500ms闪烁一次。
边栏推荐
- [C language] creation and use of dynamic arrays
- Semaphore SIGCHLD use, how to make the parent that the child performs over, how to make the distinction between multiple child processes. The end
- ZOJ 1729 & ZOJ 2006(最小表示法模板题)
- 问题来了:4GB物理内存的机器上申请8G内存能成功吗?
- Django cannot link mysql database
- Shell之常用小工具(sort、uniq、tr、cut)
- proto3-2语法
- 预置第三方apk到MTK项目相关问题总结
- Redis的常用数据结构和底层实现方式
- TIC2000系列处理器在线升级
猜你喜欢

阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端

Shell之常用小工具(sort、uniq、tr、cut)

学长告诉我,大厂MySQL都是通过SSH连接的

二重指针-char **、int **的作用

"Digital Economy Panorama White Paper" Special Analysis of Banking Industry Intelligent Marketing Application Released

Visual Studio 2017 ASP.NET Framework MVC 项目 MySQL 配置连接

结构体变量的首地址获取注意事项

抗积分饱和 PID代码实现,matlab仿真实现

Redis高可用部署

【面试高频题】可逐步优化的链表高频题
随机推荐
全面了解什么是TPS、QPS以及两者的区别
web课程设计
阿里高工带来的20022最新面试总结太香了
JS封装防抖(代码持续优化)
实验记录:搭建网络过程
微信支付开发流程
Visual Studio 2017 ASP.NET Framework MVC 项目 MySQL 配置连接
PAT1008
ACM longest non-descent subsequence problem
软件测试——金融测试类面试题,看完直接去面试了
C2000在线升级主程序下载kernel完成后跳转到kernel运行的过程记录
修改VOT2018.json文件,去掉图片路径中的color
MySQL执行sql语句的机制
ClickHouse物化视图(八)
PAT1006
[C language] creation and use of dynamic arrays
Two ways to enter the Oracle database
【VQA survey】视觉问答中的语言学问题
redis库没法引入
父类的main方法可以被继承么?有什么特殊?