Ⅰ、 Üç telli PT100 sıcaklık ölçüm prensibi
Üç telli bağlantı yönteminin temel amacı, uç direncinin ölçüm doğruluğu üzerindeki etkisini ortadan kaldırmaktır. PT100'ün direnç değeri çok küçüktür (100Ω @ 0℃) ve bağlantı kablolarının direnci (R6, R7, R15 olarak yazılan bir ohm'un birkaç onda biri ila birkaç ohm, üç telli RTD test şemasına bakın) ihmal edilemeyecek hatalara neden olabilir. Üç telli sistem bu sorunu akıllı devre tasarımıyla çözer; burada üç telli RTD'nin üç ucu da tipik olarak aynı uzunluktadır, bu nedenle üç ucun direncinin eşit olduğu varsayılır (RL1 = RL2 = RL3, yani şemada R6=R7=R15), SSP1220'nin dahili çift akım kaynağı (IDAC) bu uç dirençlerinin etkilerini gidermek için kullanılır.
Ölçüm prensibinin detaylı açıklaması:
- SSP1220 içinde iki eşleşen programlanabilir akım kaynağı (IDAC1 ve IDAC2) kullanarak ve aynı akım çıkışını vererek: , akım kaynağı seçiminin 1mA'den az olması önerilir ve bu test için akım kaynağı seçim değeri 500uA'dir.
- PT100'ün üç uç direncinin eşit olduğu varsayılır: R6 = R7 = R15 = Rl
- SSP1220, PT100 üzerindeki gerilimi bir diferansiyel giriş çifti (AIN0, AIN1) aracılığıyla ölçer: VİÇİNDE = VAIN1 - VAIN0
Oysa: VAIN1 = IIDAC1 x (RL1+RPT100) + (IIDAC1 + IIDAC2) x RL3, VAIN0 = IIDAC2 x RL2 + (IIDAC1 + IIDAC2) x RL3
Beri: BenIDAC1 = IIDAC2 = IIDAC VE RL1 = RL2 = RL3 = RL
yerine koyarak: VIN = [IIDAC x (RL + RPT100) + 2IIDAC x RL] - [IIDAC x RL + 2IIDAC x RL] = IIDAC x RL + IIDAC x RPT100 + 2IIDAC x RL - 2IIDAC x RL = IIDAC x RPT100
Akıllı devre yapılandırması sayesinde, uç direncinin etkisi diferansiyel giriş gerilimi VIN'den tamamen ortadan kaldırılır ve yalnızca PT100 direnci üzerindeki gerilim düşüşü dahil edilir.
- SSP1220 referans voltajı Vref, iki IDAC akımının yüksek hassasiyetli bir harici referans direnci olan Rref (R5) aracılığıyla birleştirilmesiyle üretilir, yani Vref = (Iidac1 + Iidac2) * R
- Oran ölçümlerinde, nihai ADC çıkış kodu IDAC akımının mutlak değerine, doğruluğuna ve sapmasına bakılmaksızın (Rpt100) / (Rref) ile orantılıdır ve aynı zamanda Rl1 ve Rl2 uç dirençlerinin etkisine karşı koyar:
24 bit SSP1220 için çıkış sayısal kodu şöyledir:
Kod = (223 - 1) x (VİÇİNDE/VREF) = (223 - 1) x [RPT100/(2 x RREF) ]
PT100 direnç değerini ADC kodu ile ters çevirin:
RPT100 = [Kod/(223-1)] x 2 x RREF
Son olarak, PT100'ün direnç-sıcaklık özelliklerine göre (genellikle Callendar-Van Dusen denklemi veya tablo arama yöntemi kullanılarak), Rpt100 bir sıcaklık değerine dönüştürülür: T = f (Rpt100). PT100 için, at0℃, R0 = 100.00Ω, direnç sıcaklık katsayısı yaklaşık α≈ 0.00385 Ω/Ω/℃
Ⅱ、 Donanım devre tasarımı
Veri sayfasındaki tipik uygulamaya göre, tipik bir üç telli PT100 bağlantı devresi aşağıdaki gibidir:

- Devre bağlantı talimatları
- PT100 bağlantısı: PT100 (üç telli sistem) şematikte gösterildiği gibi bağlanır.
- Gerilim referansı üretimi: IDAC1 çıkışı AIN2'ye (dahili yazılım yapılandırması gereklidir), IDAC2 çıkışı AIN3'e (dahili yazılım yapılandırması gereklidir) bağlanır ve iki IDAC akımı düğümde birleşir ve harici referans direnci Rref (R5) üzerinden birlikte akar. REF'in diğer ucu analog toprak AVSS'ye bağlanır. SSP1220'nin pozitif referans girişi REFP0, RREF'in (R5) üst ucuna (IDAC birleşme noktası) bağlanır. SSP1220'nin negatif referans girişi REFN0, AVSS'ye bağlanır. Bu nedenle, referans voltajı, VREF= (IIDAC1 + IIDAC2) * RREF.
- Sinyal ölçümü: SSP1220 için AIN1, diferansiyel pozitif giriş AINP olarak yapılandırılmıştır ve SSP1220'nin AIN0'ı diferansiyel negatif giriş AINN olarak yapılandırılmıştır, böylece ölçülen voltaj AIN1 ve AIN0 arasındaki potansiyel farktır.
- Filtreleme devresi: RC alçak geçiren filtrelerin hem analog girişlere (AIN0, AIN1, AIN2) hem de referans girişlerine (REFP0) kenar yumuşatma ve gürültü bastırma için eklenmesi gerekir. Giriş filtreleri: R1, R2, C1 ve C6, C5'ten oluşur. Referans filtresi: R3, R4, C2 ve C3, C4'ten oluşur. Ölçek ölçümlerinin doğruluğunu korumak için referans filtresinin kesme frekansı giriş filtresiyle eşleşmelidir.
Ⅲ、Cihaz seçimi ve parametre hesaplama
Varsayımsal tasarım hedefleri aşağıdaki gibidir: PT100 tipi: üç telli; Sıcaklık ölçüm aralığı: -200°C ~ +850°C; Besleme gerilimi AVDD: 3.3V (AVSS = 0V); DAC Akımı: 500μA (kanal başına); Veri hızı: 20 SPS (optimum gürültü performansı için).
- Referans direnç (Rref) seçimi ve hesaplanması
Rref, tüm sistemin doğruluğunun merkezinde yer alır. İşlevi: ADC'nin referans voltajı V ref'yi üretir ve doğruluğu ve kararlılığı ölçüm sonuçlarını doğrudan belirler.
Direnç Hesaplama:
ADC'nin aralığını en üst düzeye çıkarmak ve PGA'nın ortak mod voltajı gereksinimlerini karşılamak için Vref tipik olarak besleme voltajının yaklaşık yarısına ayarlanır. Bu tasarımda AVDD = 3,3V ve hedef VREF yaklaşık 1,65V'tur.
IIDAC = I_IDAC1 + I_IDAC2 = 500uA + 500uA = 1mA
RREF = VREF /(IIDAC1 + IIDAC2) = 1,65V/1mA = 1,65kΩ
Nominal değeri 1,65 kΩ olan bir direnç seçilebilir. Bulunamazsa, 1,62kΩ veya 1,69kΩ da kabul edilebilir bir yaklaşımdır.
Seçim şartları:
Doğruluk: En az ±0,1%, yüksek hassasiyetli uygulamalar için ±0,05% veya üzeri önerilir.
Sıcaklık Dalgalanması: Çok düşük olmalıdır, ±5 ppm/°C veya ±10 ppm/°C'lik hassas film direnci önerilir.
Uzun vadeli istikrar: yüksek.
Asla normal bir 1%, 100ppm/°C çip direnci kullanmayın.
- IDAC akım ve PGA kazanç seçenekleri
IDAC Akımı: 500μA seçilmiştir. Bu değer güç tüketimi, kendi kendine ısınma etkisi ve sinyal genliği arasında iyi bir denge kurar. Akım çok küçükse, sinyal zayıftır ve gürültüden kolayca etkilenir; Çok fazla akım PT100'ün kendi kendine ısınmasına veya IDAC uyumlu voltajları aşmasına neden olabilir.
PGA Kazanç Seçimi: PT100 daha küçük bir gerilime sahiptir (örn. 500μA × 100Ω = 50mV), ancak bir oran ölçümü kullanır (referans gerilimi de IDAC'dendir), bu nedenle doygunluğu önlemek için yükseltmeye gerek yoktur ve kazanç seçimi 1X'tir.
- Filtre devresi bileşen seçimi
Filtre Dirençleri (R1, R2, R3, R4): Genellikle 1kΩ seçilir. Bu değer etkili bir şekilde filtreleme yapmak için yeterince büyük ve girişte önemli ofset gerilimlerinden kaçınmak için yeterince küçüktür (giriş öngerilim akımı nedeniyle). Ayrıca akım sınırlayıcı koruma görevi de görürler.
Diferansiyel filtre kapasitörleri (C1, C2): Kesme frekansını dirençle birlikte ayarlayın. Örneğin, 20SPS veri hızı için kesme frekansı onlarca Hz olarak ayarlanabilir. fc = 1 / (2π * (R1+R2) * C1)。 R1+R2=2kΩ ve fc ≈ 16Hz beklenirse, C1 ≈ 1 / (2* 2000 * 16) ≈ 4,7μF. Gerçek dünya uygulamalarında, daha geniş bir gürültü reddetme bant genişliği elde etmek için genellikle 100nF (0,1μF) kullanılır. Tip: C0G (NPO) seramik kapasitörler, kararlı dielektrik sabiti, düşük voltaj katsayısı ve düşük mikroakustik etkisi nedeniyle tavsiye edilir.
Ortak mod filtreli kapasitörler (C5, C6, C3, C4): Diferansiyel kapasitörlerin uyumsuzluklarının aşırı ortak mod gürültüsünün diferansiyel gürültüye dönüşmesine neden olmamasını sağlamak için tipik olarak 10nF gibi diferansiyel kapasitörlerden daha küçük bir büyüklük sırası seçilir.
Ⅳ、Yazılım yapılandırması
- Ana Mantık:
float SSP1x20_read_temperature(void)
{
uint32_t ADC_data;
uint32_t ADC_temp1;
//SSP1x20_read_register(SSP1x20_REG0, 4, &Read_REGTab[0]);
Write_REGTab[0] = SSP1x20_MUX_AIN0_AIN1 | SSP1x20_GAIN_1 | SSP1x20_PGA_BYPASS_ON;
Write_REGTab[1]=SSP1x20_DR_20SPS|SSP1x20_MODE_NORMAL|SSP1x20_SC|SSP1x20_TS_ON| SSP1x20_BCS_OFF;
Write_REGTab[2]=SSP1x20_VREF_2048|SSP1x20_REJECT_OFF|SSP1x20_PSW_OFF | SSP1x20_IDAC_1000uA;
Write_REGTab[3] = SSP1x20_IDAC1_AIN2 | SSP1x20_IDAC2_AIN3 | SSP1x20_DRDYM_DRDY;
SSP1x20_WriteRegister(SSP1x20_REG0, 4, &Write_REGTab[0]);
SSP1x20_SendCommand(SSP1x20_CMD_START);
SPI_ADC_CS_LOW();
while (ADC_DRDY_GAIN == 1);//SSP1x20_DRDYM_DRDY
- Programın ana yapılandırması ve açıklaması
- Kayıt 0'ı yapılandırın: MUX ve kazanç
Write_REGTab[0] = SSP1x20_MUX_AIN0_AIN1 | SSP1x20_GAIN_1 | SSP1x20_PGA_BYPASS_ON;
| Bit | Konfigürasyon | Fonksiyon | Açıklama |
| BIT7~BIT4 | MUX_AIN0_AIN1 | Diferansiyel giriş kanalı seçimi | AIN0 - AIN1 → PT100 gerilim ölçümü için |
| BIT3~BIT1 | GAIN_1(1x kazanç ) | Kazanç ayarları | 1× (Vin ≈ 1V olduğundan yükseltmeye gerek yoktur) |
| BIT0 | PGA_BYPASS_ON | PGA baypas | Sinyal bozulmasını önlemek için programlanabilir kazanç amplifikatörünü kapatın |
- Konfigürasyon kaydı 1: Örnekleme hızı ve modu
Write_REGTab[1] = SSP1x20_DR_20SPS | SSP1x20_MODE_NORMAL | SSP1x20_SC | SSP1x20_TS_OFF | SSP1x20_BCS_OFF;
| Bit | Konfigürasyon | Fonksiyon | Açıklama |
| BIT7~BIT5 | DR_20SPS | Veri hızı | 20 kez/sn → yavaş sıcaklık değişimleri için uygundur |
| BIT4~BIT3 | MODE_NORMAL | Normal çalışma modu | Tek veya ardışık değil |
| BITO | SC | Kendi kendine kalibrasyon etkin | Geliştirilmiş doğruluk (tavsiye edilir) |
| BIT1 | TS_OFF | Dahili sıcaklık sensörünü devre dışı bırakma | TS_ON dahili sıcaklık sensörünü açar, harici sıcaklığı ölçmek için yapılandırma çalışmaz (bu yapılandırma en yüksek önceliğe sahiptir) |
- Kayıt 2'yi yapılandırın: IDAC ile referans voltajı
Write_REGTab[2] = SSP1x20_VREF_2048 | SSP1x20_REJECT_OFF | SSP1x20_PSW_OFF | SSP1x20_IDAC_500uA;
| Bit | Konfigürasyon | Fonksiyon | Açıklama |
| BIT7~BIT6 | VREF_2048 | Harici referans gerilimi | Referans voltajı oluşturmak için harici bir R_REFR_REF kullanın (örneğin, 1,65kΩ). |
| BIT5~BIT4 | REJECT_OFF | Çentik filtreleme yok | Güç frekansı paraziti bağışıklığı gerekmez |
| BIT3 | PSW_OFF | Güç anahtarını etkinleştirmeyin | Normal güç kaynağını koruyun |
| BIT2~BIT0 | IDAC_500uA | Uyarma akımı | 3,9kΩ × 1mA = 3,9V > 3,3V aşırı gerilimi önlemek için 500 μA olarak ayarlayın |
| Bit | Konfigürasyon | Fonksiyon | Açıklama |
| BIT7~BIT5 | IDAC1_AIN2 | IDAC1 çıkışından AIN2'ye | Uyarma akımı PT100'ün üst ucundan akar |
| BIT4~BIT2 | IDAC2_AIN3 | IDAC2 çıkışından AIN3'e | Kurşun direncini iptal etmek için yola geri dönün |
| BIT1 | DRDYM_DRDY | DRDY modu | Dönüşümün tamamlandığını bildirmek için DRDY sinyalini kullanın |
(4) Kayıt 3'ü yapılandırın: DRDY ile IDAC rota kanalı
- Üç telli PT100 çekirdek:
Şu anki yol:
- IDAC1 → AIN2 → PT100 → AIN1
- IDAC2 → AIN3 → AIN1(Dönüş)
- İki akım eşittir → R_LEAD2R_LEAD2 üzerindeki gerilim düşüşünü dengeleyin
uint32_t raw_u24 = SSP1x20_read_data_drdy();
SSP1220 çıkışları 24 bit veriancak MCU'lar tipik olarak 32 bit olarak okur (SPI bir seferde 4 bayt okur).
Eğer (raw < 0) raw = -raw;
PT100 voltajı her zaman pozitiftir (akım AIN0'dan AIN1'e akar).
raw < 0 ise AIN0 ve AIN1 yazılım konfigürasyonları tersine çevrilmiştir.
printf("Raw: %ld, R=%.3f Ω, Temp=%.2f °C\r\n", raw, R_pt100, temperature);
Yazdır orijinal kod değerini, direnci ve nihai sıcaklığı hesaplayın kolay hata ayıklama için
Raw negatifse→ konfigürasyon tersine çevrilir
R > 1400Ω ise → IDAC veya Rref'in yanlış ayarlandığını gösterir
Sıcaklık = -999 → ise R-değerinin makul aralığın dışında olduğunu gösterir
Ⅴ、Ölçüm prosedürü ve sonuçları
- Her iki uçta PT100 gerilim ölçüm programı:
void SSP1x20_ADC_MeasurePt100(void)
{
float V_ref = 2.048; // Dahili referans gerilimi 2.048V
//printf("\r\n Çok noktalı tek voltaj ölçümü \r\n");
Write_REGTab[0] = SSP1x20_MUX_AIN1_AIN0 | SSP1x20_GAIN_1 | SSP1x20_PGA_BYPASS_OFF;
Write_REGTab[1] = SSP1x20_DR_20SPS | SSP1x20_MODE_NORMAL | SSP1x20_SC | SSP1x20_TS_OFF | SSP1x20_BCS_OFF;
Write_REGTab[2] = SSP1x20_VREF_REF0 | SSP1x20_REJECT_OFF | SSP1x20_PSW_OFF | SSP1x20_IDAC_500uA;
Write_REGTab[3] = SSP1x20_IDAC1_AIN2 | SSP1x20_IDAC2_AIN3 | SSP1x20_DRDYM_DRDY;
SSP1x20_WriteRegister(SSP1x20_REG0, 4, &Write_REGTab[0]);
printf("Write_REGTab[0]=%x\r\n", Write_REGTab[0]);
printf("Write_REGTab[1]=%x\r\n", Write_REGTab[1]);
printf("Write_REGTab[2]=%x\r\n", Write_REGTab[2]);
printf("Write_REGTab[3]=%x\r\n", Write_REGTab[3]);
while (1)
{
SSP1x20_SendCommand(SSP1x20_CMD_START); // Sürekli ölçüm etkinleştirildiğinde, bu komut yalnızca bir kez gönderilir
HAL_Delay(100);
SPI_ADC_CS_LOW();
}
SSP1220 test sonuçları

- SSP1220 dahili sıcaklık ölçümü
Dahili sıcaklık test fonksiyonu
float SSP1x20_read_temperature(void)
{
uint32_t ADC_data;
uint32_t ADC_temp1;
//SSP1x20_read_register(SSP1x20_REG0, 4, &Read_REGTab[0]);
Write_REGTab[0] = SSP1x20_MUX_AIN0_AIN1 | SSP1x20_GAIN_1 | SSP1x20_PGA_BYPASS_ON;
Write_REGTab[1] = SSP1x20_DR_20SPS | SSP1x20_MODE_NORMAL | SSP1x20_SC | SSP1x20_TS_ON | SSP1x20_BCS_OFF;
Write_REGTab[2] = SSP1x20_VREF_2048 | SSP1x20_REJECT_OFF | SSP1x20_PSW_OFF | SSP1x20_IDAC_1000uA;
Write_REGTab[3] = SSP1x20_IDAC1_AIN2 | SSP1x20_IDAC2_AIN3 | SSP1x20_DRDYM_DRDY;
SSP1x20_WriteRegister(SSP1x20_REG0, 4, &Write_REGTab[0]);
SSP1x20_SendCommand(SSP1x20_CMD_START);
SPI_ADC_CS_LOW();
while (ADC_DRDY_GAIN == 1);//SSP1x20_DRDYM_DRDY
İç sıcaklık testi yapılandırma ayrıntıları:
Write_REGTab[1] = SSP1x20_DR_20SPS | SSP1x20_MODE_NORMAL | SSP1x20_SC | SSP1x20_TS_ON | SSP1x20_BCS_OFF;
- SSP1x20_TS_ON: Dahili sıcaklık sensörünü etkinleştirin (kritik), bu yapılandırma en yüksek önceliğe sahiptir
- SSP1x20_SC: Kendi kendine kalibrasyon gerçekleştirin (önerilir)
- 20SPS: Düşük hız ve yüksek doğruluk, sıcaklık ölçümü için uygun
Write_REGTab[2] = SSP1x20_VREF_2048 | SSP1x20_REJECT_OFF | SSP1x20_PSW_OFF | SSP1x20_IDAC_1000uA;
- SSP1x20_VREF_2048: Kullanım dahili bir 2.048V referans voltajı (harici REF0 değil!) )
- Çünkü dahili sıcaklık sensörü mutlak bir voltaj çıkışı, a sabit referans gerilimi sıcaklığı dönüştürmek için kullanılmalıdır.
- IDAC_1000uA: IDAC etkin olmasına rağmen, TS_ON modundaki IDAC dahili sıcaklık ölçümlerini etkilemez (ihmal edilebilir).
Write_REGTab[3] = SSP1x20_IDAC1_AIN2 | SSP1x20_IDAC2_AIN3 | SSP1x20_DRDYM_DRDY;
- IDAC pimini ve DRDY'yi yapılandırın, ancak iç sıcaklık ölçümü üzerinde hiçbir etkisi yoktur (sadece kayıtları sağlam tutun).
- 2 Dönüştürmeyi başlatın ve DRDY için bekleyin
SSP1x20_SendCommand(SSP1x20_CMD_START); SPI_ADC_CS_LOW();ise (ADC_DRDY_GAIN == 1); // 等待 DRDY 变低
- Sürekli geçişi başlatmak için BAŞLAT komutunu gönderin
- Bekle DRDY piminin düşük seviyeye inmesi, verilerin hazır olduğunu gösterir
İç mekan oda sıcaklığının ölçümü aşağıdaki şekilde gösterilmiştir:

3. Harici sıcaklık ölçümü (yöntem 1, basitleştirilmiş faktör 0,385 hesaplaması)
Harici sıcaklık testi ile ilgili kod:
uint32_t ADC_gain_value = 0; // Okuma verileri
uint32_t ADC_value = 0; // Veri değerini ölçün
float tmpPt100=0;
float RTD=0;
void SSP1x20_ADC_Measure(void)
{
printf("\r\n Çok noktalı tek voltaj ölçümü \r\n");
Write_REGTab[0] = SSP1x20_MUX_AIN1_AIN0 | SSP1x20_GAIN_1 | SSP1x20_PGA_BYPASS_OFF; SSP1x20_MUX_AIN1_AIN0 Arayüz AIN1 AIN0 gerçek devre şemasına göre seçilmelidir
Write_REGTab[1] = SSP1x20_DR_20SPS | SSP1x20_MODE_NORMAL | SSP1x20_SC | SSP1x20_TS_OFF | SSP1x20_BCS_OFF;
Write_REGTab[2] = SSP1x20_VREF_REF0 | SSP1x20_REJECT_OFF | SSP1x20_PSW_OFF | SSP1x20_IDAC_500uA;
Write_REGTab[3] = SSP1x20_IDAC1_AIN2 | SSP1x20_IDAC2_AIN3 | SSP1x20_DRDYM_DRDY;
SSP1x20_WriteRegister(SSP1x20_REG0, 4, &Write_REGTab[0]);
printf("Write_REGTab[0]=%x\r\n", Write_REGTab[0]);
printf("Write_REGTab[1]=%x\r\n", Write_REGTab[1]);
printf("Write_REGTab[2]=%x\r\n", Write_REGTab[2]);
printf("Write_REGTab[3]=%x\r\n", Write_REGTab[3]);
while (1)
{
SSP1x20_SendCommand(SSP1x20_CMD_START); Sürekli ölçüm etkinleştirildiğinde, bu komut yalnızca bir kez gönderilir
HAL_Delay(100);
SPI_ADC_CS_LOW();
ADC_gain_value =0;
ADC_gain_value = SPI_ADC_ReadByte();
ADC_gain_value = (ADC_gain_value << 8) | SPI_ADC_ReadByte();
ADC_gain_value = (ADC_gain_value << 8) | SPI_ADC_ReadByte();
SPI_ADC_CS_HIGH();
RTD = 1650*( (float)ADC_gain_value /(0x3fffff));//Referans direnci 1650 ohm
tmpPt100 = (RTD-100)/0,38;
__NOP();
printf("R=%.3f Ω, Temp=%.2f °C\r\n",RTD, tmpPt100);
}
Buzlu su karışımının sıcaklığının üç hatlı RTD ölçümünün sonuçları aşağıdaki şekilde gösterilmektedir:

Dış sıcaklık ölçümleri (Callendar-Van Dusen denklemiyle hesaplanan ikinci yöntem) daha doğrudur
Ana Kod:
//Yüksek hassasiyetli RTD -> sıcaklık
static float rtd_to_temperature_iec60751(float rtd)
{
if (rtd < 0.0f) return -999.0f; // yasadışı değer
float t = (rtd - R0_PT100) / 0.385f; // ilk tahmin
if (rtd <= R0_PT100) {
//T < = 0°C: Tam denklemi kullanın
for (int i = 0; i < 10; i++) {
float rt_calc = R0_PT100 * (1.0f + A_COEFF*t + B_COEFF*t*t + C_COEFF*(t - 100.0f)*t*t*t);
float dr_dt = R0_PT100 * (A_COEFF + 2.0f*B_COEFF*t + C_COEFF*(4.0f*t*t - 300.0f*t*t));
float hata = rt_calc - rtd;
t -= hata / dr_dt;
if (fabsf(hata) < 0.001f) break;
}
} else {
// T >= 0°C:: Basitleştirilmiş denklemi kullanın
for (int i = 0; i < 10; i++) {
float rt_calc = R0_PT100 * (1.0f + A_COEFF*t + B_COEFF*t*t);
float dr_dt = R0_PT100 * (A_COEFF + 2.0f*B_COEFF*t);
float hata = rt_calc - rtd;
t -= hata / dr_dt;
if (fabsf(hata) < 0.001f) break;
}
}
t'yi döndür;
}
/**
* @brief Analog kanal ADC ölçümü (harici sıcaklık ölçümü)
* @param Yok
* @retval Yok
*/
uint32_t ADC_gain_value = 0; // Okuma verileri
uint32_t ADC_value = 0; // Veri değerini ölçün
float tmpPt100=0;
float RTD=0;
void SSP1x20_ADC_Measure(void)
{
printf("\r\n Çok noktalı tek voltaj ölçümü \r\n");
Write_REGTab[0] = SSP1x20_MUX_AIN1_AIN0 | SSP1x20_GAIN_1 | SSP1x20_PGA_BYPASS_OFF;
Write_REGTab[1] = SSP1x20_DR_20SPS | SSP1x20_MODE_NORMAL | SSP1x20_SC | SSP1x20_TS_OFF | SSP1x20_BCS_OFF;
Write_REGTab[2] = SSP1x20_VREF_REF0 | SSP1x20_REJECT_OFF | SSP1x20_PSW_OFF | SSP1x20_IDAC_500uA;
Write_REGTab[3] = SSP1x20_IDAC1_AIN2 | SSP1x20_IDAC2_AIN3 | SSP1x20_DRDYM_DRDY;
// Write_REGTab[3] = SSP1x20_IDAC1_AIN3 | SSP1x20_IDAC2_AIN2 | SSP1x20_DRDYM_DRDY;
SSP1x20_WriteRegister(SSP1x20_REG0, 4, &Write_REGTab[0]);
printf("Write_REGTab[0]=%x\r\n", Write_REGTab[0]);
printf("Write_REGTab[1]=%x\r\n", Write_REGTab[1]);
printf("Write_REGTab[2]=%x\r\n", Write_REGTab[2]);
printf("Write_REGTab[3]=%x\r\n", Write_REGTab[3]);
while (1)
{
SSP1x20_SendCommand(SSP1x20_CMD_START); Sürekli ölçüm etkinleştirildiğinde, bu komut yalnızca bir kez gönderilir
HAL_Delay(100);
SPI_ADC_CS_LOW();
ADC_gain_value =0;
ADC_gain_value = SPI_ADC_ReadByte();
ADC_gain_value = (ADC_gain_value << 8) | SPI_ADC_ReadByte();
ADC_gain_value = (ADC_gain_value << 8) | SPI_ADC_ReadByte();
SPI_ADC_CS_HIGH();
#define CALIBRATED_FULL_SCALE 4210300.0f // kalibrasyon verilerine göre
RTD = 1650.0f * ((float)ADC_gain_value / CALIBRATED_FULL_SCALE);
tmpPt100 = rtd_to_temperature_iec60751(RTD);
__NOP();
printf("R=%.3f Ω, Temp=%.2f °C\r\n",RTD, tmpPt100);
}
}
Test sonuçları şekilde gösterilmiştir:
Sıcak Su Sıcaklık Testi:

Buzlu Su Karışım Testi:

4. Harici sıcaklık testi yapılandırma ayrıntıları:
| Kayıt Olun | Değerleri yapılandırın (kodunuz) | İşlev açıklaması: | Neden bunu seçtiniz? |
| REG0 Write_REGTab[0] | SSP1x20_MUX_AIN1_AIN0 | SSP1x20_GAIN_1 |SSP1x20_PGA_BYPASS_OFF | Kanal Seçimi + Kazanç Ayarlarına Girin | |
| SSP1x20_MUX_AIN1_AIN0 | Diferansiyel girişler: AIN1 pozitif ve AIN0 negatiftir | PT100, her iki uçta AIN0 ve AIN1'e bağlanır ve diferansiyel voltaj ölçümü gerektirir. ⚠️ Polariteye dikkat edin: yapılandırma tersine çevrilirse, ADC negatif bir değer (örneğin, 0x800000) verir ve bu da negatif bir sıcaklıkla sonuçlanır. | |
| SSP1x20_GAIN_1 | Kazanç = 1 | PT100 daha küçük bir voltaja sahiptir (örneğin 500μA × 100Ω = 50mV), ancak bir oran ölçümü kullanır (referans voltajı da IDAC'dandır), bu nedenle amplifikasyon yok doygunluğu önlemek için gereklidir. | |
| SSP1x20_PGA_BYPASS_OFF | Baypas yok PGA | Sinyal yolunun normal olduğundan emin olmak için PGA işlevini koruyun (kazanç=1 olsa bile). | |
| REG1 Write_REGTab[1] | SSP1x20_DR_20SPS | SSP1x20_MODE_NORMAL | SSP1x20_SC | SSP1x20_TS_OFF | SSP1x20_BCS_OFF | Veri hızı + çalışma modu | |
| SSP1x20_DR_20SPS | Örnek oranı = 20 örnek noktası/saniye | Düşük hız doğruluğu artırır, gürültüyü bastırır ve sıcaklık ölçümü için uygundur (yavaş değişim). | |
| SSP1x20_MODE_NORMAL | Normal sürekli dönüştürme modu | Gerçek zamanlı izleme için sürekli veri çıkışı. | |
| SSP1x20_SC | Kendi kendine kalibrasyon gerçekleştirin | Her yapılandırmadan sonra kalibrasyon, ofset / kazanç hatalarını ortadan kaldırır ve doğruluğu artırır. | |
| SSP1x20_TS_OFF | Dahili sıcaklık sensörünü kapatın | Harici PT100'ü ölçüyoruz ve iç sıcaklığa ihtiyacımız yok. | |
| SSP1x20_BCS_OFF | Yanma akımı kaynaklarını devre dışı bırakma | Hayır, yok. | |
| REG2 Write_REGTab[2] | SSP1x20_VREF_REF0 | SSP1x20_REJECT_OFF | SSP1x20_PSW_OFF SSP1x20_IDAC_500uA | Referans Gerilimi + IDAC Ayarları | |
| SSP1x20_VREF_REF0 | Kullanım harici bir referans gerilimi (REF0 = AIN2/AIN3 arasındaki gerilim). | Uygulamak oran bazlı ölçümler: ADC sonucu = (Vpt100 / Vref) × 224, IDAC akımından bağımsız mutlaksadece Rref ile ilgilidir, güç kaynağı dalgalanmalarına karşı dayanıklıdır. | |
| SSP1x20_REJECT_OFF | 50/60Hz bastırma etkin değil | Çevresel parazit küçükse kapatılabilir; güç frekanslı bir ortamdaysa REJECT_50'nin açılması önerilir. | |
| SSP1x20_PSW_OFF | Sensör güç kaynağı anahtarını kapatın | PT100, IDAC tarafından beslenir ve ek PSW gerektirmez. | |
| SSP1x20_IDAC_500uA | Sabit akım kaynağı akımını ayarlayın = 500 μA | Ortak akım değerleri, dengeleme güç tüketimi ve sinyal genliği (100Ω → 50mV). | |
| REG3 Write_REGTab[3] | SSP1x20_IDAC1_AIN2 | SSP1x20_IDAC2_AIN3 | SSP1x20_DRDYM_DRDY | IDAC çıkış pimi + DRDY yapılandırması | |
| SSP1x20_IDAC1_AIN2 | IDAC1 çıkışından AIN2'ye | AIN2 - PT100 (uyarma) | |
| SSP1x20_IDAC2_AIN3 | IDAC2 çıkışından AIN3'e | AIN3, R_ref'in bir ucundaki referans direncine bağlanır (döngüyü oluşturur) → gerçekleştirir üç telli kompanzasyon (tel direncini dengeleyerek). | |
| SSP1x20_DRDYM_DRDY | Etkinleştir DRDY pini (Veri Hazır Sinyali). | MCU, verilerin ne zaman okunduğunu bilmek ve yoklamayı önlemek için GPIO aracılığıyla DRDY düşük seviyelerini algılar. |
----------------------------------
Anahtar Parça Kodu Formül Hesaplaması:
RTD = 1650*( (float)ADC_gain_value /(0x3fffff)); //referans direnci 1650 ohm tmpPt100 = (RTD-100)/0,385;
Referans direnci 1650 ohm,
İlk satır kodu RTD = 1650 * (ADC / 0x3FFFFF)
Orijinal ADC değerini PT100'ün direnç değerine dönüştürmek için tasarlanmıştır (oran ölçümü)
- VIN = I × RPT100 (PT100 üzerindeki gerilim)
- VREF = I × RREF (referans direnci üzerindeki gerilim)
Her iki uçta da aynı sabit akım kaynağı I adc kullanılır
Evet: Vin/Vref = Rpt100/Rref
ADC'nin çıkışı bu oranın sayısallaştırılmış sonucudur
ADC_Code = Vin/Vref x 224
Bu yüzden geri itildi
Rpt100= Rref x ADC_Code /224
---------------------------------------
İkinci satır kodu: tmpPt100 = (RTD - 100) / 0,385;
Doğrusal bir yaklaşım formülü ile sıcaklığı tahmin edin
0°C'de, Rpt100 = 100 Ω
Sıcaklıktaki her 1°C'lik artış için direnç yaklaşık 0,385 Ω artar.
Bu yüzden
T ≈ (R-100)/0.385
Ⅵ、 Yaygın Sorun Hata Ayıklama Kılavuzu
| Anomal | Olası nedenler | Sorun giderme adımları |
| ADC'nin orijinal değeri (ham) negatiftir | AIN0, AIN1 yapılandırmasının tersidir | 1. Yazılım yapılandırmasının donanım bağlantısıyla tutarlı olup olmadığını kontrol edin |
| R_PT100 > 1400Ω | 1. Yanlış IDAC akım yapılandırması; 2. Rref açılır | 1. REG2'nin IDAC yapılandırmasını kontrol edin (500μA olduğundan emin olun); 2. Devrenin açık olmadığını doğrulamak için R ref direnç değerini bir multimetre ile ölçün |
| Sıcaklık değeri - 999°C'dir | PT100 18Ω~330Ω aralığını aşıyor | 1. PT100 bağlantısının kesilip kesilmediğini kontrol edin (PT100 direncini ölçün); 2. SPI İletişimini Doğrulayın (Kayıt Yapılandırma Değerlerini Okuyun) |
| Sıcaklık dalgalanmaları > 0,1°C | 1. Güç kaynağında büyük dalgalanma; 2. Elektromanyetik parazit | 1. SSP1220 VDD dalgalanmasını ölçün (≤ 10mV gereklidir); 2. Paraziti önlemek için ekran telinin topraklamasını kontrol edin |
Ⅶ、 SSP1220 Çekirdek kayıt yapılandırma tablosu
| Kayıt Olun | Öğeleri yapılandırma | Değer (harici sıcaklık ölçümü) | İşlev açıklaması: |
| REG0 | Diferansiyel kanallar | AIN1-AIN0 | Negatif ham maddeyi önlemek için PT100 kablolarını eşleştirin |
| kazanç | 1× | Sinyal doygunluğundan kaçının ve oran ölçümüne uyum sağlayın | |
| PGA baypas | devre dışı bırak | Sinyal yolu bütünlüğünü koruyun | |
| REG1 | Örnekleme oranı | 20SPS | Düşük hız doğruluğu artırır ve yavaş sıcaklık sinyallerine uyum sağlar |
| Çalışma modu | Normal mod | Sıcaklık verilerinin sürekli dönüştürülmesi ve gerçek zamanlı çıkışı | |
| Kendi kendine kalibrasyon | etkinleştir | Ofset/kazanç hatalarını ortadan kaldırın ve doğruluğu artırın | |
| Dahili TS | devre dışı bırak | Harici sıcaklık ölçümü dahili sensör gerektirmez | |
| REG2 | Referans gerilimi | Harici REF0 | IDAC akım dalgalanmalarını önlemek için oran tabanlı ölçüm |
| IDAC akımı | 500μA | Dengeli Güç Tüketimi ve Sinyal Genliği (50mV 100Ω) | |
| REG3 | IDAC1 rotaları | AIN2 | Uyarma akımı girişi PT100 |
| IDAC2 rotaları | AIN3 | Kurşun direnci R7'yi etkisiz hale getirin |
Ⅷ、Callendar-Van Dusen denklemi katsayı tablosu
| Katsayı | Sayısal değer | Birim | Uygulama kapsamı |
| R0 | 100.0 | Ω | 0°C referans direnci |
| A | 3.9083×10-3 | ℃-1 | -200℃~600℃ |
| B | -5.775×10-7 | ℃-2 | -200℃~600℃ |
| C | -4.183×10-12 | ℃-4 | -200℃~0℃ |
Tam kod, teknik desteğimizle iletişime geçerek elde edilebilir. İletişim 18014203727