現(xiàn)PT100高精度測(cè)溫方案詳解)
去年做一套工業(yè)循環(huán)水溫度采集客戶(hù)驗(yàn)收標(biāo)準(zhǔn)很直接0~120℃范圍內(nèi)顯示偏差不能超過(guò)±0.2℃。剛開(kāi)始我用PT100加一片24位ADC再配一個(gè)自制的恒流源板子畫(huà)完調(diào)了一周室溫下穩(wěn)定的時(shí)候看著還挺準(zhǔn)可溫度一上去誤差跟著飄。最后查清楚恒流源溫漂、導(dǎo)線電阻、PCB漏電流一起發(fā)力單靠提高ADC位數(shù)根本沒(méi)戲。后來(lái)?yè)Q成TI的ADS1220搭配STM32重做信號(hào)鏈兩天就把精度壓到了±0.1℃以?xún)?nèi)。這篇就把整個(gè)方案掰開(kāi)揉碎講一遍包括為什么PT100測(cè)溫容易翻車(chē)、ADS1220哪些資源正好打在痛點(diǎn)上、硬件怎么搭、寄存器怎么配、代碼怎么寫(xiě)、校準(zhǔn)怎么做以及我實(shí)測(cè)時(shí)踩過(guò)的幾個(gè)坑。適合正在用PT100做產(chǎn)品、或者畢業(yè)設(shè)計(jì)想選溫度采集方向的同學(xué)參考全套思路和代碼可以直接抄。1. 為什么PT100測(cè)溫總翻車(chē)傳統(tǒng)方案差在哪1.1 PT100測(cè)溫的本質(zhì)是電阻測(cè)量不是電壓測(cè)量PT100是鉑熱電阻0℃時(shí)阻值正好100Ω溫度每升高1℃阻值增加約0.385Ω。所以測(cè)溫的核心動(dòng)作其實(shí)是在線測(cè)一個(gè)電阻的當(dāng)前阻值再把它換算成溫度。這個(gè)換算關(guān)系看起來(lái)簡(jiǎn)單但真要達(dá)到0.1℃精度得能分辨0.0385Ω的電阻變化。在100Ω的基值上這個(gè)相對(duì)分辨率大約是385ppm換算成ADC位數(shù)至少要摸到12位以上并且信號(hào)鏈上任何一點(diǎn)誤差都會(huì)把這0.1℃直接吃掉。很多人在這一步就理解偏了以為換個(gè)更高位數(shù)的ADC就能解決問(wèn)題。實(shí)際上PT100測(cè)溫的誤差大頭從來(lái)不在ADC位數(shù)而在信號(hào)鏈的其他環(huán)節(jié)。1.2 恒流源、導(dǎo)線電阻、基準(zhǔn)漂移三道坎我最早用的方案是典型的“恒流源儀表放大器ADC”自己用運(yùn)放搭一個(gè)250μA恒流源激勵(lì)PT100產(chǎn)生毫伏級(jí)電壓再送進(jìn)ADC。這套方案有三道坎繞不過(guò)去第一恒流源的穩(wěn)定性。250μA電流只要有0.1%的波動(dòng)在100Ω電阻上就會(huì)產(chǎn)生25μV的電壓變化等效溫度誤差接近0.07℃。而自制的鏡像恒流源溫漂能做到0.1%以?xún)?nèi)已經(jīng)很不錯(cuò)了再加上運(yùn)放失調(diào)電壓隨溫度漂移整個(gè)激勵(lì)源本身就是最大的誤差源。第二導(dǎo)線電阻。PT100探頭到電路板之間只要拖上兩三米線每根導(dǎo)線的電阻就有0.2~0.5Ω。用兩線制接法時(shí)導(dǎo)線電阻直接串聯(lián)進(jìn)測(cè)量回路0.5Ω換算成溫度就是1.3℃還沒(méi)算探頭本身的誤差這已經(jīng)遠(yuǎn)超很多項(xiàng)目的驗(yàn)收指標(biāo)了。第三ADC基準(zhǔn)的溫漂。ADC測(cè)量的是電壓而電壓值要還原成電阻必須除一個(gè)精確的電流值。如果用外部基準(zhǔn)芯片給ADC提供參考電壓基準(zhǔn)自身的溫漂又會(huì)引入第二重誤差。說(shuō)白了整個(gè)測(cè)量精度取決于電流源、基準(zhǔn)源、放大器三者的綜合穩(wěn)定性想做好得花大力氣。這還只是常溫下的情況一旦環(huán)境溫度變化誤差會(huì)進(jìn)一步放大。所以后來(lái)我理解了一件事PT100高精度測(cè)溫本質(zhì)上不是選一個(gè)高分辨率ADC而是設(shè)計(jì)一個(gè)“自校準(zhǔn)”的信號(hào)鏈讓電流源和基準(zhǔn)的誤差在數(shù)學(xué)上互相抵消。ADS1220正是奔著這個(gè)需求來(lái)的。2. ADS1220憑什么能解決一顆芯片扛下所有2.1 芯片資源盤(pán)點(diǎn)PT100需要的功能它都內(nèi)置了ADS1220是TI出的24位ΔΣ ADC專(zhuān)門(mén)面向傳感器測(cè)量場(chǎng)景。這顆芯片最值錢(qián)的地方是它把PT100測(cè)溫需要的幾個(gè)核心模塊全部集成在了一起不需要再外搭恒流源、儀表放大器和基準(zhǔn)源。具體來(lái)說(shuō)它包含這些資源24位ΔΣ ADC內(nèi)部集成PGA可編程增益放大器增益1~128倍兩個(gè)可編程激勵(lì)電流源IDAC1、IDAC2電流從10μA到1.5mA可選內(nèi)部2.048V基準(zhǔn)電壓也支持外部基準(zhǔn)輸入20SPS到2000SPS的數(shù)據(jù)速率可配內(nèi)置50Hz/60Hz工頻干擾抑制的數(shù)字濾波器SPI接口通信簡(jiǎn)單內(nèi)置溫度傳感器可以用來(lái)做冷端補(bǔ)償或者自檢。其中激勵(lì)電流源是最關(guān)鍵的一項(xiàng)。它意味著我不用再自己搭恒流源也不用擔(dān)心運(yùn)放溫漂。ADS1220內(nèi)部的兩個(gè)IDAC精度和一致性比絕大多數(shù)分離方案要好得多而且能和ADC的采樣做到嚴(yán)格同步這是自己搭分立器件很難做到的。2.2 比例測(cè)量讓電流源的誤差徹底消失ADS1220做PT100測(cè)溫時(shí)最核心的設(shè)計(jì)思路是比例測(cè)量。簡(jiǎn)單說(shuō)就是讓同一個(gè)激勵(lì)電流I分別流過(guò)PT100和一個(gè)精密基準(zhǔn)電阻RREF然后測(cè)量?jī)蓚€(gè)電壓的比值。假設(shè)PT100當(dāng)前阻值是R_RTD那么在它兩端產(chǎn)生的電壓就是V_RTD I × R_RTD。同時(shí)同一個(gè)電流流過(guò)RREF在基準(zhǔn)電阻上產(chǎn)生V_REF I × RREF。ADC的轉(zhuǎn)換結(jié)果本質(zhì)上是這兩個(gè)電壓的比值raw (V_RTD × Gain) / V_REF × 2^23把V_RTD和V_REF的表達(dá)式代入電流I在分子和分母中直接約掉最終只剩下raw (R_RTD × Gain) / RREF × 2^23這意味著無(wú)論激勵(lì)電流是250μA還是500μA無(wú)論它隨溫度漂了0.1%還是0.5%只要PT100和RREF是用同一個(gè)電流驅(qū)動(dòng)的電流的絕對(duì)誤差就不會(huì)進(jìn)入最終結(jié)果。這個(gè)特性類(lèi)比一下就是用同一把尺子量?jī)蓚€(gè)物體尺子本身長(zhǎng)了短了都無(wú)所謂只要兩段長(zhǎng)度是同一個(gè)刻度體系下讀出來(lái)的比值就是準(zhǔn)的。這就是為什么ADS1220能做到高精度它不是把誤差消除而是把誤差設(shè)計(jì)成不參與運(yùn)算。2.3 兩線制、三線制、四線制怎么選比例測(cè)量解決了電流源誤差但導(dǎo)線電阻還得單獨(dú)處理。實(shí)際工程里PT100有三種接法。兩線制最簡(jiǎn)單PT100一端接AIN0另一端接AIN1電流和測(cè)量共用一根導(dǎo)線。代價(jià)是導(dǎo)線電阻直接進(jìn)入測(cè)量結(jié)果所以只適合探頭到板子距離很短、導(dǎo)線電阻能校準(zhǔn)掉的場(chǎng)景。三線制針對(duì)長(zhǎng)線場(chǎng)景用兩根等長(zhǎng)導(dǎo)線做補(bǔ)償。ADS1220有兩個(gè)等幅IDAC電流源分別流經(jīng)兩根對(duì)稱(chēng)的導(dǎo)線利用差分測(cè)量把導(dǎo)線的壓降抵消掉是工業(yè)現(xiàn)場(chǎng)最常用的折中方案。四線制是精度天花板兩根線走激勵(lì)電流兩根線專(zhuān)門(mén)做電壓測(cè)量測(cè)量線上幾乎沒(méi)有電流導(dǎo)線電阻對(duì)測(cè)量完全沒(méi)有影響。代價(jià)是線纜成本高接線麻煩。我在自己的項(xiàng)目里最終選了四線制因?yàn)樘筋^到主板的距離接近兩米而且精度指標(biāo)卡得緊。如果你只是近距離測(cè)個(gè)溫度兩線制加軟件校準(zhǔn)也完全夠用。3. 硬件搭建元件選型和PCB布局的關(guān)鍵細(xì)節(jié)3.1 基準(zhǔn)電阻RREF選型整個(gè)方案的精度天花板比例測(cè)量雖然讓電流源退居二線但基準(zhǔn)電阻RREF反而成了新的核心。因?yàn)樽罱K測(cè)量公式里R_RTD和RREF直接成正比RREF的精度和溫漂會(huì)原樣搬進(jìn)結(jié)果。這里我給出一組關(guān)鍵參數(shù)PT100在0℃時(shí)100Ω在100℃時(shí)約138.5Ω靈敏度約0.385Ω/℃。如果RREF用1kΩ、溫漂25ppm/℃的普通精密電阻環(huán)境溫度變化10℃時(shí)RREF變化約0.25Ω等效成PT100溫度誤差就有0.65℃左右。這顯然不行。我最終選擇的是2kΩ、0.1%精度、5ppm/℃溫漂的低溫漂電阻。5ppm/℃意味著溫度每變化10℃RREF只漂移0.01%等效溫度誤差約0.026℃基本可以忽略。如果你對(duì)精度還有更高要求可以上0.5ppm的金屬箔電阻不過(guò)性?xún)r(jià)比會(huì)下降很多。激勵(lì)電流我選了250μA原因有兩個(gè)。一是PT100在250μA下自熱功率只有約6μW自熱引起的溫升幾乎可以忽略二是250μA配合2kΩ基準(zhǔn)電阻VREF正好是0.5V剛好滿足ADS1220外部基準(zhǔn)電壓不低于0.5V的要求。3.2 輸入濾波與基準(zhǔn)去耦A(yù)DS1220是ΔΣ型ADC輸入端要加RC低通濾波器做抗混疊和濾噪。我在AIN0和AIN1上各串了一個(gè)100Ω電阻對(duì)地各接一個(gè)1nF的C0G電容組成差分低通。截止頻率大約1.6kHz既能濾掉高頻干擾又不會(huì)明顯衰減50Hz工頻附近的信號(hào)。濾波電容一定要選C0G或NP0介質(zhì)不能用X7R。X7R電容在直流偏置下容值會(huì)下降而且有壓電效應(yīng)用在這里容易引入額外噪聲?;鶞?zhǔn)輸入REFP0和REFN0之間我并了一個(gè)100nF和1μF的電容。這兩個(gè)電容一定要靠近芯片的基準(zhǔn)引腳放置走線盡量短粗。因?yàn)榛鶞?zhǔn)電壓是ADC轉(zhuǎn)換時(shí)的參考任何疊加在VREF上的噪聲都會(huì)直接進(jìn)入測(cè)量結(jié)果比信號(hào)線上的噪聲更致命。3.3 布局走線與電源處理PCB布局上有幾個(gè)經(jīng)驗(yàn)值得專(zhuān)門(mén)說(shuō)。第一ADS1220下方要鋪完整的地銅皮模擬地和數(shù)字地在芯片附近單點(diǎn)連接不要讓數(shù)字電流穿過(guò)模擬區(qū)域。第二激勵(lì)電流走線和信號(hào)采樣走線要分得遠(yuǎn)一點(diǎn)。雖然激勵(lì)電流只有250μA但它畢竟是開(kāi)關(guān)電流如果和差分信號(hào)線平行走很長(zhǎng)距離會(huì)通過(guò)寄生電容耦合噪聲。第三模擬電源AVDD用單獨(dú)的LDO供電不要直接用系統(tǒng)數(shù)字3.3V。實(shí)測(cè)下來(lái)用數(shù)字電源直接供電時(shí)讀數(shù)跳動(dòng)會(huì)比LDO供電大30%左右。而且LDO的輸出端要加一個(gè)1μF和100nF的組合去耦電容靠近電源引腳放置。第四DRDY、SCLK這些數(shù)字信號(hào)線要遠(yuǎn)離REFP0/REFN0和AIN0/AIN1。數(shù)字翻轉(zhuǎn)時(shí)的串?dāng)_會(huì)直接耦合進(jìn)模擬輸入。我見(jiàn)過(guò)很多人畫(huà)板子時(shí)把ADC部分當(dāng)成普通數(shù)字芯片處理結(jié)果調(diào)試時(shí)噪聲大得離譜怎么濾波都?jí)翰幌氯プ詈笾荒芨陌濉DS1220的封裝引腳間距不算密布局時(shí)多留點(diǎn)心思后面調(diào)試能省很多事。4. STM32驅(qū)動(dòng)代碼從寄存器配置到溫度換算4.1 SPI初始化與基礎(chǔ)讀寫(xiě)函數(shù)ADS1220走SPI接口我用STM32的HAL庫(kù)操作。這里有一點(diǎn)要特別注意ADS1220的SPI時(shí)序要求工作在模式1即CPOL0、CPHA1。如果照搬其他SPI器件的模式0大概率讀回來(lái)的數(shù)據(jù)是亂的。SPI初始化關(guān)鍵代碼void MX_SPI2_Init(void) { hspi2.Instance SPI2; hspi2.Init.Mode SPI_MODE_MASTER; hspi2.Init.Direction SPI_DIRECTION_2LINES; hspi2.Init.DataSize SPI_DATASIZE_8BIT; hspi2.Init.CLKPolarity SPI_POLARITY_LOW; hspi2.Init.CLKPhase SPI_PHASE_2EDGE; // CPOL0, CPHA1, SPI Mode 1 hspi2.Init.NSS SPI_NSS_SOFT; hspi2.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_64; hspi2.Init.FirstBit SPI_FIRSTBIT_MSB; HAL_SPI_Init(hspi2); }片選由普通GPIO控制每次通信前拉低通信結(jié)束后拉高。寫(xiě)寄存器函數(shù)static void ADS1220_WriteReg(uint8_t reg, uint8_t val) { uint8_t cmd 0x40 | (reg 2); // 寫(xiě)單寄存器命令 ADS_CS_LOW(); HAL_SPI_Transmit(hspi2, cmd, 1, 10); HAL_SPI_Transmit(hspi2, val, 1, 10); ADS_CS_HIGH(); }讀寄存器函數(shù)static void ADS1220_ReadReg(uint8_t reg, uint8_t *val) { uint8_t cmd 0x20 | (reg 2); // 讀單寄存器命令 uint8_t dummy 0; ADS_CS_LOW(); HAL_SPI_Transmit(hspi2, cmd, 1, 10); HAL_SPI_TransmitReceive(hspi2, dummy, val, 1, 10); ADS_CS_HIGH(); }還有一個(gè)發(fā)送單命令的函數(shù)用于復(fù)位、啟動(dòng)轉(zhuǎn)換static void ADS1220_SendCmd(uint8_t cmd) { ADS_CS_LOW(); HAL_SPI_Transmit(hspi2, cmd, 1, 10); ADS_CS_HIGH(); }4.2 配置寄存器數(shù)值推演ADS1220有5個(gè)配置寄存器地址從0x00到0x04。我直接給出針對(duì)PT100的完整配置參數(shù)并解釋每個(gè)值的來(lái)源。寄存器地址配置值含義寄存器00x000x06AIN0-AIN1差分輸入PGA增益8倍寄存器10x010x11數(shù)據(jù)速率90SPS正常模式單次轉(zhuǎn)換寄存器20x020x40IDAC電流250μA寄存器30x030x08IDAC1路由到AIN0IDAC2路由到AIN2寄存器40x040x40使用外部基準(zhǔn)REFP0/REFN0逐個(gè)解釋。寄存器0的0x06展開(kāi)是二進(jìn)制0b00000110其中MUX[2:0]000表示差分輸入AINPAIN0、AINNAIN1PGA[2:0]011表示增益8倍。為什么要選8倍增益因?yàn)?50μA激勵(lì)電流在PT100上0~100℃范圍內(nèi)產(chǎn)生約25.0mV到34.6mV的電壓而外部基準(zhǔn)VREF0.5V8倍增益對(duì)應(yīng)的滿量程輸入是500mV/862.5mV。34.6mV大約占滿量程的55%這個(gè)比例既能充分利用ADC的動(dòng)態(tài)范圍又留出了超溫余量。寄存器1的0x11展開(kāi)是0b00010001DR[2:0]010對(duì)應(yīng)90SPS數(shù)據(jù)速率MODE[1:0]00是正常模式最低位為1表示單次轉(zhuǎn)換模式。單次轉(zhuǎn)換的好處是每次啟動(dòng)后轉(zhuǎn)換一次就停電磁干擾環(huán)境下的讀數(shù)一致性更好也更省電。初始化函數(shù)void ADS1220_Init(void) { ADS1220_SendCmd(0x06); // Reset HAL_Delay(2); ADS1220_WriteReg(0x00, 0x06); // AIN0-AIN1差分PGA8 ADS1220_WriteReg(0x01, 0x11); // 90SPS單次轉(zhuǎn)換 ADS1220_WriteReg(0x02, 0x40); // IDAC250μA ADS1220_WriteReg(0x03, 0x08); // IDAC1-AIN0, IDAC2-AIN2 ADS1220_WriteReg(0x04, 0x40); // 外部基準(zhǔn) REFP0/REFN0 }4.3 數(shù)據(jù)讀取、數(shù)字濾波與溫度計(jì)算啟動(dòng)一次單次轉(zhuǎn)換然后等待DRDY引腳拉低此時(shí)轉(zhuǎn)換完成可以讀取24位數(shù)據(jù)static int32_t ADS1220_ReadData(void) { uint8_t buf[3]; while (HAL_GPIO_ReadPin(DRDY_GPIO_Port, DRDY_Pin) GPIO_PIN_SET); ADS_CS_LOW(); HAL_SPI_Receive(hspi2, buf, 3, 10); ADS_CS_HIGH(); int32_t raw ((int32_t)buf[0] 16) | ((int32_t)buf[1] 8) | buf[2]; if (raw 0x800000) { raw | 0xFF000000; // 24位補(bǔ)碼擴(kuò)展為32位有符號(hào)數(shù) } return raw; }DRDY引腳是轉(zhuǎn)換完成標(biāo)志下降沿有效。讀取數(shù)據(jù)這個(gè)動(dòng)作本身也會(huì)使DRDY恢復(fù)高電平所以不存在“讀完還要清標(biāo)志”的問(wèn)題。讀到的原始碼值要換算成電阻值。比例測(cè)量的換算公式是R_RTD raw × RREF / (2^23 × Gain)其中2^238388607對(duì)應(yīng)24位ADC的滿量程碼值RREF2000ΩGain8。換算代碼如下#define RREF_OHM 2000.0 #define PGA_GAIN 8.0 double ADS1220_GetResistance(int32_t raw) { return (double)raw * RREF_OHM / 8388607.0 / PGA_GAIN; }這里我特意把RREF和Gain做成宏方便以后換元件或改配置。數(shù)字濾波我用的是“去極值滑動(dòng)平均”連續(xù)采5個(gè)點(diǎn)去掉最大值和最小值剩下3個(gè)取平均。這個(gè)方法對(duì)脈沖干擾抑制效果好而且不會(huì)像純滑動(dòng)平均那樣把真實(shí)溫度變化拉得很鈍。double ADS1220_GetFilteredResistance(void) { int32_t samples[5]; for (int i 0; i 5; i) { samples[i] ADS1220_StartAndRead(); HAL_Delay(15); // 90SPS單次轉(zhuǎn)換周期約11.1ms留余量 } // 簡(jiǎn)單選擇排序去掉最大最小 for (int i 0; i 4; i) { for (int j i 1; j 5; j) { if (samples[j] samples[i]) { int32_t tmp samples[i]; samples[i] samples[j]; samples[j] tmp; } } } int64_t sum samples[1] samples[2] samples[3]; return (double)sum * RREF_OHM / 8388607.0 / PGA_GAIN / 3.0; }溫度換算我用查表加線性插值。先按每1℃間隔生成一張PT100電阻-溫度對(duì)應(yīng)表范圍取-50℃到250℃。查表時(shí)先二分找到區(qū)間再線性插值。這個(gè)方法比用Callendar-Van Dusen公式算快也不需要引入浮點(diǎn)庫(kù)之外的特殊函數(shù)。完整表格太長(zhǎng)這里給出插值核心邏輯#define TEMP_TABLE_START -50.0 #define TEMP_TABLE_STEP 1.0 #define TEMP_TABLE_SIZE 301 double RTD_Table[TEMP_TABLE_SIZE]; // 工程中由上位機(jī)腳本生成 double ResistanceToTemp(double r) { if (r RTD_Table[0]) return TEMP_TABLE_START; if (r RTD_Table[TEMP_TABLE_SIZE - 1]) return TEMP_TABLE_START (TEMP_TABLE_SIZE - 1) * TEMP_TABLE_STEP; int lo 0, hi TEMP_TABLE_SIZE - 1; while (hi - lo 1) { int mid (lo hi) / 2; if (RTD_Table[mid] r) hi mid; else lo mid; } double t0 TEMP_TABLE_START lo * TEMP_TABLE_STEP; double r0 RTD_Table[lo], r1 RTD_Table[hi]; return t0 (r - r0) / (r1 - r0) * TEMP_TABLE_STEP; }RTD_Table數(shù)組可以在PC上生成好直接以const數(shù)組燒進(jìn)單片機(jī)避免運(yùn)行時(shí)計(jì)算查表的浮點(diǎn)開(kāi)銷(xiāo)。5. 校準(zhǔn)怎么做從出廠值到±0.1℃5.1 為什么比例測(cè)量之后還要校準(zhǔn)比例測(cè)量解決了電流源和基準(zhǔn)源的誤差但芯片本身的PGA失調(diào)電壓、增益誤差、以及PCB上的寄生參數(shù)仍然存在。這些誤差的典型值是PGA失調(diào)電壓在微伏到幾十微伏量級(jí)增益誤差在0.02%左右換算成溫度大約是0.05~0.2℃。如果需要±0.1℃的指標(biāo)就必須做系統(tǒng)級(jí)校準(zhǔn)。5.2 用精密電阻代替溫度源校準(zhǔn)溫度源非常麻煩冰水浴和沸水浴都受氣壓影響而且建立一個(gè)穩(wěn)定的恒溫槽成本很高。更實(shí)用的做法是用精密電阻代替PT100做校準(zhǔn)因?yàn)锳DS1220測(cè)的本來(lái)就是電阻只要把已知阻值的電阻接上去就能反推出整個(gè)信號(hào)鏈的誤差。我準(zhǔn)備了三只標(biāo)準(zhǔn)電阻0Ω、100.000Ω、138.505Ω。0Ω用來(lái)校準(zhǔn)偏置100Ω和138.505Ω分別對(duì)應(yīng)0℃和100℃的PT100標(biāo)準(zhǔn)阻值用來(lái)校準(zhǔn)增益。校準(zhǔn)步驟如下第一步把模擬輸入端AIN0和AIN1用短線短接采樣得到raw_offset。這個(gè)值就是整個(gè)信號(hào)鏈的固有偏置碼值。第二步接上100.000Ω標(biāo)準(zhǔn)電阻采樣得到raw_100。第三步接上138.505Ω標(biāo)準(zhǔn)電阻采樣得到raw_138。然后計(jì)算實(shí)際增益系數(shù)K (138.505 - 100.000) / (raw_138 - raw_100)這個(gè)K就是“每個(gè)ADC碼值對(duì)應(yīng)的真實(shí)電阻變化量”它把PGA的增益誤差全部吸收進(jìn)去了。最終電阻計(jì)算公式變成R_RTD (raw - raw_offset) × K 100.000注意這里的K本質(zhì)上是電阻增量與碼值增量的比值已經(jīng)包含了對(duì)PGA增益誤差的修正所以不再顯式除以Gain。5.3 校準(zhǔn)參數(shù)固化與自檢這三組校準(zhǔn)數(shù)據(jù)算出來(lái)后我通常存在EEPROM或Flash的固定地址上電初始化時(shí)讀出來(lái)加載進(jìn)全局變量。每塊板子都單獨(dú)校準(zhǔn)一遍不能批量拷貝因?yàn)槊科珹DS1220的失調(diào)和增益誤差都不完全一樣。校準(zhǔn)完成后我還習(xí)慣做一次自檢用一只已知阻值、但不參與校準(zhǔn)的電阻比如120Ω測(cè)一遍。120Ω對(duì)應(yīng)PT100大約51.3℃如果實(shí)測(cè)換算結(jié)果在119.98~120.02Ω范圍內(nèi)說(shuō)明校準(zhǔn)成功。一個(gè)小提示校準(zhǔn)完成之后接探頭的線纜長(zhǎng)度和線型不要再換。校準(zhǔn)只對(duì)當(dāng)前信號(hào)通路有效換了線纜等于改變了導(dǎo)線電阻和寄生參數(shù)精度會(huì)明顯退化。6. 實(shí)測(cè)結(jié)果與踩坑記錄6.1 穩(wěn)定性實(shí)測(cè)數(shù)據(jù)系統(tǒng)調(diào)試完成后我用一個(gè)恒溫槽把探頭分別穩(wěn)定在0℃、25℃、50℃、100℃四個(gè)點(diǎn)每個(gè)點(diǎn)連續(xù)采集10分鐘記錄換算后的溫度。數(shù)據(jù)如下恒溫槽參考溫度實(shí)測(cè)平均溫度最大波動(dòng)幅度偏差0.00℃-0.02℃±0.02℃-0.02℃25.00℃25.01℃±0.03℃0.01℃50.00℃50.00℃±0.03℃0.00℃100.00℃100.03℃±0.03℃0.03℃這個(gè)結(jié)果是在90SPS數(shù)據(jù)速率、去極值滑動(dòng)平均濾波之后得到的。如果把數(shù)據(jù)速率降到20SPS波動(dòng)還能進(jìn)一步壓低但響應(yīng)速度會(huì)變慢。對(duì)于大多數(shù)工業(yè)測(cè)溫場(chǎng)景90SPS加濾波已經(jīng)是比較平衡的選擇。6.2 三個(gè)高頻問(wèn)題及排查手段調(diào)試過(guò)程中我遇到過(guò)三個(gè)典型問(wèn)題每個(gè)都花了些時(shí)間定位寫(xiě)出來(lái)供參考。第一個(gè)問(wèn)題是DRDY引腳一直不拉低。排查方向按順序查先量SPI的CLK和CS波形確認(rèn)通信時(shí)序正確再確認(rèn)初始化流程里確實(shí)發(fā)送過(guò)START命令最后檢查SPI模式是不是Mode 1。我遇到的情況就是SPI模式配成了Mode 0DRDY始終無(wú)響應(yīng)改回來(lái)立刻恢復(fù)正常。第二個(gè)問(wèn)題是讀數(shù)周期性跳動(dòng)波動(dòng)幅度達(dá)到十幾個(gè)碼值。這是電源和布局問(wèn)題。用示波器看AVDD引腳發(fā)現(xiàn)有幅值約30mV的紋波頻率和板上的DC-DC開(kāi)關(guān)頻率一致。后來(lái)把ADS1220的AVDD供電從數(shù)字電源改成獨(dú)立LDO紋波降到2mV以?xún)?nèi)讀數(shù)波動(dòng)立刻縮小到3個(gè)碼值以?xún)?nèi)。如果你的布局空間實(shí)在緊張至少在AVDD引腳前加一個(gè)磁珠加電容的π型濾波。第三個(gè)問(wèn)題是溫度整體偏高。校準(zhǔn)之后仍然偏高0.4℃左右很穩(wěn)定。排查到最后發(fā)現(xiàn)是四線制接線時(shí)激勵(lì)線的接觸電阻不完全對(duì)稱(chēng)而且校準(zhǔn)用的標(biāo)準(zhǔn)電阻接線端子有接觸電阻。解決方法是把校準(zhǔn)用的端子改成開(kāi)爾文夾同時(shí)校準(zhǔn)完成后固定鎖緊接頭不要反復(fù)插拔。6.3 一個(gè)容易被忽略的經(jīng)驗(yàn)VREF最小電壓限制最后分享一個(gè)我早期忽略的細(xì)節(jié)。ADS1220的外部基準(zhǔn)電壓VREF是有最低限制的典型值0.5V不能像某些ADC那樣用很小的基準(zhǔn)電壓。我最初設(shè)計(jì)時(shí)RREF取了1kΩ、激勵(lì)電流250μAVREF只有0.25V結(jié)果芯片測(cè)量結(jié)果非線性得很明顯一度以為是SPI通信問(wèn)題。后來(lái)查數(shù)據(jù)手冊(cè)才發(fā)現(xiàn)是基準(zhǔn)電壓低于規(guī)格下限。這也是我為什么最終選擇了2kΩ基準(zhǔn)電阻和250μA激勵(lì)電流的組合VREF正好0.5V卡在最低要求線上留有余量又不至于讓電流太大產(chǎn)生自熱。如果你復(fù)刻這個(gè)方案時(shí)改了參考電阻或者激勵(lì)電流務(wù)必先算一下VREF是否滿足0.5V的最低要求。否則后面遇到無(wú)法解釋的讀數(shù)異常很大概率又是這個(gè)坑。