MAX31865模块温度测量

0 前言

本文主要介绍MAX31865 测温注意事项,并写出读取温度的示例代码,模块详细参数可以查阅相关手册,

1 注意事项

1.1 参考电阻

电阻温度检测器(RTD)是一种阻值随温度变化的电阻。铂是最常见、精度最高的测温金属丝材料。铂RTD称为PT-RTD,镍、铜和其它金属亦可用来制造RTD。RTD具有较宽的测温范围,最高达+800°C,具有较高精度和较好的可重复性,线性度适中。

为测量RTD阻值,接入参考电阻(RREF),该电阻与RTD串联,偏置电压作用在RREF上端,3线制典型应用电路如下图所示,

在这里插入图片描述
参考电阻的电流同样流过RTD。参考电阻两端的电压为ADC基准电压。RTD电压连接至ADC差分输入(RTDIN+和RTDIN-)。所以ADC产生的数字输出等于RTD电阻与参考电阻的比值。对于铂电阻RTD,选择阻值等于RTD 0°C阻值的4倍的参考电阻最为合适。因此,针对PT100选用400Ω参考电阻;针对PT1000则选用4kΩ参考电阻

1.2 SPI时序图

读取寄存器数据,先写入要读的地址,再读取数据,时序图如下,
在这里插入图读时序片描述

写数据到寄存器,先写入要写的地址,再写入数据, 如下图所示,
在这里插入图片描述
时钟极性和相位

在这里插入图片描述

1.3 寄存器

MAX3186主要有8个寄存器,如下表所示,
在这里插入图片描述
0x00:配置寄存器,需要配置2/3/4线,故障检测周期等
0x01-0x02:RTD电阻寄存器,由两个8位的寄存器组成,包含15位有效数据,RTD LBS 的bit0为故障位,表示检测到任意RTD故障,应用软件中需要做故障判断处理
0x03-0x06:故障上限和故障下限寄存器用于选择RTD故障检测的触发门限。
0x07:故障状态寄存器锁存所有检测到的故障位;向配置寄存器中的故障状态清除位写1时,将全部故障状态位清零。

2 将RTD数据寄存器值转换为温度

首先,利用下面公式确定RTD的阻值,
在这里插入图片描述
ADC编码 = RTD数据寄存器(01h – 02h)中的15位ADC转换结果,RREF = 基准电阻的阻值
如果RTD的阻值已知、电阻特性定义良好,则可通过计算或查找表确定温度值。

2.1 线性化温度数据

对于-100°C至+100°C温度范围,简单利用RTD数据可以很好地实现温度逼近,如下所示:
温度(°C) ≈  (ADC编码/32) – 256
从该式可以得出:0°C时,误差为0°C; -100°C时,误差为-1.75°C; +100°C时,误差为-1.4°C (假 设采用IEC751RTD,RREF等于0°C RTD电阻的四倍)。

PT100实际测量发现,50°环境中,计算值和实际值相差1.8°左右,这样无法直接用到项目中,那就看看第2种转换方式

2.2 RTD温度计算(PT100)

查阅了网上大量资料,都是用线性化处理的方式,最后在Github项目中,发现采用下面公式转化温度和实际测量值保持一致
在这里插入图片描述
更多详细说明请参考芯片手册《AN-709 APPLICATION NOTE》

3 示例代码

下图是某个项目中的MAX31865的设计图,这里参考电阻为402欧/1%,采用3线制接入PT100,主控芯片是STM32F107
在这里插入图片描述
温度采集的示例代码

// 定义结构体,用于读取整个模块数据
struct rtd_max31865
{
    uint8_t config_reg;
    uint16_t rtd_reg;
    uint16_t hft_reg;
    uint16_t lft_reg;
    uint8_t  status_reg;
};

void spi_delay( uint32_t delay )
{
	while( delay--);
}

void send_byte( uint8_t data )
{
    uint8_t i;
	uint32_t delay = 0xff;
	
    for (i = 0; i < 8; i++)
    {
		SPI3_SCLK_L();
		spi_delay(delay);
		
		if( data & 0x80 )
		{
			SPI3_MOSI_H();
		}
		else
		{
			SPI3_MOSI_L();
		}

        spi_delay(delay);
		
		SPI3_SCLK_H();
		spi_delay(delay);

        data <<= 1;
    }
}

uint8_t read_byte( void )
{
    uint8_t i;
	uint8_t read = 0;
	uint32_t delay = 0xff;

    for (i = 0; i < 8; i++)
    {        
		SPI3_SCLK_L();
		spi_delay(delay);
		
        read = read << 1;

		if ( SPI3_READ_BIT() ) 
		{
			read += 1;
		}
		else
		{
			read += 0;
		}

        SPI3_SCLK_H();
        spi_delay(delay);
    }
    return read;
}

void max31865_config( uint8_t addr, uint8_t data )
{
	send_byte( addr );
	send_byte( data );
}
void max31865_read( struct rtd_max31865* max31865 )
{
	uint8_t i, read_data[8];
	
	send_byte( 0 );
	
	for ( i = 0; i < 8; i++ )
	{
		read_data[i] = read_byte();
		
	}
	
	max31865->config_reg = read_data[0];
	max31865->rtd_reg = ((read_data[1] << 8) | read_data[2]) >> 1;
	max31865->hft_reg = ((read_data[3] << 8) | read_data[4]) >> 1;    
    max31865->lft_reg = (read_data[5] << 8) | read_data[6];            
    max31865->status_reg = read_data[7];                                  
}

float max31865_read_temp( struct rtd_max31865* max31865 )
{ 
	uint8_t i;
	uint32_t adc_val = 0;
	float rtd;
	unsigned int data;
	float Rt;
	float Rt0 = 100;  //PT100	
	float Z1,Z2,Z3,Z4,temp;
	float a = 3.9083e-3;
	float b = -5.775e-7;
	float rpoly;

	for ( i = 0; i < 10; i++ )
	{
		max31865_read(max31865);
		
		adc_val += max31865->rtd_reg;
	
		HAL_Delay(2);
	}
	
	Rt = (double)( adc_val * 402) / (32768 * 10);
	
	Z1 = -a;
	Z2 = a*a-4*b;
	Z3 = 4*b/Rt0;
	Z4 = 2*b;
	temp = Z2+Z3*Rt;
	temp = (sqrt(temp)+Z1)/Z4;
	
	
	// 温度大于0
	if(temp>=0)
	{
		return temp;
	}

	// 温度小于0
	rpoly = Rt;
	temp = -242.02;
	temp += 2.2228 * rpoly;
	rpoly *= Rt;  // square
	temp += 2.5859e-3 * rpoly;
	rpoly *= Rt;  // ^3
	temp -= 4.8260e-6 * rpoly;
	rpoly *= Rt;  // ^4
	temp -= 2.8183e-8 * rpoly;
	rpoly *= Rt;  // ^5
	temp += 1.5243e-10 * rpoly;

	return temp;
}

void max31865_init( void )
{
	max31865_config( 0x80, 0xD0);
}
### 回答1: MAX31865是一种高精度的温度传感器接口芯片,常用于测量温度。 连接MAX31865测温模块的步骤如下: 1. 首先,将MAX31865模块与需要测量温度的传感器连接。MAX31865模块有4个引脚:VCC、GND、SCK和SDO。将VCC引脚连接到正电源(如+5V),将GND引脚连接到地(GND),将SCK引脚连接到主控设备的时钟引脚,将SDO引脚连接到主控设备的数据输入/输出引脚。 2. 接下来,连接SPI总线。MAX31865使用SPI协议与主控设备通信。因此,将主控设备的SPI引脚(包括SCK、MISO和MOSI)连接到MAX31865模块的相应引脚。 3. 在连接完硬件之后,需要使用相应的软件代码来与MAX31865进行通信。通过SPI协议,主控设备可以向MAX31865发送命令,并读取温度数据。 4. 在使用MAX31865之前,需要进行相应的初始化设置。可以通过发送配置命令来设置传感器类型、滤波器设置以及其他参数。 5. 当初始化完成后,可以从MAX31865读取温度数据。主控设备发送读取命令后,MAX31865会将传感器的温度数据通过SPI接口发送给主控设备。 需要注意的是,由于MAX31865是一个接口芯片,它并不直接测量温度,而是通过与温度传感器通信来获取温度数据。因此,在连接MAX31865之前,需要选择并连接适合的温度传感器。 总之,连接MAX31865测温模块需要连接硬件和编写相应的软件代码,并通过SPI协议与主控设备通信,以获取精确的温度数据。 ### 回答2: MAX31865是一款专门用于测量温度的芯片。它采用了精确的热电偶补偿技术,可以有效地提高温度测量的准确性和稳定性。 MAX31865测温芯片的连接可以分为几个步骤: 1. 首先,我们需要准备一个MAX31865测温模块和所需要的外部元件,如热电偶等。 2. 将热电偶的一端连接到MAX31865测温模块的相应引脚。通常,热电偶的正极连接到V+引脚,负极连接到V-引脚。 3. 接下来,将MAX31865测温模块的SDO引脚连接到所选择的微控制器或单片机的相应引脚。这个引脚用于与模块进行通信和接收温度测量结果。 4. 将MAX31865测温模块的CS引脚连接到微控制器或单片机的相应引脚。这个引脚用于选择通信设备,将其与模块连接。 5. 最后,将MAX31865测温模块的SCK引脚连接到微控制器或单片机的相应引脚。这个引脚用于同步数据传输。 在连接完成后,我们可以使用微控制器或单片机MAX31865测温模块进行通信,读取热电偶测量温度值,并进行相应的数据处理和显示。需要注意的是,连接步骤可以根据具体的硬件平台和应用需求进行适当的调整。 ### 回答3: MAX31865是一种高精度数字温度传感器,常用于工业和科学应用中对温度测量和监控。为了连接MAX31865进行温度测量,首先需要准备以下硬件组件:MAX31865传感器模块、Arduino板、以及必要的电气线缆和连接件。 接下来,将MAX31865传感器模块与Arduino板连接。首先,将传感器模块的GND引脚连接到Arduino的GND引脚;然后,将VCC引脚连接到Arduino的5V引脚;接着,将SCK引脚连接到Arduino的数字引脚13;再将SDI引脚连接到Arduino的数字引脚11,最后将SDO引脚连接到Arduino的数字引脚12。 接着,在Arduino开发环境中编写程序来读取并处理MAX31865传感器的输出。首先,导入必要的库文件,包括SPI库和MAX31865库。然后,定义所使用的引脚和创建MAX31865对象。在设置函数中,初始化SPI连接和MAX31865传感器。接着,在循环函数中,使用读取温度函数获取传感器的温度测量值,并将其存储在一个变量中。 最后,可以根据需要对温度数据进行进一步处理,例如将其显示在液晶屏或通过串口传输到计算机上进行监控和记录。可以根据具体的应用需求进行适当的编程操作,以实现对MAX31865传感器的测温连接和数据获取。通过这样的连接和编程操作,可以方便地进行温度的实时测量和监控,实现各种应用场景中的相关控制和处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值