PT100/PT1000 工业级温度传感器
来自Jack's Lab
(版本间的差异)
(→概述) |
|||
(未显示1个用户的19个中间版本) | |||
第1行: | 第1行: | ||
== 概述 == | == 概述 == | ||
− | + | 工业和医学应用中,如果测量的温度范围很宽,比如 -200°C ~ +800°C ,且对精度、可重复性要求比较高,最好的选择是铂电阻温度 (RT) 检测器,即 PRTD。 | |
− | + | PRTD 中的铂元素非常稳定,且不容易腐蚀或氧化。PRTD 的电阻与温度呈线性关系,温度越高电阻越大。 | |
− | PRTD | + | 常见的 PRTD 包括 PT100、PT500 和 PT1000。在 0°C 下分别呈现 100Ω、500Ω 和 1000Ω 的阻值,其阻值会随温度变化 ([[PT1000 Table]])。也有成本稍高的大阻值传感器,例如 PT10000 |
− | + | <br> | |
+ | == PT1000 Table == | ||
[[PT1000 Table]] | [[PT1000 Table]] | ||
第14行: | 第15行: | ||
<br><br> | <br><br> | ||
− | == ESP8266 ADC == | + | == 测量原理 == |
+ | |||
+ | PRTD 传统测量方法是采用电流源激励: | ||
+ | |||
+ | [[文件:PT1000-measure.gif]] | ||
+ | |||
+ | |||
+ | 对于较高阻值的 PRTD,应采用高精度电压源激励 PRTD,可以利用 ADC 的电压基准为 PRTD 提供偏压。PRTD 可直接连接到 ADC,ADC 基准通过一个高精度电阻提供 PRTD 偏置电流。ADC即可以高精度比例测量温度: | ||
+ | |||
+ | [[文件:PT1000-measure2.gif]] | ||
+ | |||
+ | <br><br> | ||
+ | |||
+ | == ADC == | ||
+ | |||
+ | === ESP8266 ADC === | ||
硬件连接: | 硬件连接: | ||
第42行: | 第58行: | ||
<br><br> | <br><br> | ||
− | == MCP3421 == | + | === MCP3421 === |
[[文件:Mcp3421-app.png]] | [[文件:Mcp3421-app.png]] | ||
第281行: | 第297行: | ||
=== MAX31865 === | === MAX31865 === | ||
− | * | + | * SPI Interface |
+ | * Handles 100 Ω to 1000 Ω (at 0°C) Platinum RTDs (PT100 to PT1000) | ||
+ | * Compatible with 2-, 3-, and 4-Wire Sensor Connections | ||
+ | * 15-Bit ADC Resolution; Nominal Temperature Resolution 0.03125NC (Varies Due to RTD Nonlinearity) | ||
+ | * Total Accuracy Over All Operating Conditions: 0.5NC (0.05% of Full Scale) max | ||
+ | * Fully Differential VREF Inputs | ||
+ | * 21ms (max) Conversion Time | ||
+ | * 20-Pin TQFN and SSOP Packages | ||
− | + | * [https://datasheets.maximintegrated.com/en/ds/MAX31865.pdf MAX31865 Datasheet] | |
+ | |||
+ | [[文件:MAX31865-App.jpg | 700px]] | ||
+ | |||
+ | <br> | ||
=== MAX6603 === | === MAX6603 === | ||
* https://datasheets.maximintegrated.com/en/ds/MAX6603.pdf | * https://datasheets.maximintegrated.com/en/ds/MAX6603.pdf | ||
+ | |||
+ | <br><br> | ||
+ | |||
+ | == 电压基准 == | ||
+ | |||
+ | 对于传感器测量应用,基准输出用作ADC或AFE输入,也用作变送器激励。如果噪声或其它原因造成基准电压波动,传感器输入和ADC都将发生相同的波动,从而降低总误差 | ||
+ | |||
+ | 压基基准噪声源降低 ADC 的噪声性能,所以应选择性能优于 ADC 的基准。对于高精度系统,基准的初始误差以及温漂和时漂是增益误差的最重要因素之一。对于经过校准的系统,温漂和时漂是最关键的参数 | ||
+ | |||
+ | 选择基准时的关键参数包括:负载驱动、初始精度、噪声、温漂和稳定度 | ||
+ | |||
+ | === TL431 === | ||
+ | |||
+ | * http://www.ti.com/lit/ds/symlink/tl431.pdf | ||
+ | |||
+ | <br> | ||
+ | |||
+ | === MAX === | ||
+ | |||
+ | * https://www.maximintegrated.com/cn/app-notes/index.mvp/id/2879 | ||
+ | |||
+ | <source lang=bash> | ||
+ | Maxim电压基准的精简列表 | ||
+ | Part Number Output Voltage (V) Supply Voltage Range (V) Temp. Drift (ppm/°C max) Initial Accuracy TA = +25°C (% F.S. max) Quiescent Current (mA max) 0.1Hz to 10Hz Noise (µVP-P), max (typ) Package Options Temp. Ranges* | ||
+ | MAX6160 Adj.(1.23 to 12.4) 2.7 to 12.6 100 1 100µA (15) SOT143, SO E | ||
+ | MAX6120 1.2 2.4 to 11 100 1 70µA (10) SOT23, SO E | ||
+ | MAX6520 1.2 2.4 to 12.6 50 1 70µA (10) SOT23, SO E | ||
+ | MAX6001 1.25 2.5 to 12.6 100 1 45µA 25 SOT23 E | ||
+ | MAX6012 1.25 2.5 to 12.6 20 to 30 0.3 to 0.5 35µA 25 SOT23 E | ||
+ | MAX6190 1.25 2.5 to 12.6 5 to 25 0.16 to 0.48 35µA 25 SO E | ||
+ | MAX6021 2.048 2.5 to 12.6 20 to 30 0.2 to 0.4 35µA 40 SOT23 E | ||
+ | MAX6191 2.048 2.5 to 12.6 5 to 25 0.1 to 0.5 35µA 40 SO E | ||
+ | MAX873 2.5 4.5 to 18 7 to 20 0.06 to 0.1 28µA (16) DIP, SO C, E | ||
+ | MAX6002 2.5 2.7 to 12.6 100 1 45µA 60 SOT23 E | ||
+ | MAX6025 2.5 2.7 to 12.6 20 to 30 0.2 to 0.4 35µA 60 SOT23 E | ||
+ | MAX6125 2.5 2.7 to 12.6 50 1 100µA (15) SOT23, SO E | ||
+ | MAX6192 2.5 2.7 to 12.6 5 to 25 0.1 to 0.4 35µA 60 SO E | ||
+ | MAX6225 2.5 8 to 36 2 to 5 0.04 to 0.1 2.7 (1.5) DIP, SO C, E | ||
+ | MAX6325 2.5 8 to 36 1 to 2.5 0.04 2.7 (1.5) DIP, SO C, E | ||
+ | MAX6003 3 3.2 to 12.6 100 1 45µA 75 SOT23 E | ||
+ | MAX6030 3 3.2 to 12.6 20 to 30 0.2 to 0.4 35µA 75 SOT23 E | ||
+ | MAX6193 3 3.2 to 12.6 5 to 25 0.07 to 0.33 35µA 75 SO E | ||
+ | MAX6004 4.096 4.3 to 12.6 100 1 45µA 100 SOT23 E | ||
+ | MAX6041 4.096 4.3 to 12.6 20 to 30 0.2 to 0.4 35µA 100 SOT23 E | ||
+ | MAX6141 4.096 4.3 to 12.6 50 1 105µA (25) SOT23, SO E | ||
+ | MAX6198 4.096 4.3 to 12.6 5 to 25 0.05 to 0.24 35µA 100 SO E | ||
+ | MAX6241 4.096 8 to 36 2 to 5 0.025 to 0.1 2.9 (2.4) DIP, SO C, E | ||
+ | MAX6341 4.096 8 to 36 1 to 2.5 0.025 2.9 (1.5) DIP, SO C, E | ||
+ | MAX6045 4.5 4.7 to 12.6 20 to 30 0.2 to 0.4 35µA 110 SOT23 E | ||
+ | MAX6145 4.5 4.7 to 12.6 50 1 105µA (30) SOT23, SO E | ||
+ | MAX6194 4.5 4.7 to 12.6 5 to 25 0.04 to 0.22 35µA 110 SO E | ||
+ | MAX675 5 8 to 33 12 to 20 0.15 1.4 15 TO-99, DIP, SO C, E | ||
+ | MAX875 5 7 to 18 7 to 20 0.06 to 0.1 0.28 (32) DIP, SO C, E | ||
+ | MAX6005 5 5.2 to 12.6 100 1 45µA 120 SOT23 E | ||
+ | MAX6050 5 5.2 to 12.6 20 to 30 0.2 to 0.4 35µA 120 SOT23 E | ||
+ | MAX6150 5 5.2 to 12.6 50 1 110µA (35) SOT23, SO E | ||
+ | MAX6195 5 5.2 to 12.6 5 to 25 0.04 to 0.2 35µA 120 SO E | ||
+ | MAX6250 5 8 to 36 2 to 5 0.02 to 0.1 3 (3) DIP, SO C, E | ||
+ | MAX6350 5 8 to 36 1 to 2.5 0.02 3 (1.5) DIP, SO C, E | ||
+ | REF02 5 8 to 33 8.5 to 250 0.3 to 2 1.4 15 TO-99, DIP, SO C | ||
+ | *温度范围:C = 0°C至+70°C,E = -40°C至85°C | ||
+ | |||
+ | 文献 | ||
+ | The Art of Electronics, by Paul Horowitz & Winfield Hill, Chapter 6 | ||
+ | Micro-Electronic Circuits, by Adel S. Sedra & Kenneth C. Smith | ||
+ | </source> | ||
<br><br> | <br><br> |
2018年10月24日 (三) 10:38的最后版本
目录 |
[编辑] 1 概述
工业和医学应用中,如果测量的温度范围很宽,比如 -200°C ~ +800°C ,且对精度、可重复性要求比较高,最好的选择是铂电阻温度 (RT) 检测器,即 PRTD。
PRTD 中的铂元素非常稳定,且不容易腐蚀或氧化。PRTD 的电阻与温度呈线性关系,温度越高电阻越大。
常见的 PRTD 包括 PT100、PT500 和 PT1000。在 0°C 下分别呈现 100Ω、500Ω 和 1000Ω 的阻值,其阻值会随温度变化 (PT1000 Table)。也有成本稍高的大阻值传感器,例如 PT10000
[编辑] 2 PT1000 Table
[编辑] 3 测量原理
PRTD 传统测量方法是采用电流源激励:
对于较高阻值的 PRTD,应采用高精度电压源激励 PRTD,可以利用 ADC 的电压基准为 PRTD 提供偏压。PRTD 可直接连接到 ADC,ADC 基准通过一个高精度电阻提供 PRTD 偏置电流。ADC即可以高精度比例测量温度:
[编辑] 4 ADC
[编辑] 4.1 ESP8266 ADC
硬件连接:
VCC33 ---> PT1000 <-- (A0) --> 300R 1% ---> GND
void setup() { Serial.begin(115200); } void loop() { int vd = analogRead(A0); Serial.print("vd = "); Serial.println(vd); uint32_t rtd = (1024 - vd) * 300 / vd; Serial.print("rtd = "); Serial.println(rtd); delay(1000); }
[编辑] 4.2 MCP3421
- 快速测试:
#include <Wire.h> #define MCP3421_ADDRESS 0X68 void setup() { Serial.begin(115200); Wire.begin(); } void loop() { Wire.requestFrom(MCP3421_ADDRESS, 4); if (Wire.available() != 4) { Serial.println("Wire.available failed"); while(1); } int16_t v = (Wire.read() << 8); v |= Wire.read(); // read but ignore status uint8_t s = Wire.read(); //print voltage from channel one in millivolts Serial.print(v);Serial.println(" mv"); delay(1500); }
- 改进:
#include <Wire.h> // I2C address for MCP3422 - base address for MCP3424 = 0x68 #define MCP342X_ADDRESS 0X68 // fields in configuration register #define MCP342X_GAIN_FIELD 0X03 // PGA field #define MCP342X_GAIN_X1 0X00 // PGA gain X1, 12 bits, 1 mV #define MCP342X_GAIN_X2 0X01 // PGA gain X2, 14 bits, 250 uV #define MCP342X_GAIN_X4 0X02 // PGA gain X4, 16 bits, 62.5 uV #define MCP342X_GAIN_X8 0X03 // PGA gain X8, 18 bits, 15.625 uV #define MCP342X_RES_FIELD 0X0C // resolution/rate field #define MCP342X_RES_SHIFT 0X02 // shift to low bits #define MCP342X_12_BIT 0X00 // 12-bit 240 SPS #define MCP342X_14_BIT 0X04 // 14-bit 60 SPS #define MCP342X_16_BIT 0X08 // 16-bit 15 SPS #define MCP342X_18_BIT 0X0C // 18-bit 3.75 SPS #define MCP342X_CONTINUOUS 0X10 // 1 = continuous, 0 = one-shot #define MCP342X_CHAN_FIELD 0X60 // channel field #define MCP342X_CHANNEL_1 0X00 // select MUX channel 1 #define MCP342X_CHANNEL_2 0X20 // select MUX channel 2 #define MCP342X_CHANNEL_3 0X40 // select MUX channel 3 #define MCP342X_CHANNEL_4 0X60 // select MUX channel 4 #define MCP342X_START 0X80 // write: start a conversion #define MCP342X_BUSY 0X80 // read: output not ready uint8_t chan = 0XFF, gain = 0XFF, res = 0XFF; //------------------------------------------------------------------------ // default adc configuration register - resolution and gain added in setup() uint8_t adcConfig = MCP342X_START | MCP342X_CHANNEL_1 | MCP342X_CONTINUOUS; // divisor to convert ADC reading to milivolts uint32_t mvDivisor; void halt(void) { Serial.println("Halted - check address and wiring"); while(1); } // read mcp342x data - updated 10mar11/wbp uint8_t mcp342xRead(int32_t &data) { // pointer used to form int32 data uint8_t *p = (uint8_t *)&data; // timeout - not really needed? uint32_t start = millis(); if ((adcConfig & MCP342X_RES_FIELD) == MCP342X_18_BIT) // in 18 bit mode? { do { // 18-bit mode Wire.requestFrom(MCP342X_ADDRESS, 4); if (Wire.available() != 4) { Serial.println("read failed"); return false; } for (int8_t i = 2; i >= 0; i--) { p[i] = Wire.read(); } // extend sign bits p[3] = p[2] & 0X80 ? 0XFF : 0; // read config/status byte uint8_t s = Wire.read(); if ((s & MCP342X_BUSY) == 0) return true; // escape here } while (millis() - start < 500); // allows rollover of millis() } else { do { // 12-bit to 16-bit mode Wire.requestFrom(MCP342X_ADDRESS, 3); if (Wire.available() != 3) { Serial.println("read failed"); return false; } p[1] = Wire.read(); p[0] = Wire.read(); // extend sign bits p[2] = p[1] & 0X80 ? 0XFF : 0; p[3] = p[2]; // read config/status byte uint8_t s = Wire.read(); if ((s & MCP342X_BUSY) == 0) return true; // or escape here } while (millis() - start < 500); // allows rollover of millis() } Serial.println("read timeout"); // dang it return false; } // write mcp342x configuration byte uint8_t mcp342xWrite(uint8_t config) { Wire.beginTransmission(MCP342X_ADDRESS); Wire.write(config); Wire.endTransmission(); } void setup() { Serial.begin(115200); pinMode(D4, OUTPUT); digitalWrite(D4, LOW); Wire.begin(); do { Serial.println(); Serial.flush(); Serial.print("Enter gain (1, 2, 4, or 8): "); while(Serial.available() < 1); switch (Serial.read()) { case '1': // ACSCII number received gain = MCP342X_GAIN_X1; break; case '2': gain = MCP342X_GAIN_X2; break; case '4': gain = MCP342X_GAIN_X4; break; case '8': gain = MCP342X_GAIN_X8; break; } } while (gain > 3); Serial.println(1 << gain, DEC); do { Serial.flush(); Serial.println(); Serial.print("Enter resolution (12, 14, 16, or 18): "); while (Serial.available() < 2); if (Serial.read() != '1') continue; switch (Serial.read()) { case '2': res = 0; break; case '4': res = 1; break; case '6': res = 2; break; case '8': res = 3; break; } } while (res > 3); Serial.println(12 + 2*res, DEC); adcConfig |= res << 2 | gain | MCP342X_START; // divisor to convert ADC reading to millivolts mvDivisor = 1 << (11 + 2*res); Serial.print("md = "); Serial.println(mvDivisor); } void loop() { int32_t data; mcp342xWrite(adcConfig); if (!mcp342xRead(data)) halt(); Serial.print("data = "); Serial.println(data); // voltage in millivolts double mv = (double)data * 2048 / mvDivisor; // uncomment line below to convert reading to microvolts uint32_t uv = mv * 1000; Serial.print("V = "); Serial.print(mv); Serial.print(" mV"); Serial.print(" , "); Serial.print(uv); Serial.println(" uV"); delay(2000); // 5 seconds + conversion time x 4 }
[编辑] 5 专用芯片
选型: Temperature Sensor Tutorial
[编辑] 5.1 MAX31865
- SPI Interface
- Handles 100 Ω to 1000 Ω (at 0°C) Platinum RTDs (PT100 to PT1000)
- Compatible with 2-, 3-, and 4-Wire Sensor Connections
- 15-Bit ADC Resolution; Nominal Temperature Resolution 0.03125NC (Varies Due to RTD Nonlinearity)
- Total Accuracy Over All Operating Conditions: 0.5NC (0.05% of Full Scale) max
- Fully Differential VREF Inputs
- 21ms (max) Conversion Time
- 20-Pin TQFN and SSOP Packages
[编辑] 5.2 MAX6603
[编辑] 6 电压基准
对于传感器测量应用,基准输出用作ADC或AFE输入,也用作变送器激励。如果噪声或其它原因造成基准电压波动,传感器输入和ADC都将发生相同的波动,从而降低总误差
压基基准噪声源降低 ADC 的噪声性能,所以应选择性能优于 ADC 的基准。对于高精度系统,基准的初始误差以及温漂和时漂是增益误差的最重要因素之一。对于经过校准的系统,温漂和时漂是最关键的参数
选择基准时的关键参数包括:负载驱动、初始精度、噪声、温漂和稳定度
[编辑] 6.1 TL431
[编辑] 6.2 MAX
Maxim电压基准的精简列表 Part Number Output Voltage (V) Supply Voltage Range (V) Temp. Drift (ppm/°C max) Initial Accuracy TA = +25°C (% F.S. max) Quiescent Current (mA max) 0.1Hz to 10Hz Noise (µVP-P), max (typ) Package Options Temp. Ranges* MAX6160 Adj.(1.23 to 12.4) 2.7 to 12.6 100 1 100µA (15) SOT143, SO E MAX6120 1.2 2.4 to 11 100 1 70µA (10) SOT23, SO E MAX6520 1.2 2.4 to 12.6 50 1 70µA (10) SOT23, SO E MAX6001 1.25 2.5 to 12.6 100 1 45µA 25 SOT23 E MAX6012 1.25 2.5 to 12.6 20 to 30 0.3 to 0.5 35µA 25 SOT23 E MAX6190 1.25 2.5 to 12.6 5 to 25 0.16 to 0.48 35µA 25 SO E MAX6021 2.048 2.5 to 12.6 20 to 30 0.2 to 0.4 35µA 40 SOT23 E MAX6191 2.048 2.5 to 12.6 5 to 25 0.1 to 0.5 35µA 40 SO E MAX873 2.5 4.5 to 18 7 to 20 0.06 to 0.1 28µA (16) DIP, SO C, E MAX6002 2.5 2.7 to 12.6 100 1 45µA 60 SOT23 E MAX6025 2.5 2.7 to 12.6 20 to 30 0.2 to 0.4 35µA 60 SOT23 E MAX6125 2.5 2.7 to 12.6 50 1 100µA (15) SOT23, SO E MAX6192 2.5 2.7 to 12.6 5 to 25 0.1 to 0.4 35µA 60 SO E MAX6225 2.5 8 to 36 2 to 5 0.04 to 0.1 2.7 (1.5) DIP, SO C, E MAX6325 2.5 8 to 36 1 to 2.5 0.04 2.7 (1.5) DIP, SO C, E MAX6003 3 3.2 to 12.6 100 1 45µA 75 SOT23 E MAX6030 3 3.2 to 12.6 20 to 30 0.2 to 0.4 35µA 75 SOT23 E MAX6193 3 3.2 to 12.6 5 to 25 0.07 to 0.33 35µA 75 SO E MAX6004 4.096 4.3 to 12.6 100 1 45µA 100 SOT23 E MAX6041 4.096 4.3 to 12.6 20 to 30 0.2 to 0.4 35µA 100 SOT23 E MAX6141 4.096 4.3 to 12.6 50 1 105µA (25) SOT23, SO E MAX6198 4.096 4.3 to 12.6 5 to 25 0.05 to 0.24 35µA 100 SO E MAX6241 4.096 8 to 36 2 to 5 0.025 to 0.1 2.9 (2.4) DIP, SO C, E MAX6341 4.096 8 to 36 1 to 2.5 0.025 2.9 (1.5) DIP, SO C, E MAX6045 4.5 4.7 to 12.6 20 to 30 0.2 to 0.4 35µA 110 SOT23 E MAX6145 4.5 4.7 to 12.6 50 1 105µA (30) SOT23, SO E MAX6194 4.5 4.7 to 12.6 5 to 25 0.04 to 0.22 35µA 110 SO E MAX675 5 8 to 33 12 to 20 0.15 1.4 15 TO-99, DIP, SO C, E MAX875 5 7 to 18 7 to 20 0.06 to 0.1 0.28 (32) DIP, SO C, E MAX6005 5 5.2 to 12.6 100 1 45µA 120 SOT23 E MAX6050 5 5.2 to 12.6 20 to 30 0.2 to 0.4 35µA 120 SOT23 E MAX6150 5 5.2 to 12.6 50 1 110µA (35) SOT23, SO E MAX6195 5 5.2 to 12.6 5 to 25 0.04 to 0.2 35µA 120 SO E MAX6250 5 8 to 36 2 to 5 0.02 to 0.1 3 (3) DIP, SO C, E MAX6350 5 8 to 36 1 to 2.5 0.02 3 (1.5) DIP, SO C, E REF02 5 8 to 33 8.5 to 250 0.3 to 2 1.4 15 TO-99, DIP, SO C *温度范围:C = 0°C至+70°C,E = -40°C至85°C 文献 The Art of Electronics, by Paul Horowitz & Winfield Hill, Chapter 6 Micro-Electronic Circuits, by Adel S. Sedra & Kenneth C. Smith
[编辑] 7 资源
- http://openenergymonitor.org/emon/buildingblocks/rtd-temperature-sensing
- http://forum.arduino.cc/index.php?topic=16731.0
- http://stackoverflow.com/questions/21644642/how-to-connect-pt-1000
- http://41j.com/blog/2015/01/esp8266-analogue-input/