基于STM32+铂电阻设计的测温仪

2022-09-21 08:24:03 浏览数 (1)

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 硬件接线

代码语言:javascript复制
硬件连接方式:
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代码

代码语言:javascript复制
#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("系统开始运行...rn");
   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检测失败.rn");
    }
   printf("MAX31865检测成功.rn");
   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("系统正常运行.....rn");      
   while(1)
   {
        delay_ms(10);
       
        //按键可以手动控制开启窗帘和LED灯
        key=KEY_Scan();
        if(key)
        {
            printf("key=%drn",key);
            LED2=!LED2;
        }
        
        //轮询时间到达
        if(time_cnt>500)
        {
            time_cnt=0;
            LED1=!LED1;
            LED2=!LED2;
            //获取一次温度
            max31865_p=MAX31865_GetTemp();
            printf("当前温度:%srn",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]='';
            
            printf("串口收到的数据:rn");
            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指令。单片机发送ATrn过去后,正常情况下MAX31865会返回OKrn,用这个方式检测MAX31865是否正常运行。检测成功就退出循环继续执行。

(3)实时转换温度显示

在代码的主循环里,按照500毫秒的频率读取一次铂电阻的温度,然后实时显示在LCD屏上。

并且控制开发板上的两盏LED灯改变一次状态,也就是500ms闪烁一次。

0 人点赞