基于STM32设计的炉温温度检测仪

发布者:tmgouzi最新更新时间:2023-09-22 来源: elecfans关键字:STM32  IIC接口 手机看文章 扫描二维码
随时随地手机看文章

一、项目背景

随着工业生产的发展,炉温检测在现代化工、钢铁、电子、玻璃等行业中变得越来越重要。对于这些行业,稳定的生产环境和品质稳定的产品是必须的,而炉温是影响产品品质的重要因素之一。如果炉温过高或过低,都有可能导致产品结构改变、硬度变化、强度下降等质量问题,使得产品不能达到预期的性能指标。此外,炉温不仅会影响产品质量,还会影响设备的使用寿命和工作效率,有时甚至会对整个工厂的正常生产造成影响。


为了防止这些问题的发生,现代化工、钢铁、电子、玻璃等行业需要精准测量炉温并实时地监测炉温变化情况。而本项目即是为了满足这些需求而设计的。采用STM32F103C8T6作为主控芯片,它是一款基于ARM Cortex-M3内核的微控制器,具有丰富的外设和良好的计算能力,并且易于控制和集成到系统中。同时,铂电阻PT100是一种高精度、稳定性好、线性度高的温度传感器,能够提供更加准确的温度测量结果。采用0.96寸IIC接口的OLED屏幕进行显示,操作简便、节省成本,并且具有较好的兼容性和可移植性。

image-20230525234029685

image-20230525234051359

二、设计思路

【1】硬件设计

主控芯片采用STM32F103C8T6,其内置有多种外设,可满足该项目的需求。铂电阻PT100作为测温传感器,能够提供更加准确的温度测量结果。0.96寸IIC接口的OLED显示屏幕是本项目的显示工具,能够直观地显示测量结果。


【2】软件设计

软件设计分为数据采集、数据处理和数据显示三个部分。采用STM32的ADC进行数据采集,通过PT100将温度信号转换为电阻信号,再通过AD转换器转换成数字信号进行处理。在数据处理中,对ADC采样值进行数据校准、滤波处理和算法计算,得到准确的温度值。最后,通过IIC总线协议将温度值发送给OLED屏幕进行显示,实现实时显示检测结果的功能。


三、代码实现

【1】OLED显示屏代码

以下是基于STM32F103C8T6主控芯片,通过IIC接口控制0.96寸OLED显示屏显示数字的代码:


#include "stm32f10x.h"

 #include "i2c.h"

 

 #define OLED_ADDRESS 0x78 // OLED IIC地址

 

 void oled_init(void) {

   OLED_Write_Command(0xAE); // 关闭显示

   OLED_Write_Command(0xD5); // 设置时钟分频因子

   OLED_Write_Command(0x80); // 重要参数,必须设置,不然屏幕无法上电

   OLED_Write_Command(0xA8); // 设置驱动路数

   OLED_Write_Command(0x3F); // 默认值

   OLED_Write_Command(0xD3); // 设置显示偏移

   OLED_Write_Command(0x00); // 默认值

   OLED_Write_Command(0x40); // 设置起始行

   OLED_Write_Command(0x8D); // 电荷泵设置

   OLED_Write_Command(0x14); // 开启电荷泵

   OLED_Write_Command(0x20); // 设置内存地址模式

   OLED_Write_Command(0x00); // 水平模式

   OLED_Write_Command(0xA1); // 段重新映射设置

   OLED_Write_Command(0xC0); // 设置COM扫描方向

   OLED_Write_Command(0xDA); // 设置COM引脚硬件配置

   OLED_Write_Command(0x12); // 默认值

   OLED_Write_Command(0x81); // 对比度设置

   OLED_Write_Command(0xCF); // 默认值

   OLED_Write_Command(0xd9); // 设置预充电周期

   OLED_Write_Command(0xF1); // 默认值

   OLED_Write_Command(0xDB); // 设置VCOMH

   OLED_Write_Command(0x40); // 默认值

   OLED_Write_Command(0xA4); // 关闭全屏点亮

   OLED_Write_Command(0xA6); // 设置显示方式

   OLED_Write_Command(0xAF); // 开启屏幕显示

 }

 

 void OLED_Write_Command(uint8_t cmd) {  // 写命令

   I2C1_Start();

   I2C1_SendByte(OLED_ADDRESS);

   I2C1_SendByte(0x00);

   I2C1_SendByte(cmd);

   I2C1_Stop();

 }

 

 void OLED_Write_Data(uint8_t data) { // 写数据

   I2C1_Start();

   I2C1_SendByte(OLED_ADDRESS);

   I2C1_SendByte(0x40);

   I2C1_SendByte(data);

   I2C1_Stop();

 }

 

 void OLED_Set_Pos(uint8_t x, uint8_t y) { // 设置光标位置

   OLED_Write_Command(0xb0+y);

   OLED_Write_Command(((x&0xf0)>>4)|0x10);

   OLED_Write_Command(x&0x0f);

 }

 

 void OLED_Show_Number(uint8_t x, uint8_t y, uint32_t num) { // 在指定位置显示数字

   OLED_Set_Pos(x, y);

   while (num) {

     uint8_t temp = num % 10;

     OLED_Write_Data(temp + '0');

     num /= 10;

   }

 }

 

 int main(void) {

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

   GPIO_InitTypeDef GPIO_InitStructure;

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

   GPIO_Init(GPIOB, &GPIO_InitStructure);

 

   I2C1_Init();

 

   oled_init();

 

   OLED_Show_Number(0, 0, 12345); //在第1行第1列显示数字12345

 

   while (1) {

   }

 }

首先,通过oled_init()函数初始化OLED屏幕,在函数中依次写入了一系列命令,来设置OLED的各种参数,例如驱动路数、扫描方向、预充电周期、对比度等。接着,在OLED_Show_Number()函数中,调用了OLED_Set_Pos()函数来设置数字显示的位置,然后通过循环取余数的方法将数字逐位分离,再将其转换为字符型并通过OLED_Write_Data()函数输出到OLED屏幕上,最终实现在屏幕上显示指定数字的功能。


【2】温度测量代码

以下是基于STM32F103C8T6主控芯片,通过IIC接口控制0.96寸OLED显示屏显示温度,并通过串口打印温度的代码:


#include "stm32f10x.h"

 #include "i2c.h"

 #include "usart.h"

 

 #define OLED_ADDRESS 0x78 // OLED IIC地址

 

 // PT100温度转换函数

 float RTD2Temperature(float R) {

     float temperature = 0;

     float RTD_A = 3.9083e-003f;

     float RTD_B = -5.775e-007f;

 

     temperature = (-RTD_A + sqrtf(RTD_A * RTD_A - 4 * RTD_B * (1 - R / 100))) / (2 * RTD_B);

     return temperature;

 }

 

 void oled_init(void) {

     OLED_Write_Command(0xAE); // 关闭显示

     OLED_Write_Command(0xD5); // 设置时钟分频因子

     OLED_Write_Command(0x80); // 重要参数,必须设置,不然屏幕无法上电

     OLED_Write_Command(0xA8); // 设置驱动路数

     OLED_Write_Command(0x3F); // 默认值

     OLED_Write_Command(0xD3); // 设置显示偏移

     OLED_Write_Command(0x00); // 默认值

     OLED_Write_Command(0x40); // 设置起始行

     OLED_Write_Command(0x8D); // 电荷泵设置

     OLED_Write_Command(0x14); // 开启电荷泵

     OLED_Write_Command(0x20); // 设置内存地址模式

     OLED_Write_Command(0x00); // 水平模式

     OLED_Write_Command(0xA1); // 段重新映射设置

     OLED_Write_Command(0xC0); // 设置COM扫描方向

     OLED_Write_Command(0xDA); // 设置COM引脚硬件配置

     OLED_Write_Command(0x12); // 默认值

     OLED_Write_Command(0x81); // 对比度设置

     OLED_Write_Command(0xCF); // 默认值

     OLED_Write_Command(0xd9); // 设置预充电周期

     OLED_Write_Command(0xF1); // 默认值

     OLED_Write_Command(0xDB); // 设置VCOMH

     OLED_Write_Command(0x40); // 默认值

     OLED_Write_Command(0xA4); // 关闭全屏点亮

     OLED_Write_Command(0xA6); // 设置显示方式

     OLED_Write_Command(0xAF); // 开启屏幕显示

 }

 

 void OLED_Write_Command(uint8_t cmd) {  // 写命令

     I2C1_Start();

     I2C1_SendByte(OLED_ADDRESS);

     I2C1_SendByte(0x00);

     I2C1_SendByte(cmd);

     I2C1_Stop();

 }

 

 void OLED_Write_Data(uint8_t data) { // 写数据

     I2C1_Start();

     I2C1_SendByte(OLED_ADDRESS);

     I2C1_SendByte(0x40);

     I2C1_SendByte(data);

     I2C1_Stop();

 }

 

 void OLED_Set_Pos(uint8_t x, uint8_t y) { // 设置光标位置

     OLED_Write_Command(0xb0+y);

     OLED_Write_Command(((x&0xf0)>>4)|0x10);

     OLED_Write_Command(x&0x0f);

 }

 

 void OLED_Show_Temperature(uint8_t x, uint8_t y, float temperature) { // 在指定位置显示温度

     OLED_Set_Pos(x, y);

     int temp = (int)(temperature * 10);

     for (int i = 0; i < 5; i++) {

         if (i == 2) {

             OLED_Write_Data('.');

         } else {

             OLED_Write_Data(temp % 10 + '0');

             temp /= 10;

         }

     }

     OLED_Write_Data('C');

 }

 

 int main(void) {

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

     GPIO_InitTypeDef GPIO_InitStructure;

     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;

     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;

     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

     GPIO_Init(GPIOB, &GPIO_InitStructure);

 

     I2C1_Init();

 

     oled_init();

 

     USART1_Init();

 

     while (1) {

         float resistance = 100; // 铂电阻的电阻值

         float temperature = RTD2Temperature(resistance); // 算出温度值

 

         // OLED显示温度

         OLED_Show_Temperature(0, 0, temperature);

 

         // 串口输出温度

         char str[32];

         sprintf(str, "Temperature: %.1f C\r\n", temperature);

         USART1_SendString(str);

 

         delay_ms(1000); // 延时1s

     }

 }


首先,利用RTD2Temperature()函数将铂电阻的电阻值转换为温度值。接着,在OLED_Show_Temperature()函数中,调用了OLED_Set_Pos()函数来设置温度显示的位置,并将温度值逐位分离,通过OLED_Write_Data()函数输出到OLED屏幕上,最终实现在屏幕上显示测量的温度的功能。同时,也通过串口输出温度值。


在主函数main()中,不断循环读取铂电阻的电阻值,并通过RTD2Temperature()函数转换为温度值。然后,调用OLED_Show_Temperature()函数将温度显示在OLED屏幕上,并调用USART1_SendString()函数通过串口输出温度值。最后,通过delay_ms()函数延时1秒,等待下一次测量。


关键字:STM32  IIC接口 引用地址:基于STM32设计的炉温温度检测仪

上一篇:基于STM32的重力感应售货机系统设计
下一篇:STM32的ADC用法你都知道吗?

推荐阅读最新更新时间:2024-10-24 10:48

基于STM32设计的炉温温度检测仪
一、项目背景 随着工业生产的发展,炉温检测在现代化工、钢铁、电子、玻璃等行业中变得越来越重要。对于这些行业,稳定的生产环境和品质稳定的产品是必须的,而炉温是影响产品品质的重要因素之一。如果炉温过高或过低,都有可能导致产品结构改变、硬度变化、强度下降等质量问题,使得产品不能达到预期的性能指标。此外,炉温不仅会影响产品质量,还会影响设备的使用寿命和工作效率,有时甚至会对整个工厂的正常生产造成影响。 为了防止这些问题的发生,现代化工、钢铁、电子、玻璃等行业需要精准测量炉温并实时地监测炉温变化情况。而本项目即是为了满足这些需求而设计的。采用STM32F103C8T6作为主控芯片,它是一款基于ARM Cortex-M3内核的微控制器,具
[单片机]
基于<font color='red'>STM32</font>设计的<font color='red'>炉温</font><font color='red'>温度</font><font color='red'>检测仪</font>
STM32配置IIC接口通信方式参考源码
最近在读取SHT3x系列sensor的温度和湿度,用到的是IIC接口。 顺便写了一下STM32的IIC接口。 这次配置的是STM32内部的IIC接口。 注意:读的时候,怎么发送Ack, 和 NAck信号,参考stm的设计文档。 #include Dev_SHT3X.h #include globalDef.h #include stdio.h #define I2C1_OWN_ADDRESS7 0x0A #define I2C_Speed 40000 #define SHT3X_ADDRESS 0x44 /* read out command */ #define CMD_READH_SHX
[单片机]
STM32通信接口(二)IIC--软件模拟
一、概述 IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的一种简单、双向、二线制、同步串行总线,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。 IIC是 由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。 二、基本原理 (IIC总线的时序图) IIC总线在传输数据的过程中共有三种类型的信号,分别为:开始信号、结束信
[单片机]
<font color='red'>STM32</font>通信<font color='red'>接口</font>(二)<font color='red'>IIC</font>--软件模拟
采用AT89C51单片机和温度变送器实现炉温控制系统的设计
1、引 言 电加热炉随着科学技术的发展和工业生产水平的提高,已经在冶金、化工、机械等各类工业控制中得到了广泛应用,并且在国民经济中占有举足轻重的地位。对于这样一个具有非线性、大滞后、大惯性、时变性、升温单向性等特点的控制对象,很难用数学方法建立精确的数学模型,因此用传统的控制理论和方法很难达到好的控制效果。 单片机以其高可靠性、高性能价格比、控制方便简单和灵活性大等优点,在工业控制系统、智能化仪器仪表等诸多领域得到广泛应用。采用单片机进行炉温控制,可以提高控制质量和自动化水平。 2、单片机炉温控制系统结构 本系统的单片机炉温控制系统结构主要由单片机控制器、可控硅输出部分、热电偶传感器、温度变送器以及被控对象组成。如图1所示
[单片机]
采用AT89C51单片机和<font color='red'>温度</font>变送器实现<font color='red'>炉温</font>控制系统的设计
电热锅炉温度控制器的设计
简介:本文介绍了以AT89S51单片机为核心的温度控制器的设计,在该设计中采用高精度的温度传感器AD590对电热锅炉的温度进行实时精确测量,用超低温漂移高精度运算放大器OP07将温度-电压信号进行放大,再送入12位的AD574A进行AD转换,从而实现自动检测,实时显示及越限报警。控制部分采用PID算法,实时更新PWM控制输出参数,控制可控硅的通断时间,最终实现对炉温的高精度控制。 温度控制是工业生产过程中经常遇到的过程控制,有些工艺过程对其温度的控制效果直接影响着产品的质量,因而设计一种较为理想的温度控制系统是非常有价值的。 一 系统设计方案的论证与比较 根据题目要求,电热锅炉温度控制系统由核心处理模块、温度采集模块、
[单片机]
电热锅<font color='red'>炉温度</font>控制器的设计
基于AT89C52单片机模糊PID的电阻炉温度控制系统
电阻炉是热处理工业中常用的设备,具有大滞后、参数时变、非线性等特点。各个领域对电阻炉温度控制的精度、稳定性、可靠性要求越来越高。提高该类对象的控制品质具有广泛的应用价值。常规PID控制算法简单、易于实现,适用于可建立精确数学模型的确定性控制系统。而实际工业生产过程往往具有非线性和时变性,难以建立精确的数学模型,因此常规PID控制器不能达到理想的控制效果。模糊控制不需要被控对象的精确数学模型,而且控制灵活、鲁棒性强,但模糊控制器的积分作用较弱,导致系统的动态品质较差。将模糊控制和PID控制两者结合起来的复合型控制器,对复杂控制系统具有良好的控制效果。 文中在深入研究先进PID控制理论及其智能优化控制策略的基础上,以电阻炉为被
[单片机]
基于AT89C52单片机模糊PID的电阻<font color='red'>炉温度</font>控制系统
基于I2C总线的锅炉温度测量系统的设计与实现
单片机作为典型的嵌入式控制器,具有集成度高、处理功能强、运行速度快、体积小、扩展灵活等优势,在仪器仪表、家用电器、过程控制等领域被广泛应用。锅炉温度是工业过程中最常见的工艺参数之一,其测量过程的抗干扰能力和测量值的精度是影响对锅炉温度控制效果的重要因素。为使系统更智能化,一般选择单片机为系统控制核心。但是,传统的单片机测量系统中实现A/D转换结果输出以及各器件之间的数据传递大多采用并行的通信方式,这种数据交换方式占用了大量的I/O资源,系统结构也因此变得复杂。同时大量的硬件连线也会带来很多干扰因素,降低了锅炉温度值的测量精度。为了解决传统设计中存在的问题,本文提出使用Philips公司推出的I2C总线(Inter Integrate
[测试测量]
基于I2C总线的锅<font color='red'>炉温度</font>测量系统的设计与实现
基于ATMEGA16的电热锅炉温度控制器的开发研制
  引言   电热锅炉是可将电能直接转化成热能,具有热效率高、体积小、无污染、噪声小、运行安全可靠、供热稳定、自动化程度高等优点,是理想的节能环保型的供暖设备。   本控制器主要针对过程控制实验室的控制装置而设计的,对浙大中控的AE2000B过程控制实验装置中电热锅炉的温度进行控制、显示,具有手动、自动功能,带有漏电、超温、超压及缺水保护和报警系统。   智能仪表的研制开发   智能仪表是以单片机为核心的仪表,其设计要点大致有两点,即模块化设计和模块的连接。   ● 模块化设计   依据仪表的功能、精度要求等,自上而下按仪表功能层次把硬件和软件分成若干个模块,分别进行设计与调试,然后把它们连接起来,进行总调,这是设计仪
[单片机]
基于ATMEGA16的电热锅<font color='red'>炉温度</font>控制器的开发研制
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved