STM32实现MLX90614非接触测温串口显示(标准库与HAL库实现)

news2024/11/24 12:34:25

目录

模块选择

编程环境

 MLX90614基本原理

通信协议(SMBus通信,类IIC通信)

代码实现

STM32与模块之间接线表

1.标准库实现温度采集

2.HAL库实现温度采集


模块选择

        ·STM32F103C8T6

        ·MLX90614 非接触式红外测温传感器

编程环境

        ·KEIL5(μVision V5.30.0.0) 其它版本影响并不大

         ·STM32CubeMX,版本不限

         ·串口助手

 MLX90614基本原理

 引脚说明

编号名称功能
1VCC电源正,3-5V
2GND电源地
3SCL串行时钟输入
4SDA串行地址和数据输入/输出

MLX90614是一种红外温度计,用于非接触式温度测量。红外测温是根据被测物体的红外辐射能量来确定物体的温度,不与被测物体接触,具有不影响被测物体温度分布场,温度分辨率高、响应速度快、测温范围广、不受测温上限的限制、稳定性好等特点。适合于汽车空调、室内暖气、家用电器、手持设备以及医疗设备应用等。

MLX90614的出厂校准温度范围很广:环境温度为-40°C——125°C,目标温度为-70°C——380°C。测量值是传感器视场中所有物体的平均温度。在室温下,MLX90614的标准精确度为±0.5°C。

 MLX90614由MLX81101红外热电堆传感器和包括含有稳压电路、低噪声放大器、A/D转换器、DSP单元、脉宽调制电路及逻辑控制电路的MLX90302信号处理芯片构成。

其工作原理为:红外热电堆传感器输出的温度信号经过内部低噪声、低失调的运算放大器(OPA)放大后经过A/D转换器(ADC)转换为17位数字信号通过可编程FIR及IIR低通数字滤波器(即DSP)处理后输出,输出结果存储在其内部RAM存储单元中。
MLX90614 是由内部状态机控制物体温度和环境温度的测量和计算,进行温度后处理,并将结果通过 PWM 或是 SMBus 模式输出。 ASSP 支持两个 IR 传感器。 (MLX90614xAx 只有一个 IR 传感器) IR 传感器的输出通过增益可编程的低噪声低失 调电压放大器放大,经过 Sigma Delta 调制器转换为单一比特流并反馈给 DSP 做后续的处理。信号通过可编程的 (用 EEPROM 实现) FIR 和 IIR 低通滤波器以进一步减低输入信号的带宽从而达到所需的噪声特性和刷新率。IIR 滤波器的输出为测量结果并存于内部 RAM 中,其中三个单元可被用到:一个是片内温度传感器(片上 PTAT 或 PTC),其余两个为 IR 传感器。 基于以上测量结果,计算出对应的环境温度 Ta物体温度 To,两个温度分辨率都为 0.01 ˚C。Ta 和 To 可通过两种方式读取:通过两线接口读取 RAM 单元,(0.02°C 分辨率,固定范围) 或者通过 PWM 数字模式输出。 (10 位分辨率, 范围可配置) 测量周期的最后一步为:测量所得 Ta 和 To 被重新调节为 PWM 所需的输出分辨率,并且该数据存在 PWM 状态 机的寄存器中,状态机可以产生固定频率和一定占空比来表示测量的数据。

通信协议(SMBus通信,类IIC通信)

单片机与MLX90614红外测温模块之间通信的方式是“类IIC”通信,意思就是通信方式跟IIC通信方式很像但又不是IIC,它有另外一个名字叫做SMBus。SMBus (System Management Bus)是 1995 年由 intel 公司提出的一种高效同步串行总线,SMBus 只有两根信号线:双向数据线和时钟信号线,容许 CPU 与各种外围接口器件以串行方式进行通信、交换信息,既可以提高传输速度也可以减小器件的资源占用,另外即使在没有SMBus 接口的单片机上也可利用软件进行模拟。

代码实现

STM32与模块之间接线表

MLX90614STM32F103C8T6
VCCVCC
GNDGND
SCLPB8
SDAPB9
-PA9(USART1_ TX)
-PA10(USART1_RX)

1.标准库实现温度采集

主函数:

int main(void)
{	
	float Temperature=10;
	char temStr[100] = "";
	int i = 0;			//	循环变量
	delay_init();		//	延时函数初始化配置
	uart_init(115200);
	
	USART_SendData(USART1, 'A');
	Mlx96014_Configuration();
  /* Infinite loop */
  while (1)
  {
		Temperature=SMBus_ReadTemp();
		sprintf(temStr,"The Temperature is:%.2f\r\n",Temperature);
		for(i=0;i<strlen(temStr);i++)
		{
			USART_SendData(USART1, temStr[i]);
			delay_ms(1);
		}
		delay_ms(500);
  }
}

mlx90614.c

/*******************************************************************************
* 文件名   : mlx90614.c
* 作  者        : 
* 版  本        : 
* 日  期        : 2015-08-07
* 描  述        : mlx90614函数
*******************************************************************************/
#include "stm32f10x.h"
#include "mlx90614.h"

/*******************************************************************************
* Function Name  : Mlx90614_Configuration
* Description    : Mlx90614_Configuration
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void Mlx96014_Configuration(void)
{
	GPIO_InitTypeDef GPIO; //声明一个结构体变量
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	// 温度传感器引脚配置
	GPIO.GPIO_Pin = GPIO_Pin_9;//非接触温度传感器SDA 连接PB9
	GPIO.GPIO_Speed = GPIO_Speed_50MHz;//管脚频率为50MHZ
	GPIO.GPIO_Mode = GPIO_Mode_Out_OD;//输出模式为
	GPIO_Init(GPIOB,&GPIO);//初始化GPIOB寄存器
	
	GPIO.GPIO_Pin = GPIO_Pin_8;//非接触温度传感器SCL 连接PB8
	GPIO.GPIO_Speed = GPIO_Speed_50MHz;//管脚频率为50MHZ
	GPIO.GPIO_Mode = GPIO_Mode_Out_OD;//输出模式为
	GPIO_Init(GPIOB,&GPIO);//初始化GPIOB寄存器

	SDA_H;
	SCL_H; //因为SMBus是下降沿触发
}

/*******************************************************************************
* Function Name  : SMBus_StartBit
* Description    : Generate START condition on SMBus
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void SMBus_StartBit(void)
{
	SDA_H;               // Set SDA line 
	SMBus_Delay(1);      // Wait a few microseconds 
	SCL_H;               // Set SCK line  
	SMBus_Delay(5);      // Generate bus free time between Stop
	SDA_L;               // Clear SDA line
	SMBus_Delay(10);     // Hold time after (Repeated) Start
											 // Condition. After this period, the first clock is generated.
											 //(Thd:sta=4.0us min)
	SCL_L;               // Clear SCK line
	SMBus_Delay(2);      // Wait a few microseconds
}

/*******************************************************************************
* Function Name  : SMBus_StopBit
* Description    : Generate STOP condition on SMBus
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/

void SMBus_StopBit(void)
{
	SCL_L;                // Clear SCK line
	SMBus_Delay(5);       // Wait a few microseconds
	SDA_L;                // Clear SDA line
	SMBus_Delay(5);       // Wait a few microseconds
	SCL_H;                // Set SCK line
	SMBus_Delay(10);      // Stop condition setup time(Tsu:sto=4.0us min)
	SDA_H;                // Set SDA line
}

/*******************************************************************************
* Function Name  : SMBus_SendByte
* Description    : Send a byte on SMBus
* Input          : Tx_buffer
* Output         : None
* Return         : None
*******************************************************************************/
u8 SMBus_SendByte(u8 Tx_buffer)
{
	u8        Bit_counter;
	u8        Ack_bit;
	u8        bit_out;


	for(Bit_counter=8; Bit_counter; Bit_counter--)
	{
			if (Tx_buffer&0x80)
			{
					bit_out=1;       // If the current bit of Tx_buffer is 1 set bit_out
			}
			else
			{
					bit_out=0;      // else clear bit_out
			}
			SMBus_SendBit(bit_out);           // Send the current bit on SDA
			Tx_buffer<<=1;                    // Get next bit for checking
	}
	Ack_bit=SMBus_ReceiveBit();           // Get acknowledgment bit
	return        Ack_bit;
}

/*******************************************************************************
* Function Name  : SMBus_SendBit
* Description    : Send a bit on SMBus
* Input          : bit_out
* Output         : None
* Return         : None
*******************************************************************************/
void SMBus_SendBit(u8 bit_out)
{
	if(bit_out==0)
	{
		SDA_L;   
	}
	else
	{
	SDA_H;
	}
	SMBus_Delay(2);                            // Tsu:dat = 250ns minimum
	SCL_H;                                     // Set SCK line
	SMBus_Delay(10);                           // High Level of Clock Pulse
	SCL_L;                                     // Clear SCK line
	SMBus_Delay(10);                           // Low Level of Clock Pulse
//        SMBUS_SDA_H();                       // Master release SDA line ,
	return;
}
/*******************************************************************************
* Function Name  : SMBus_ReceiveBit
* Description    : Receive a bit on SMBus
* Input          : None
* Output         : None
* Return         : Ack_bit
*******************************************************************************/
u8 SMBus_ReceiveBit(void)
{
	u8 Ack_bit;


	SDA_H;             //引脚靠外部电阻上拉,当作输入
	SCL_H;             // Set SCL line
	SMBus_Delay(2);    // High Level of Clock Pulse
	if (SMBUS_SDA_PIN)
	{
			Ack_bit=1;
	}
	else
	{
			Ack_bit=0;
	}
	SCL_L;                    // Clear SCL line
	SMBus_Delay(4);           // Low Level of Clock Pulse
	return   Ack_bit;
}
/*******************************************************************************
* Function Name  : SMBus_ReceiveByte
* Description    : Receive a byte on SMBus
* Input          : ack_nack
* Output         : None
* Return         : RX_buffer
*******************************************************************************/
u8 SMBus_ReceiveByte(u8 ack_nack)
{
	u8        RX_buffer;
	u8        Bit_Counter;
	for(Bit_Counter=8; Bit_Counter; Bit_Counter--)
	{
			if(SMBus_ReceiveBit())         // Get a bit from the SDA line
			{
					RX_buffer <<= 1;           // If the bit is HIGH save 1  in RX_buffer
					RX_buffer |=0x01;
			}
			else
			{
					RX_buffer <<= 1;           // If the bit is LOW save 0 in RX_buffer
					RX_buffer &=0xfe;
			}
	}
	SMBus_SendBit(ack_nack);           // Sends acknowledgment bit
	return RX_buffer;
}


/*******************************************************************************
* Function Name  : SMBus_Delay
* Description    : 延时  一次循环约1us
* Input          : time
* Output         : None
* Return         : None
*******************************************************************************/
void SMBus_Delay(u16 time)
{
	u16 i, j;
	for (i=0; i<4; i++)
	{
			for (j=0; j<time; j++);
	}
}

/*******************************************************************************
 * Function Name  : SMBus_ReadMemory
 * Description    : READ DATA FROM RAM/EEPROM
 * Input          : slaveAddress, command
 * Output         : None
 * Return         : Data
*******************************************************************************/
u16 SMBus_ReadMemory(u8 slaveAddress, u8 command)
{
    u16 data;               // Data storage (DataH:DataL)
    u8 Pec;                 // PEC byte storage
    u8 DataL=0;             // Low data byte storage
    u8 DataH=0;             // High data byte storage
    u8 arr[6];              // Buffer for the sent bytes
    u8 PecReg;              // Calculated PEC byte storage
    u8 ErrorCounter;        // Defines the number of the attempts for communication with MLX90614


    ErrorCounter=0x00;                                // Initialising of ErrorCounter
        slaveAddress <<= 1;        //2-7位表示从机地址

    do
    {
repeat:
        SMBus_StopBit();                //If slave send NACK stop comunication
        --ErrorCounter;                 //Pre-decrement ErrorCounter
        if(!ErrorCounter)               //ErrorCounter=0?
        {
            break;                      //Yes,go out from do-while{}
        }

        SMBus_StartBit();               //Start condition
        if(SMBus_SendByte(slaveAddress))//Send SlaveAddress 最低位Wr=0表示接下来写命令
        {
            goto  repeat;               //Repeat comunication again
        }
        if(SMBus_SendByte(command))     //Send command
        {
            goto    repeat;             //Repeat comunication again
        }

        SMBus_StartBit();                //Repeated Start condition
        if(SMBus_SendByte(slaveAddress+1))  //Send SlaveAddress 最低位Rd=1表示接下来读数据
        {
            goto        repeat;           //Repeat comunication again
        }

        DataL = SMBus_ReceiveByte(ACK);   //Read low data,master must send ACK
        DataH = SMBus_ReceiveByte(ACK);   //Read high data,master must send ACK
        Pec = SMBus_ReceiveByte(NACK);    //Read PEC byte, master must send NACK
        SMBus_StopBit();                  //Stop condition

        arr[5] = slaveAddress;        
        arr[4] = command;
        arr[3] = slaveAddress+1;         //Load array arr
        arr[2] = DataL;                 
        arr[1] = DataH;                
        arr[0] = 0;                   
        PecReg=PEC_Calculation(arr);     //Calculate CRC
    }
    while(PecReg != Pec);                //If received and calculated CRC are equal go out from do-while{}
        data = (DataH<<8) | DataL;       //data=DataH:DataL
    return data;
}

/*******************************************************************************
* Function Name  : PEC_calculation
* Description    : Calculates the PEC of received bytes
* Input          : pec[]
* Output         : None
* Return         : pec[0]-this byte contains calculated crc value
*******************************************************************************/
u8 PEC_Calculation(u8 pec[])
{
    u8         crc[6];
    u8        BitPosition=47;
    u8        shift;
    u8        i;
    u8        j;
    u8        temp;


    do
    {
        /*Load pattern value 0x000000000107*/
        crc[5]=0;
        crc[4]=0;
        crc[3]=0;
        crc[2]=0;
        crc[1]=0x01;
        crc[0]=0x07;
        /*Set maximum bit position at 47 ( six bytes byte5...byte0,MSbit=47)*/
        BitPosition=47;
        /*Set shift position at 0*/
        shift=0;
        /*Find first "1" in the transmited message beginning from the MSByte byte5*/
        i=5;
        j=0;
        while((pec[i]&(0x80>>j))==0 && i>0)
        {
            BitPosition--;
            if(j<7)
            {
                j++;
            }
            else
            {
                j=0x00;
                i--;
            }
        }/*End of while */


        /*Get shift value for pattern value*/
        shift=BitPosition-8;
        /*Shift pattern value */
        while(shift)
        {
            for(i=5; i<0xFF; i--)
            {
                if((crc[i-1]&0x80) && (i>0))
                {
                    temp=1;
                }
                else
                {
                    temp=0;
                }
                crc[i]<<=1;
                crc[i]+=temp;
            }/*End of for*/
            shift--;
        }/*End of while*/
        /*Exclusive OR between pec and crc*/
        for(i=0; i<=5; i++)
        {
            pec[i] ^=crc[i];
        }/*End of for*/
    }
    while(BitPosition>8); /*End of do-while*/

    return pec[0];
}

 /*******************************************************************************
 * Function Name  : SMBus_ReadTemp
 * Description    : Calculate and return the temperature
 * Input          : None
 * Output         : None
 * Return         : SMBus_ReadMemory(0x00, 0x07)*0.02-273.15
*******************************************************************************/
float SMBus_ReadTemp(void)
{   
    return SMBus_ReadMemory(SA, RAM_ACCESS|RAM_Ta)*0.02-273.15;
}

/*********************************END OF FILE*********************************/

 注意:

float SMBus_ReadTemp(void)
{   
    return SMBus_ReadMemory(SA, RAM_ACCESS|RAM_Ta)*0.02-273.15;
}

测的是环境温度,如果需要测量物体表面温度。

#define RAM_TOBJ1     0x07 //To1 address in the eeprom	表面温度
#define RAM_Ta     		0x06 //Ta address in the eeprom		环境温度

实现效果:

2.HAL库实现温度采集

 因为代码封装的较好,移植性较好,和标准库代码基本相似,只需要修改部分核心代码。

修改片段:

#define SMBUS_SCK_H()            HAL_GPIO_WritePin(GPIOB, SMBus_SCL_Pin, GPIO_PIN_SET)
#define SMBUS_SCK_L()            HAL_GPIO_WritePin(GPIOB, SMBus_SCL_Pin, GPIO_PIN_RESET)
#define SMBUS_SDA_H()            HAL_GPIO_WritePin(GPIOB, SMBus_SDA_Pin, GPIO_PIN_SET)
#define SMBUS_SDA_L()            HAL_GPIO_WritePin(GPIOB, SMBus_SDA_Pin, GPIO_PIN_RESET)

#define SMBUS_SDA_PIN()          HAL_GPIO_ReadPin(GPIOB,SMBus_SDA_Pin)

基本就可以实现数据采集了。

注意:

float SMBus_ReadTemp(void)
{   
	return (SMBus_ReadMemory(SA, RAM_ACCESS|RAM_TaA)*0.02-273.15);
}

例子中测试的是物体温度,物体表面温度修改:

#define RAM_TOBJ1                 0x07 			//	物体表面温度
#define RAM_TaA                 	0x06 			//	环境温度

这里需要需要注意的地方,CubeMX生成的代码需要修改一下,不然不能实现采集功能。

推挽输出

GPIO_MODE_OUTPUT_PP

修改成 开漏输出模式

GPIO_MODE_OUTPUT_OD

实现效果:

 源码下载链接:

STM32实现MLX90614非接触测温串口显示(标准库与HAL库实现)资源-CSDN文库

吾芯电子工作室

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

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

相关文章

了解交换机接口的链路类型(access、trunk、hybrid)

上一个章节中讲到了vlan的作用及使用&#xff0c;这篇了解一下交换机接口的链路类型和什么情况下使用 vlan在数据包中是如何体现的&#xff0c;在上一篇的时候提到测试了一下&#xff0c;从PC1去访问PC4的时候&#xff0c;只从E0/0/2发送给了E0/0/3这是&#xff0c;因为两个接…

手把手GDB调试

确保你的程序有可调式的信息 使用gcc编译一个程序 ,带上一些额外的参数 -o0 -g-o0 &#xff1a;避免编译器优化&#xff0c;使用最低的优化等级&#xff0c;默认的编译选项 -g &#xff1a;生产调试信息 如果你已经有一个工程demo&#xff0c;使用cmake时注意使用Debug模式&…

Java使用poi-tl生成word文档添加超链接及添加多个超链接情况

首先是生成单个超链接情况&#xff0c;很简单 就是通过字符替换就行&#xff0c;但是替换的value格式是 TextRenderData data.put("attachment",Texts.of("文件名").link("http://wenjianlj文件路径.com").create()); 就是在替换的data&#…

spring复习:(39)注解方式的ProxyFactoryBean

一、定义接口 package cn.edu.tju.study.service;public interface MyService {void myMethod(); }二、定义实现类&#xff1a; package cn.edu.tju.study.service;public class MyServiceImpl implements MyService{Overridepublic void myMethod() {System.out.println(&qu…

认识一个失意的李白:如何制作一个人物生平二维码?

电影《长安三万里》的火爆&#xff0c;又一次唤醒了我们对大唐盛世的憧憬和向往。 飞流直下的瀑布、洒落床前的月光、花间独酌的美酒、胡天八月的大雪、越过青天的白鹭、长河孤烟的大漠、钟鼓馔玉的宴会……每每读起&#xff0c;那景象如在眼前。 对于一代又一代读着唐诗、听…

小程序一码跳多端的实现架构。。。

以常用的小程序&#xff0c;微信&#xff0c;支付宝为例&#xff0c; 现在要实现一个二维码&#xff0c;通过微信扫跳转微信小程序&#xff0c;通过支付包扫&#xff0c;跳转支付宝小程序&#xff0c;&#xff08;其他小程序也如此&#xff09; 实现思路&#xff0c;H5页面周转…

社区生鲜超市数字化经营怎么做?社区生鲜超市系统一览

社区生鲜超市是一种以货架自助的形式、结合现代超市经营理念&#xff0c;来售卖果蔬、肉类、水产、粮油、熟食等生鲜产品的一种零售形式&#xff0c;通常为小规模的连锁生鲜超市、专营店&#xff0c;主要服务于一个社区、街区等。目前&#xff0c;社区生鲜超市通常拥有较好的区…

【数据结构】二叉树详解(1)

⭐️ 前言 ✨ 二叉树的概念性质 ⭐️ 二叉树链式结构的实现 结构定义&#xff1a; #include <stdio.h> #include <stdlib.h> #include <assert.h>typedef int BinaryTreeDataType;typedef struct BinaryTreeNode {BinaryTreeDataType value;struct Binary…

如何克服Leetcode做题的困境

文章目录 如何克服Leetcode做题的困境问题背景克服困境的建议实践与理论结合切忌死记硬背分析解题思路不要过早看答案迭代式学习寻求帮助坚持与耐心查漏补缺 结论 如何克服Leetcode做题的困境 问题背景 明明自觉学会了不少知识&#xff0c;可真正开始做Leetcode题目时&#x…

用WooCommerce创建一个多用户商城系统和多供应商市场

线上市场是下一波数字化商务。2020 年&#xff0c;超过60% 的线上支出是通过数字市场发生的。人们喜欢从市场上购物&#xff0c;因为它们使购物变得容易。出于同样的原因&#xff0c;企业喜欢通过它们进行销售。通过多用户商城系统和多供应商WooCommerce商城设置&#xff0c;每…

Vue3结果(Result)

可自定义设置以下属性&#xff1a; 结果的状态&#xff0c;决定图标和颜色&#xff08;status&#xff09;&#xff0c;类型&#xff1a;‘success’|‘error’|‘info’|‘warn’|‘404’|‘403’|‘500’&#xff0c;默认&#xff1a;‘info’标题文字&#xff08;title&…

【机密计算-大厂有话说】IBM

什么是机密计算? 机密计算是云计算技术中的一种,通过 CPU 飞地(enclave,飞地可以理解成与世隔绝的世外桃源)隔离处理中的数据。飞地中的内容(处理中的数据)和处理这些数据用到的技术只能被授权的程序代码访问,对于云提供商以及任何人任何事都不可见也不知道。 随着公…

C# 深入理解事件(event)机制

目录 一&#xff0c;引言 二&#xff0c;事件的定义和用法 2.1 同步事件执行 2.2 异步事件执行 2.3 等待异步事件完成 2.4 捕获异常处理中的异常 一&#xff0c;引言 都知道事件的本质是一个多播委托&#xff08;MulticastDelegate)&#xff0c;但对于事件的机制和用法…

【代码随想录 | Leetcode | 第六天】链表 | 反转链表 | 两两交换链表中的节点 | 删除链表的倒数第 N 个结点

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来反转链表、两两交换链表中的节点和删除链表的倒数第N个节点的分享✨ 目录 前言206. 反转链表24. 两两交换链表中的节点19. 删除链表的倒数第 N 个结点总结 206. 反转链表 ✨题目链接点这里 给你…

HDFS与MapResource笔记

客户端向NN请求上传文件 NN回应可以上传 请求上传块,返回DN 所以后面就比较慢 找最近的服务器进行 64K发到1节点,1节点立刻发给2节点,同时1节点自动开始落盘,这里,3个节点是同时落盘的. 因为缓存是在内存中,而持久化是将数据存到磁盘上. 副本节点选择: 1.安全:放不同机架 2.速…

QT中QTimer的循环时间与槽函数执行时间分析,以及在事件循环中触发

目录 当循环时间小于槽函数时间时&#xff1a; 当循环间隔时间大于槽函数时间时&#xff1a; 当存在两个定时器器&#xff0c;其中一个还是间隔100ms&#xff0c;另一个间隔1000ms&#xff1a; 当两个定时器的循环周期大于槽函数执行时间时 当在主程序中添加一个for循环…

13年测试老鸟总结,性能测试-并发用户数估算(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 并发用户数&#…

nuxt3初始化项目后配置eslint+prettier

1、安装 eslint 、eslint-config-prettier、eslint-plugin-prettier、prettier arn add eslint eslint-config-prettier eslint-plugin-prettier prettier -D eslint-config-prettier&#xff1a;关闭eslint中与prettier相互冲突的规则。eslint-plugin-prettier&#xff1a;赋…

26.Java 异常

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的 要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常: 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个…

【Whisper】《OpenAI Whisper 精读【论文精读】》学习笔记

方法 Whisper在论文中表示使用单模型&#xff08;single model&#xff09;来完成多个语音任务&#xff08;multitask&#xff09;&#xff0c;李沐教授认为优点是设计上比较干净&#xff1b; I. 关于单模型效果的疑问 但是他同时也提出了两个疑问&#xff1a; 使用单模型会…