
铂电阻测温原理铂电阻Pt100/Pt1000利用铂的电阻随温度变化的特性进行测温。铂电阻的电阻值与温度呈近似线性关系在-200°C至850°C范围内具有高精度和稳定性。对于PT-RTD最常见的电阻是0°C下标称值为100Ω和 1kΩ当然也有其它阻值。0°C和100°C之间的平均斜率称 为阿尔法(α)斜率与铂的杂质及密度有关。最常见的两个α 值是0.00385和0.00392分别对应于IEC 751 (PT100)和 SAMA标准。RTD转换函数即所谓Callender-Van Dusen 公式可提供更精 确的结果。它由两个不同的多项式公式组成。0°C 以下的温 度使用公式20°C以上的温度使用公式3。温度(T) ≤ 0°C 时公式为T ≥ 0°C 时公式为其中(T)为 RTD 在温度(T)时的电阻。 R0 为RTD在0°C时的电阻本例中R0 100 Ω。A 3.9083 ×.T 为RTD温度(°C)。B −5.775 ×.C −4.183 ×.结合公式2和公式3给出的传递函数有多种方法可以确定 作为RTD电阻函数的温度值。用直接数学方法 因为其精度高。根据公式4可得出以下温度计算公式其中r为RTD电阻其他变量的定义如上所述。 此方法能够很好地处理≥0°C 的温度。计算 0°C 以下的 RTD 温度需要使用最佳拟合多项式表达式。使用多项式为五阶多项式如公式5所示。硬件连接方法两线制接法简单但引线电阻会引入误差适用于短距离或精度要求不高的场景。电路连接铂电阻两端直接接入测量电路。三线制接法通过增加补偿线消除引线电阻影响工业常用。电路连接铂电阻一端接两条线另一端接一条线补偿线与测量电桥相连。四线制接法完全消除引线电阻影响用于高精度测量。电路连接铂电阻两端各接两条线分别用于激励电流和电压测量。采用中科银河芯GXC400芯片的方案介绍典型原理图选用PT100时REF选用400欧姆 C3滤波电容推荐100nF.选用PT1000时REF选用4000欧姆 C3滤波电容推荐10nF.2线连接时: RTDIN短接至FORCE, RTDIN-短接至FORCE-, FORCE2接GND.3线连接时FORCE2短接至FORCE,RTDIN-短接至FORCE-.4线连接时FORCE2接GND.右侧为SPI接口与单片机通信模块供电支持2.7V-3.9VPCB典型布局如下立创开源广场开源链接铂电阻调理芯片GXC400替代MAX31865方案介绍 - 立创开源硬件平台GXC400 寄存器概述寄存器列表配置寄存器RTD寄存器操作示例PT1000四线连接方式50HZ向0x80写0xC3,启用连续转换100ms后读取RTD寄存器0x01和0x02RTD换算公式如下例PT1000REF4000欧姆读出数据0x010x42,0x020x36((0x42361)*4000)/8475*4000/327681,034.5458984375ΩGXC400 SPI时序介绍GXC400支持1 / 3模式的SPI通信协议即SPI总线的极性CPOL 0 / 1SPI总线的相位CPHA 1。GXC400采用四个引脚实现SPI通信串行数据输入引脚SDI、串行数据输出引脚SDO、串行时钟引脚SCLK、片选引脚CS.其中 CS为低有效引脚标志数据传输的起始和终止SCLK仅在CS为低时由上位机产生。图5 图5 SCLK与CPOL的关系图5给出了1 / 3模式SPI通信协议中SCLK的示意图。在模式1中CPOL 0、CPHA 1此时SCLK的初始值为0SCLK的上升沿为数据传输沿下降沿为数据采样沿在模式3中CPOL1、CPHA1此时SCLK的初始值为1SCLK的下降沿为数据传输沿上升沿为数据采样沿。GXC400在与上位机进行SPI通信时均会在数据采样沿采样SDI上被写入芯片的数据并在数据传输沿通过SDO向上位机传输待读取的数据。GXC400在进行SPI通信时的地址和数据均为8bits优先传输MSB。上述过程详见表4。表4 1 / 3模式SPI通信各阶段动作ModeCSNSCLKSDISDO总线空闲High输入失效高阻态写操作LowCPOL 0, SCLK下降沿数据位锁存高阻态CPOL 1, SCLK上升沿读操作LowCPOL 0, SCLK上升沿X下一bit数据移位CPOL 1, SCLK下降沿GXC400 读写操作GXC400在与上位机进行SPI通信的过程中地址和数据字节均以MSB优先的方式移入串行数据输入线SDI完成写操作并从串行数据输出线SDO移出完成读操作。在通信的过程中当CS 拉低后需优先发送地址字节地址字节的最高位表明后续数据为被写入或被读取之后再传输一个或多个数据字节。地址字节的最高位为1时表明后续若干字节为被写入数据地址字节的最高位为0时表明后续若干字节为被读取数据。GXC400支持单字节读写操作或多字节读写操作。当进行单字节读写操作时 CS拉低后总线开始传输地址字节和1 byte数据字节之后CS 拉高该次通信结束见图6、图7。当完成1 byte数据字节传输后上位机可保持CS 继续拉低并发送SCLK芯片可继续与上位机进行多字节读写操作之后传输的数据字节所对应的地址字节会自动递增见图8。当地址字节递增至7Fh / FFh后会自动循环回至00h / 80h。未在表5中定义的寄存器所读出的数据为FFh向只读寄存器中写入的数据不会改变寄存器的值。图6 单字节写操作示意图图7 单字节读操作示意图图8 多字节读写操作示意图GXC400 模拟SPI读写示例以CPOL为0SCLK空闲为高时举例STM32 IO初始化CS,SCLK,SDI需配置为推挽输出SDO配置为浮空输入void GXC400_Init(void) { GPIO_InitTypeDef GPIO_InitStructure ; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin GXC400_SCLK; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_Init(GXC400_CONTROL_PORT,GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GXC400_CS|GXC400_SCLK; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_Init(GXC400_CONTROL_PORT,GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GXC400_SDI; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_Init(GXC400_CONTROL_PORT,GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GXC400_SDO; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_Init(GXC400_CONTROL_PORT,GPIO_InitStructure); GXC400_CS_SET; GXC400_SCLK_CLR; //空闲时为低 }模拟写时序时钟高电平写单字节数据函数说明GXC400 写寄存器,addr:寄存器地址,data:数据 ************************************************/ void GXC400_Write_Byte(unsigned char addr, unsigned char data) { unsigned char i; GXC400_CS_CLR; for(i0; i8; i) //写地址 { GXC400_SCLK_SET; if(addr0x80) GXC400_SDI_SET; else GXC400_SDI_CLR; GXC400_SCLK_CLR; addr1; } for(i0; i8; i) //写数据 { GXC400_SCLK_SET; if(data0x80) GXC400_SDI_SET; else GXC400_SDI_CLR; GXC400_SCLK_CLR; data1; } GXC400_CS_SET; }模拟读时序时钟低电平读单字节数据函数说明GXC400 读寄存器 ,addr:寄存器地址 ************************************************/ unsigned char GXC400_Read_Byte(unsigned char addr) { unsigned char i; unsigned char data0; GXC400_CS_CLR; for(i0; i8; i) //写地址 { GXC400_SCLK_SET; if(addr0x80) GXC400_SDI_SET; else GXC400_SDI_CLR; GXC400_SCLK_CLR; addr1; } for(i0; i8; i) //读数据 { GXC400_SCLK_SET; data1; GXC400_SCLK_CLR; if(GXC400_SDO_READ) data|0x01; else data|0x00; } GXC400_CS_SET; return data; }模拟读两字节时序void GXC400_Read_2Byte(unsigned char addr,unsigned char* MSB, unsigned char* LSB) { unsigned char i; unsigned char DATA_MSB0; unsigned char DATA_LSB0; GXC400_CS_CLR; for(i0; i8; i) //写地址 { GXC400_SCLK_SET; if(addr0x80) GXC400_SDI_SET; else GXC400_SDI_CLR; GXC400_SCLK_CLR; addr1; } for(i0; i8; i) //读数据 { GXC400_SCLK_SET; DATA_MSB1; GXC400_SCLK_CLR; if(GXC400_SDO_READ) DATA_MSB|0x01; else DATA_MSB|0x00; } for(i0; i8; i) //读数据 { GXC400_SCLK_SET; DATA_LSB1; GXC400_SCLK_CLR; if(GXC400_SDO_READ) DATA_LSB|0x01; else DATA_LSB|0x00; } GXC400_CS_SET; *MSB DATA_MSB; *LSB DATA_LSB; }示波器采集波形 黄色为CS 青色为SCLK 紫色为SDO 蓝色为SDI向0x80写单字节为0xC3读0x00单字节为0xC1读0x01双字节为0x4698STM32电阻转温度示例函数说明GXC400 获取温度 ************************************************/ float GXC400_GetTemp(void) { unsigned char MSB0x00,LSB0x00; unsigned int RREF 4000; //PT10004000Ω PT100:400Ω unsigned int data; float Rt; float Rt0 1000; //PT10001000 PT100:100 float Z1,Z2,Z3,Z4,temp; float a 3.9083e-3; float b -5.775e-7; float rpoly; GXC400_Read_2Byte(0x01,MSB,LSB); data MSB8|LSB; data1; //去掉Fault位 Rt(float)data/32768.0*RREF; Z1 -a; Z2 a*a-4*b; Z3 4*b/Rt0; Z4 2*b; temp Z2Z3*Rt; temp (sqrt(temp)Z1)/Z4; if(temp0) { return temp; } 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; }