预警器件控制思考

news2024/11/15 11:20:35

预警器件控制思考

最小示例思想

当读取到环境信息与环境阈值的时候, 我们预警系统就要根据这些信息做出判断,是否要启动器件。

image-20240801174851481

最简单的就是, 举温度temp的例子, temp(温度)与temp_th(阈值), 通过判断, 得出是否要启动器件.

image-20240802061601931

如果在一段时间内, 一直是环境异常, 我们那只需要启动一次器件就可以了, 按照上面的方法, 就会一直重复启动器件. 所以我们在启动器件前, 需要判断一下, 器件的状态, 如果要切换状态的话, 那么我们就操作硬件.

image-20240801173412942

(1)当temp > temp_th 时, 当环境刚异常, 并且器件没有启动的时候, 此时我们判断出此状态, 那么我们就启动硬件.

那下一次判断的时候, 环境仍然异常, 但是器件刚才已经启动了, 那么通过判断, 我们就不用启动了.

(2)当temp < temp_th 时, 当环境刚恢复正常时, 并且器件启动的时候, 此时我们判断出此状态, 那么我们就可以关闭硬件了.

那下一次判断的时候, 环境仍然正常, 但是器件刚才已经关闭了, 那么通过判断, 我们就不用重复关闭了.

(3) 所以, 当我们要切换器件状态的时候, 我们首先判断器件当前的状态是否和我们所需一致, 如果一致, 那么我们就不进行切换即可.

(4)最小例程的代码, 是用 red_led 和 blue_led 来存储温湿度应急器件的状态的, 并且这个标志位是和器件io口绑定状态, 我们在操作io口后,我们都要更新这个状态。只是为了避免频繁操作器件,我们在判断预警操作器件的时候,都需要判断当前器件状态,是否已经符合, 如果符合,那么就不操作。我们这里功能不是太复杂,所以就用这种方法来实现。

后续如果加入操作系统的思想的话,尤其是硬件的操作,需要多级容错判断,来保证绝对的安全,这里只做简单分析。

image-20240801175047736

器件状态绑定

我们通过观察发现 ,red_led和 PBout(3)深度绑定, 所以直接新建一个文件, 然后新建一个结构体, 来保存器件的状态, 操作器件开关.

我们先观察下面示例, 然后分析学习, 构建我们的工程:

image-20240801180144618

(1)观察, 这个函数,是操作器件的, 然后每次操作的时候, 都会传入一个status, 就是我们所需的状态,

​ 但是 传入状态并不代表着我们就要频繁操作io口, 因为在一段时间内环境一直异常,我们100ms钟检测一次,当我们检测到异常, 我们就启动器件, 因为要保证预警系统的实时性, 所以下一个100ms检测的时候, 器件已经运行了,我们就无需重复启动了. 所以当我们传入状态后, 想开器件, 就判断一下器件是否已经启动, 如果启动, 就说明在上一个100ms的时候, 就已经启动了,我们这次进入只是为了保证实时性, 从而重复确认.

​ 同理, 关闭器件也一样, 如果我们检测到 环境 从 异常->正常后,

我们就关闭器件,操作io口前, 也同样判断一下, 器件是否已经处于关闭状态, 如果关闭,则无需操作. (注意我们上图运用的是结构体变量, 其函数状态和io口状态深度绑定, 所以通过判断变量,就可以判断出我们所处的状态,从而操作io口)

image-20240801173412942

代码实操:

在加dht11和oled最小例程的基础上,手把手改写代码, 加思路导向

改前的工程:

https://ww0.lanzoul.com/i1jH22680p3a

修改完预警的工程:

https://ww0.lanzoul.com/ihhjp26avqub

失效联系qq:2958360390 回复关键词 最小例程系统预警系统构建

(1) 我们解压打开改之前的工程

image-20240802071443939

(2)然后去锁定预警处理部分的代码

会发现, 我们这里是直接在main函数里面访问temp和humi的, 直接做出预警判断

image-20240802071703229

(3)并且, 和上述说的一样, red_led和 PBout(3) 并没有深度绑定, 所以我们先去 构建一下, 操作器件的函数, 我们构建两个文件一个是temp预警器件, 一个是 humi预警器件。

​ 首先,还和之前一样, 在品字哪里, 新建一个alarm的文件夹, 来存放预警器件的文件, 然后再去add, 逐个创建文件, 我们起名, temp_led.c 和 temp_led.h , humi_led.c和 humi_led.h吧。

详细步骤:(为了避免篇幅过长)

https://blog.csdn.net/qq_57484399/article/details/140862473

(4)如下图,我们先做temp_led.c的预警,

这里我们不谈c语言格式, 只谈随心写代码, 甚至我们可以用中文来代替, 至于格式问题, 是编译器和al的事情, 我们只谈逻辑.

image-20240802081906579

(5)先看之前原始的预警的时候, 操作器件的时候, 是怎么操作的

image-20240802082109921

我们是先判断状态, 让着当状态切换的时候, 我们才操作器件.

但是这些好像和我们用户没什么关系, 我们用户, 只是想, 在报警的时候, 你操作器件就行了, 至于启动不启动器件, 是我们底层控制启动器件的代码通过判断, 才做的事情, 所以, 我们此处进行替换.

image-20240802082426300

(6)至于启动不启动器件, 是函数内部通过判断器件是否处于运行状态, 才操作io口的.我们这里复制 temp_led_Set, 然后直接跳转temp_led.c函数

image-20240802082630432

(7)看到这个是传入的状态, 所以我们还得给led_red绑定一个结构体状态, 通过调用判断这个状态, 再确定是否需要操作io口,

我们去temp_led.h去定义状态结构体

image-20240802124853840
#define red_led_ON	1

#define red_led_OFF	0


typedef struct
{

	_Bool red_led_Status;

} TEMP_ALARM_INFO;

(8)定义完, 之后, 去temp_led.c里面去创建一个temp_alarm_info的变量, 然后 再去构造函数. 相当于定一个了一个状态了

image-20240802125209534

TEMP_ALARM_INFO temp_info = {0};

(9) 然后我们接着构造控制函数

传入的状态, 我们修改为 _Bool status

void temp_led_Set(_Bool status)
{
	
}

(10)还是根据流程图所示, 我们传入的状态, 就是我们想要的状态, 目前如果 机器是此状态, 我们就跳过不操作io口, 相当于我们切换状态的时候, 我们才操作io口

image-20240802130517065

(11)直接上代码, 如果需要开预警设备, 并且当前状态不是开,则操作io口

如果需要关应急设备, 并且当前状态不是关,则操作io口.

(为什么要判断切换状态呢? 因为我们并不能确保这是 第一次从正常->应急, 或者从应急->预警, 第一次操作,当然可以直接操作io口, 因为在一段时间内, 我们只需要操作一次io口,就行了, 但是为了保证实时性, 我们会一直操作判断器件状态, 从而达到实时性, 后续我们采用操作系统思想解决, 我们这里比较简单粗暴.)

image-20240802190849869

下面我把完善的代码奉上, 请直接复制黏贴即可

temp_led.c
//单片机头文件
#include "stm32f10x.h"

#include "temp_led.h"
#include "sys.h"

TEMP_ALARM_INFO temp_info = {0};

void temp_led_Init(void)
{
	//初始化小灯, PB3(温度) PB4(湿度) PB5(烟雾浓度)
	GPIO_InitTypeDef GPIO_InitStructure;
	//开启硬件时钟	PB5
	/* GPIOD Periph clock enable */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	//开启AFIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	//禁用JTAGD端口
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);	
   //配置 pB 3 4 5 GPIO工作模式(推挽输出)
	/* Configure PD0 and PD2 in output pushpull mode */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);	//配置端口
	//控制端口寄存器GPIO输出电平
	PBout(3) = 0;//temp_led	
	
}	

void temp_led_Set(_Bool status)
{
	if(status == red_led_ON && temp_info.red_led_Status != red_led_ON)	
	{
		//操作小灯开
		PBout(3) = 1;//temp_led
		//状态设置为开
		temp_info.red_led_Status = status;
	}
	else
	if(status == red_led_OFF && temp_info.red_led_Status != red_led_OFF)
	{
		//操作小灯关
		PBout(3) = 0;//temp_led
		//状态设置为关
		temp_info.red_led_Status = status;
	}
}

temp_led.h
#ifndef _TEMP_LED_H_
#define _TEMP_LED_H_


#define red_led_ON	1

#define red_led_OFF	0



typedef struct
{

	_Bool red_led_Status;

} TEMP_ALARM_INFO;

extern TEMP_ALARM_INFO temp_info;


void temp_led_Init(void);
void temp_led_Set(_Bool status);

#endif

humi_led.c
//单片机头文件
#include "stm32f10x.h"

#include "humi_led.h"
#include "sys.h"

HUMI_ALARM_INFO humi_info = {0};

void humi_led_Init(void)
{
	//初始化小灯, PB3(温度) PB4(湿度) PB5(烟雾浓度)
	GPIO_InitTypeDef GPIO_InitStructure;
	//开启硬件时钟	PB5
	/* GPIOD Periph clock enable */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	//开启AFIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	//禁用JTAGD端口
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);	
   //配置 pB 3 4 5 GPIO工作模式(推挽输出)
	/* Configure PD0 and PD2 in output pushpull mode */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);	//配置端口
	//控制端口寄存器GPIO输出电平
	PBout(4) = 0;//humi_led	
	
}	

void humi_led_Set(_Bool status)
{
	if(status == blue_led_ON && humi_info.blue_led_Status != blue_led_ON)	
	{
		//操作小灯开
		PBout(4) = 1;//blue_led
		//状态设置为开
		humi_info.blue_led_Status = status;
	}
	else
	if(status == blue_led_OFF && humi_info.blue_led_Status != blue_led_OFF)
	{
		//操作小灯关
		PBout(4) = 0;//blue_led
		//状态设置为关
		humi_info.blue_led_Status = status;
	}
}

humi_led.h
#ifndef _HUMI_LED_H_
#define _HUMI_LED_H_


#define blue_led_ON	  1

#define blue_led_OFF  0



typedef struct
{

	_Bool blue_led_Status;

} HUMI_ALARM_INFO;

extern HUMI_ALARM_INFO humi_info;


void humi_led_Init(void);
void humi_led_Set(_Bool status);

#endif


main.c
#include "stm32f10x.h"                  // Device header
#include "sys.h"
#include "delay.h"
#include "dht11.h"
#include "OLED.h"

#include "humi_led.h"
#include "temp_led.h"


uint8_t temp;	//读取的环境温度
uint8_t humi;	//读取的环境湿度

uint8_t temp_th;	//设置的温度阈值
uint8_t humi_th;	//设置的湿度阈值

_Bool red_led;	//(温度指示灯)

_Bool blue_led;	//(湿度指示灯)

_Bool set_limit;	//管理员是否设置阈值


led小灯初始化
//void led_init(void);


int main()
{

	unsigned short timeCount = 0;	//发送间隔变量
    //手动设置环境温度(模拟上帝)
	temp = 66;	//温度是28度
	humi = 60;	//湿度是60%	
    //手动设置阈值(代替远程)
    temp_th = 30;	//温度阈值是30度
	humi_th = 60;		//湿度阈值是60%
    //小灯状态初始化
    red_led = 0;
    blue_led = 0;   
	//测试变量: 管理设置阈值符号位
	set_limit = 1;
//	//小灯初始化
//	led_init();
	//滴答定时器
	Delay_Init();
	//dht11初始化
	DHT11_Init();
//	while(DHT11_Init())
//	{
		printf("DHT11 Error \r\n");
//		OLED_ShowString(0,48, "DHT11 Error", 8);
//		OLED_Update();	
//		DelayMs(2000);
//	}
	//oled初始化
	OLED_Init();
	humi_led_Init();
	temp_led_Init();
	
	while(1)
	{

		//(1)设置环境信息阈值(手动输入代替远程控制)
		if(set_limit == 1)
		{
			temp_th = 29;
			humi_th = 88;
			//设置完阈值就清零,下次不设置了, 直到set_limit被管理员置1
			//然后再次进入此功能函数里,进行设置阈值
			set_limit = 0;
		}
		//(2)读取环境信息 (手动输入代替器件读取)
		//if(过了100毫秒) 每隔100毫秒,读取一次, 保证实时性,减轻负担
		if(++timeCount >= 10)
		{
			DHT11_Read_Data(&temp,&humi);
//			temp = 99;	//人手输入,代替器件,忽略底层,重视逻辑
//			humi = 99;	
			OLED_Clear();
			OLED_ShowChinese(0, 0, "温度");
			OLED_ShowChinese(0, 24, "湿度:");
			OLED_Printf(48,0,OLED_8X16,"%2d",temp);
			OLED_Printf(48,24,OLED_8X16,"%2d",humi);	
			OLED_ShowChinese(80,0 , "℃");
			OLED_ShowChinese(80,24 , "%");		
			OLED_Update();
			timeCount = 0; 	//从新计时`		
		}
		DelayXms(10);	//10*10 = 100ms
		//后面跟 1ms的延时, 我们一切从简,先留着
		
		//(3)每时每刻判断环境信息是否异常
		if(temp >= temp_th)
		{
			//启动器件
			temp_led_Set(red_led_ON);
			
		}
		else	//同理,环境正常时候
		{     
			temp_led_Set(red_led_OFF);
		}      
		//判断湿度是否报警
		//每时每刻判断环境信息是否异常
		if(humi >= humi_th)
		{
			humi_led_Set(blue_led_ON);
			
//			if(blue_led == 0)	//如果是关闭状态则启动,开启则无操作
//			{
//				blue_led = 1; 
//				PBout(4) = 1;
//			}
		}
		else	//同理,环境正常时候
		{
			humi_led_Set(blue_led_OFF);
//			if(blue_led == 1)	//如果是开启状态则启动,关闭则无操作
//			{
//				blue_led = 0;
//				PBout(4) = 0;
//			}        
		}       
	}	

}

///**************************************************
//函数名: led_init
//功  能: 温湿度,烟雾浓度小灯初始化
//参  数: 无
//配置参数: PB3(温度) PB4(湿度) PB5(烟雾浓度)
//		  推挽输出
//		 小灯正极接io口, 负极接地
//返回值: 无
//**************************************************/
//void led_init(void)
//{
//	//初始化小灯 , PB3(温度) PB4(湿度) PB5(烟雾浓度)
//	GPIO_InitTypeDef GPIO_InitStructure;
//	//开启硬件时钟	PB5
//	/* GPIOD Periph clock enable */
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//	//开启AFIO时钟
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//	//禁用JTAGD端口
//	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);	
//   //配置 pB 3 4 5 GPIO工作模式(推挽输出)
//	/* Configure PD0 and PD2 in output pushpull mode */
//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
//	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//	GPIO_Init(GPIOB, &GPIO_InitStructure);	//配置端口

//	//控制端口寄存器GPIO输出电平
//	PBout(3) = 0;//temp_led
//	PBout(4) = 0;	//humi_led
	PBout(5) = 0;	//mq2_led	
//	
//}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1976503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

私藏心术:低谷期翻身转运秘籍

私藏心术&#xff1a;低谷期翻身转运秘籍 在生活中&#xff0c;每个人都可能遇到低谷期&#xff0c;那些看似无法逾越的障碍和挫折。但记住&#xff0c;低谷期不是终点&#xff0c;而是重新站起来的起点。本文将分享一些实用的心术和策略&#xff0c;帮助你在低谷期实现翻身转…

第一个 Flask 项目

第一个 Flask 项目 安装环境创建项目启动程序访问项目参数说明Flask对象的初始化参数app.run()参数 应用程序配置参数 安装环境 mkvirtualenv flask_envpip install flask创建项目 启动程序 访问项目 http://127.0.0.1:5000/ 参数说明 Flask是一个用Python编写的轻量级Web应…

程序员学长 | 快速学习一个算法,CLIP

本文来源公众号“程序员学长”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;快速学习一个算法&#xff0c;CLIP 今天给大家介绍一个强大的算法模型&#xff0c;CLIP。 CLIP (Contrastive Language–Image Pre-training) 是一个…

机器学习流程图

第一部分&#xff1a;课程使用的技术栈 &#xff08;1&#xff09;Numpy 科学计算基础库&#xff0c;矩阵运算&#xff0c;线性代数 &#xff08;2&#xff09;matplotlib 绘图库&#xff0c;数据可视化 &#xff08;3&#xff09;Scikit 封装了各种分类&#xff0c;回归…

【课程总结】day19(下):Transformer源码深入理解

前言 在上一章【课程总结】day19(下):Transformer架构及注意力机制了解总结中,我们对Transformer架构以及注意力机制有了初步了解,本章将结合《The Annotated Transformer》中的源码,对Transformer的架构进行深入理解。 背景 《The Annotated Transformer》是由 Harva…

LaneATT推理详解及部署实现(上)

目录 前言1. 概述2. 环境配置3. Demo测试4. ONNX导出初探5. ONNX导出优化6. ONNX导出总结结语下载链接参考 前言 最近想关注下车道线检测任务&#xff0c;在 GitHub 上找了一个模型 LaneATT&#xff0c;想通过调试分析 LaneATT 代码把 LaneATT 模型导出来&#xff0c;并在 tens…

Java游戏源码:象棋网络对战版

学习java朋友们&#xff0c;福利来了&#xff0c;今天小编给大家带来了一款象棋网络对战版源码。 源码搭建和讲解 源码分为客户端和服务器&#xff0c;采用java原生 java.net.Socket 实现&#xff0c;服务器主循环代码&#xff1a; import java.net.ServerSocket; import jav…

二维码生成原理及解码原理

☝☝☝二维码配图 二维码 二维码&#xff08;Quick Response Code&#xff0c;简称QR码&#xff09;是一种广泛使用的二维条形码技术&#xff0c;由日本公司Denso Wave在1994年开发。二维码能有效地存储和传递信息&#xff0c;广泛应用于商品追溯、支付、广告等多个领域。二维…

Star-CCM+负体积网格检查与出现原因

要使网格可用于有限体积计算&#xff0c;每个网格单元必须具有正体积&#xff0c;否则初始化过程将失败&#xff0c;且模拟计算无法运行。 负体积网格单元可能会以多种不同的方式出现&#xff0c;但必须修复或从网格中移除&#xff0c;才能继续执行任何后续操作。 要检查体网…

<数据集>人员摔倒识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;8605张 标注数量(xml文件个数)&#xff1a;8605 标注数量(txt文件个数)&#xff1a;8605 标注类别数&#xff1a;1 标注类别名称&#xff1a;[fall] 序号类别名称图片数框数1fall860512275 使用标注工具&#xf…

当前生物信息学研究面临的四大机遇和挑战(特别是最后一个,一定要足够重视)...

生物信息学是应用计算方法分析生物数据&#xff0c;如 DNA&#xff0c;RNA&#xff0c;蛋白质和代谢物。生物信息学已成为促进我们对生命科学的理解以及开发新的诊断&#xff0c;治疗和生物技术产品的重要工具。本文我们将探讨生物信息学研究的一些当前趋势和发展&#xff0c;以…

如何快速入门 PyTorch ?

PyTorch是一个机器学习框架&#xff0c;主要依靠深度神经网络&#xff0c;目前已迅速成为机器学习领域中最可靠的框架之一。 PyTorch 的大部分基础代码源于 Ronan Collobert 等人 在 2007 年发起的 Torch7 项目&#xff0c;该项目源于 Yann LeCun 和 Leon Bottou 首创的编程语…

【C++题解】1249. 搬砖问题

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1249. 搬砖问题 类型&#xff1a;嵌套穷举 题目描述&#xff1a; 36 块砖&#xff0c; 36 人搬。男搬 4 &#xff0c;女搬 3 &#xff0c;两个小儿抬一砖。 要求一次全搬完。问需…

GitHub最全中文排行榜开源项目,助你轻松发现优质资源!

文章目录 GitHub-Chinese-Top-Charts&#xff1a;中文开发者的开源项目精选项目介绍项目特点核心功能1. 热门项目榜单2. 详细项目信息 如何使用覆盖范围软件类资料类 GitHub-Chinese-Top-Charts&#xff1a;中文开发者的开源项目精选 在全球范围内&#xff0c;GitHub已经成为了…

谷歌外链:提升网站权重的秘密武器!

谷歌外链之被称为提升网站权重的秘密武器&#xff0c;主要是因为它们对网站的搜索引擎排名有着直接且显著的影响 谷歌和其他搜索引擎使用外链作为衡量网站信任度和权威性的重要指标。当一个网站获得来自其他信誉良好的源的链接时&#xff0c;这被视为信任的投票。多个高质量链…

opencv-图像仿射变换

仿射变换就是将矩形变为平行四边形&#xff0c;而透视变换可以变成任意不规则四边形。实际上&#xff0c;仿射变换是透视变换的子集&#xff0c;仿射变换是线性变换&#xff0c;而透视变换不仅仅是线性变换。 仿射变换设计图像位置角度的变化&#xff0c;是深度学习预处理中常…

力扣SQL50 患某种疾病的患者 正则表达式

Problem: 1527. 患某种疾病的患者 在SQL查询中&#xff0c;REGEXP 是用于执行正则表达式匹配的操作符。正则表达式允许使用特殊字符和模式来匹配字符串中的特定文本。具体到你的查询&#xff0c;^DIAB1|\\sDIAB1 是一个正则表达式&#xff0c;它使用了一些特殊的通配符和符号。…

Vue:vue-router使用指南

一、简介 点击查看vue-router官网 Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成&#xff0c;让用 Vue.js 构建单页应用变得轻而易举。功能包括&#xff1a; 嵌套路由映射动态路由选择模块化、基于组件的路由配置-路由参数、查询、通配符-展示由 Vue.js 的过渡系…

DNS常见面试题

DNS是什么&#xff1f; 域名使用字符串来代替 IP 地址&#xff0c;方便用户记忆&#xff0c;本质上一个名字空间系统&#xff1b;DNS 是一个树状的分布式查询系统&#xff0c;但为了提高查询效率&#xff0c;外围有多级的缓存&#xff1b;DNS 就像是我们现实世界里的电话本、查…

电路板热仿真覆铜率,功率,结温,热阻率信息计算获取方法总结

🏡《电子元器件学习目录》 目录 1,概述2,覆铜率3,功率4,器件尺寸5,结温6,热阻1,概述 电路板热仿真操作是一个复杂且细致的过程,旨在评估和优化电路板内部的热分布及温度变化,以确保电子元件的可靠性和性能。本文简述在进行电路板的热仿真时,元器件热信息的计算方法…