设计一种针对特定企业气体温度测量的工况(要求测量精度较高的)进行实际测量。热电阻用来做测量用的电阻有两类,即铂和铜,它们与温度的函数关系是一样的,但实用测温范围不一样,工厂实际测温中要求的精度也不同,铂比铜的测温范围要宽一些,精度也高一些,要确定一个具体的企业。如:电子电路印刷焊接流水线、热水工厂、锅炉类企业、烟囱类等,他们的温度范围不同。
主要研究内容: 铂电阻传感器是利用电阻率随温度变化的特性(阻–温效应)而制成(实际上热金属电阻主要有铂和 铜两种)的一类热电阻传感器,测温范围大约是在-200—850摄氏度之间,有较宽的测温范围,广泛地应用于温度的基准、标准测量中。而气体的温度变化范围较大,有很大的不确定性。因此要求测气体温度的热电阻具有较好的物理化学性质,电阻温度系数要大,线性度要好,性能可靠,精度高,特性复现性好,有较好的标准电阻铂电阻的测量精度与铂的纯度有关系,纯度越高,测量的精度就越好,它有两段温区的特性方程,三种不同的温度系数,两种不同的标准电阻值,测量可通过分度表数值(对应的阻—温关系来确定,可以用方程表达出可测量和被测量的关系。
设计总结:
(1)采用铂电阻PT100测量温度
(2)采用MAX31865温度测量模块读取PT100电阻的温度
(3)采用LCD显示屏显示测量的温度
(4)主控单片机采用STM32F103RCT6
需要整个工程源码的可以去这里下载: https://download.csdn.net/download/xiaolong1126626497/85896877
硬件连接方式:
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)
#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;
}
}
}
在main()函数开头的这一部分代码主要是完成对应的GPIO口初始化配置。比如:LED灯、按键、串口、延时函数、LCD显示屏初始化,并通过LCD显示屏显示一些提示文字。
初始化主要是完成硬件模块使用的GPIO口模式配置,时钟配置。
下面看看按键的初始化:
代码里主要做了2件事:(1)开启GPIO口对应的时钟。 (2)配置GPIO口的模式。按键作为输入器件,检测外部输入,模式就配置为输入模式。8就表示上下拉输入模式。
在keil软件里如果想看某个函数原型代码,可以双击选择这个函数或者变量,鼠标点击右键,选择Go to Defin…。
如果跳转失败,首先得确保工程可以正常编译,并且没有错误。
代码86行位置进行了MAX31865初始化,MAX31865是转化铂电阻温度的芯片,MAX31865内部采用串口协议与单片机通信,支持AT指令。单片机发送AT\r\n
过去后,正常情况下MAX31865会返回OK\r\n
,用这个方式检测MAX31865是否正常运行。检测成功就退出循环继续执行。
在代码的主循环里,按照500毫秒的频率读取一次铂电阻的温度,然后实时显示在LCD屏上。
并且控制开发板上的两盏LED灯改变一次状态,也就是500ms闪烁一次。