본문 바로가기
Sensor/온도센서(Temperature)

Temperature Sensor(온도센서) 관련 전체 요약

by linuxgo 2025. 8. 3.
반응형

 

1. 서론

온도센서는 산업, 과학, 의료, 항공우주, 가전, 환경 모니터링 등 다양한 분야에서 온도를 정밀하게 측정하여 데이터를 제공하는 핵심 기술입니다. 온도센서는 열역학적 원리, 재료 과학, 전자공학의 융합을 통해 물리적 특성의 변화를 전기적 신호로 변환하며, 이를 통해 온도를 정량화합니다. 본 백서는 온도센서의 종류, 동작 원리, 수학적 모델링, 재료 특성, 국제 표준 및 규격, 마이크로컨트롤러(MCU) 기반의 데이터 처리 코드, 신호 처리 회로, 캘리브레이션 절차, 성능 분석, 응용 사례, 설계 고려사항, 최신 기술 동향, 그리고 미래 전망을 학문적이고 실무적인 관점에서 심층적으로 다룹니다.

2. 온도센서의 종류 및 동작 원리

온도센서는 측정 방식과 물리적 특성에 따라 여러 유형으로 분류됩니다. 아래는 각 센서의 동작 원리, 수학적 모델, 재료 특성, 장단점을 상세히 분석합니다.

2.1 Thermocouple(열전대)

열전대는 제벡 효과(Seeback Effect)를 이용하여 두 가지 서로 다른 금속 또는 합금의 접합부에서 온도 차이에 의해 발생하는 기전력(EMF)을 측정합니다. 제벡 효과는 다음과 같은 미분 방정식으로 표현됩니다:

\[ V = \int_{T_c}^{T_h} (\alpha_A(T) - \alpha_B(T)) \, dT \]

여기서:

  • \(V\): 발생된 전압 (mV)
  • \(\alpha_A(T), \alpha_B(T)\): 두 금속의 온도 의존적 제벡 계수 (V/°C)
  • \(T_h\): 뜨거운 접합부 온도 (°C)
  • \(T_c\): 차가운 접합부 온도 (°C)

열전대의 EMF는 비선형이므로, NIST 표준에 따라 다항식으로 온도를 역계산합니다 (K형 열전대 예):

\[ T = a_0 + a_1 V + a_2 V^2 + a_3 V^3 + \cdots \]

예: K형 열전대 (0°C ~ 500°C):

  • \(a_0 = 0.226584602\)
  • \(a_1 = 2.5173462 \times 10^1\)
  • \(a_2 = -1.1662878 \times 10^{-1}\)
  • \(a_3 = -1.0833638 \times 10^{-2}\)
  • \(a_4 = 8.9773540 \times 10^{-4}\)

재료:

  • K형: 크로멜(Ni 90%, Cr 10%) 및 알루멜(Ni 95%, Al/Mn/Si 5%)
  • J형: 철(Fe) 및 콘스탄탄(Cu 55%, Ni 45%)
  • T형: 구리(Cu) 및 콘스탄탄
  • S형: 백금-10% 로듐(Pt-10%Rh) 및 순수 백금(Pt)

특징:

  • 온도 범위: -270°C ~ 1820°C
  • 장점: 넓은 온도 범위, 빠른 응답 시간(10ms ~ 1s), 내구성
  • 단점: 비선형 출력, 기준 접합부 보상(CJC) 필요, EMI 민감

2.2 RTD(저항온도계 , Resistance Temperature Detector)

RTD는 금속(주로 백금)의 저항이 온도에 따라 변화하는 특성을 이용합니다. 저항-온도 관계는 Callendar-Van Dusen 방정식으로 모델링됩니다:

\[ R_t = R_0 \left[ 1 + A T + B T^2 + C (T - 100) T^3 \right] \quad (T < 0°C) \]

\[ R_t = R_0 \left[ 1 + A T + B T^2 \right] \quad (T \geq 0°C) \]

여기서:

  • \(R_t\): 온도 \(T\)에서의 저항 (Ω)
  • \(R_0\): 0°C에서의 기준 저항 (Pt100: 100Ω, Pt1000: 1000Ω)
  • \(A = 3.9083 \times 10^{-3}\), \(B = -5.775 \times 10^{-7}\), \(C = -4.183 \times 10^{-12}\)

선형 근사:

\[ R_t \approx R_0 (1 + \alpha T) \]

자기 가열 효과:

\[ \Delta T = \frac{I^2 R_t}{k} \]

재료:

  • 백금(Pt): 높은 선형성, 내식성
  • 니켈(Ni): 저비용, -80°C ~ 260°C
  • 구리(Cu): 0°C ~ 150°C

특징:

  • 온도 범위: -200°C ~ 850°C
  • 장점: 높은 정확도(±0.1°C), 장기 안정성
  • 단점: 비용 높음, 응답 시간 느림

2.3 Thermistor(써미스터)

써미스터는 세라믹 또는 폴리머 재료의 저항 변화로 온도를 측정합니다. NTC 써미스터의 저항-온도 관계는 Steinhart-Hart 방정식으로 표현됩니다:

\[ \frac{1}{T} = A + B \ln(R) + C (\ln(R))^3 \]

β-모델:

\[ R_t = R_0 \exp \left[ \beta \left( \frac{1}{T} - \frac{1}{T_0} \right) \right] \]

재료:

  • NTC: 망간(Mn), 니켈(Ni), 코발트(Co) 산화물
  • PTC: 바륨 타이타네이트(BaTiO₃)

특징:

  • 온도 범위: -50°C ~ 150°C
  • 장점: 높은 민감도(±0.05°C), 저렴
  • 단점: 비선형 출력, 습도 취약

2.4 IC Temperature Senosr(반도체 온도센서)

반도체 센서는 다이오드의 전압-온도 특성을 이용합니다:

\[ V_F = \frac{k T}{q} \ln \left( \frac{I_F}{I_S} \right) \]

선형 근사:

\[ V_F = V_{F0} - k_T T \]

재료: 실리콘(Si), CMOS

특징:

  • 온도 범위: -55°C ~ 150°C
  • 장점: 선형 출력, 디지털 인터페이스
  • 단점: 제한된 온도 범위

2.5 IR Temperature sensor(적외선 온도센서,비접촉식)

적외선 센서는 복사 에너지를 측정합니다:

\[ P = \epsilon \sigma A (T^4 - T_a^4) \]

방사율 보정:

\[ T_{\text{corrected}} = \left( \frac{P_{\text{measured}}}{\epsilon \sigma A} + T_a^4 \right)^{1/4} \]

재료: 게르마늄(Ge), 열전퇴 소자

특징:

  • 온도 범위: -50°C ~ 3000°C
  • 장점: 비접촉, 빠른 응답
  • 단점: 방사율 보정 필요

3. 온도센서의 재료 특성

센서 유형 주요 재료 특성 열전도율 (W/m·K) 내식성 비용
열전대 크로멜, 알루멜, 백금, 로듐 높은 내열성, 제벡 계수 안정성 20 ~ 100 높음 중간~높음
RTD 백금(Pt), 니켈(Ni), 구리(Cu) 높은 선형성, 장기 안정성 70 (Pt), 90 (Ni) 높음 높음
써미스터 망간/니켈 산화물, BaTiO₃ 높은 민감도, 습도 취약성 2 ~ 5 중간 저렴
반도체 센서 실리콘, CMOS 저전력, 소형 150 (Si) 중간 저렴
적외선 센서 게르마늄, 열전퇴 소자 비접촉, 렌즈 취약성 60 (Ge) 중간 중간~높음

4. 온도센서의 국제 표준 및 규격

주요 규격:

  • IEC 60751:2008: 백금 RTD 허용 오차
  • ANSI/ISA-51.1: 열전대 및 RTD 색상 코드
  • ASTM E230/E230M: 열전대 EMF 테이블
  • ISO 80601-2-56: 의료용 온도센서

RTD 허용 오차 (IEC 60751):

온도 (°C) 클래스 AA (°C) 클래스 A (°C) 클래스 B (°C)
-200 ±0.44 ±0.55 ±1.30
-50 ±0.19 ±0.25 ±0.55
0 ±0.10 ±0.15 ±0.30
100 ±0.27 ±0.35 ±0.80
500 ±0.95 ±1.15 ±2.30

5. STM32 기반 온도센서 데이터 처리 및 코드 구현

5.1 열전대 데이터 처리 (MAX31855)

#include "stm32f10x.h"
#include "stm32f10x_spi.h"
#include "stdio.h"

// SPI1 초기화
void SPI1_Init(void) {
    RCC->APB2ENR |= RCC_APB2ENR_SPI1EN | RCC_APB2ENR_IOPAEN;
    GPIOA->CRL = (GPIOA->CRL & ~(GPIO_CRL_MODE4 | GPIO_CRL_CNF4)) | GPIO_CRL_MODE4_1 | GPIO_CRL_CNF4_0; // PA4: CS
    SPI1->CR1 = SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_MSTR | SPI_CR1_BR_2 | SPI_CR1_CPOL | SPI_CR1_CPHA; // 마스터, 1MHz
    SPI1->CR1 |= SPI_CR1_SPE;
}

// MAX31855 데이터 읽기
uint32_t MAX31855_Read(void) {
    GPIOA->BSRR = GPIO_BSRR_BR4; // CS Low
    uint32_t data = 0;
    for (int i = 0; i < 4; i++) {
        while (!(SPI1->SR & SPI_SR_TXE));
        SPI1->DR = 0x00;
        while (!(SPI1->SR & SPI_SR_RXNE));
        data = (data << 8) | (SPI1->DR & 0xFF);
    }
    GPIOA->BSRR = GPIO_BSRR_BS4; // CS High
    return data;
}

// 온도 변환
float Thermocouple_Temperature(uint32_t raw) {
    if (raw & 0x7) return NAN; // 오류 체크
    int32_t temp = (raw >> 18) & 0x3FFF;
    if (temp & 0x2000) temp |= ~0x3FFF; // 부호 확장
    return temp * 0.25; // 0.25°C 해상도
}

float CJC_Temperature(uint32_t raw) {
    int32_t temp = (raw >> 4) & 0xFFF;
    if (temp & 0x800) temp |= ~0xFFF;
    return temp * 0.0625; // 0.0625°C 해상도
}

int main(void) {
    SPI1_Init();
    // UART 초기화 (간단히 생략, 실제 구현 필요)
    while (1) {
        uint32_t data = MAX31855_Read();
        float temp = Thermocouple_Temperature(data);
        float cjc = CJC_Temperature(data);
        if (!isnan(temp)) {
            printf("CJC: %.2f °C, 열전대: %.2f °C\n", cjc, temp);
        } else {
            printf("열전대 오류\n");
        }
        for (volatile int i = 0; i < 1000000; i++); // 1초 지연
    }
}
        

5.2 Pt100 RTD 데이터 처리 (MAX31865)

#include "stm32f10x.h"
#include "stm32f10x_spi.h"
#include "math.h"

// MAX31865 레지스터
#define REG_CONFIG 0x00
#define REG_RTD_MSB 0x01
#define REG_FAULT 0x07
#define REG_WRITE 0x80

// 기준 저항 및 공칭 저항
#define RREF 430.0
#define RNOMINAL 100.0

void SPI1_Init(void) {
    RCC->APB2ENR |= RCC_APB2ENR_SPI1EN | RCC_APB2ENR_IOPAEN;
    GPIOA->CRL = (GPIOA->CRL & ~(GPIO_CRL_MODE4 | GPIO_CRL_CNF4)) | GPIO_CRL_MODE4_1 | GPIO_CRL_CNF4_0;
    SPI1->CR1 = SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_MSTR | SPI_CR1_BR_2 | SPI_CR1_CPOL | SPI_CR1_CPHA;
    SPI1->CR1 |= SPI_CR1_SPE;
}

void MAX31865_Init(void) {
    GPIOA->BSRR = GPIO_BSRR_BR4;
    SPI1->DR = REG_WRITE | REG_CONFIG;
    while (!(SPI1->SR & SPI_SR_TXE));
    SPI1->DR = 0xC2; // 3선식, 50Hz 필터
    while (!(SPI1->SR & SPI_SR_TXE));
    GPIOA->BSRR = GPIO_BSRR_BS4;
}

uint16_t MAX31865_ReadRTD(void) {
    GPIOA->BSRR = GPIO_BSRR_BR4;
    SPI1->DR = REG_RTD_MSB;
    while (!(SPI1->SR & SPI_SR_TXE));
    SPI1->DR = 0x00;
    while (!(SPI1->SR & SPI_SR_RXNE));
    uint16_t msb = SPI1->DR;
    SPI1->DR = 0x00;
    while (!(SPI1->SR & SPI_SR_RXNE));
    uint16_t lsb = SPI1->DR;
    GPIOA->BSRR = GPIO_BSRR_BS4;
    return (msb << 8) | lsb;
}

float RTD_Temperature(uint16_t rtd) {
    float ratio = rtd / 32768.0;
    float resistance = RREF * ratio;
    float A = 3.9083e-3, B = -5.775e-7, C = -4.183e-12;
    float temp = (-RNOMINAL * A + sqrt(RNOMINAL * RNOMINAL * A * A - 4 * RNOMINAL * B * (RNOMINAL - resistance))) / (2 * RNOMINAL * B);
    if (resistance < RNOMINAL) { // 저온 보정
        temp = (resistance - RNOMINAL) / (RNOMINAL * A);
    }
    return temp;
}

int main(void) {
    SPI1_Init();
    MAX31865_Init();
    while (1) {
        uint16_t rtd = MAX31865_ReadRTD();
        float temp = RTD_Temperature(rtd);
        printf("저항: %.2f Ω, 온도: %.2f °C\n", RREF * (rtd / 32768.0), temp);
        for (volatile int i = 0; i < 1000000; i++);
    }
}
        

5.3 써미스터 데이터 처리 (ADC)

#include "stm32f10x.h"
#include "math.h"

// Steinhart-Hart 계수
#define A 1.129148e-3
#define B 2.34125e-4
#define C 8.76741e-8

void ADC1_Init(void) {
    RCC->APB2ENR |= RCC_APB2ENR_ADC1EN | RCC_APB2ENR_IOPAEN;
    GPIOA->CRL = (GPIOA->CRL & ~(GPIO_CRL_CNF0)) | GPIO_CRL_CNF0_1; // PA0: 아날로그
    ADC1->CR2 = ADC_CR2_ADON | ADC_CR2_CAL;
    while (ADC1->CR2 & ADC_CR2_CAL);
    ADC1->SMPR2 = ADC_SMPR2_SMP0_2; // 샘플링 시간
    ADC1->SQR3 = 0; // 채널 0
}

float Read_Thermistor(void) {
    ADC1->CR2 |= ADC_CR2_ADON;
    while (!(ADC1->SR & ADC_SR_EOC));
    uint16_t adc = ADC1->DR;
    float voltage = adc * 3.3 / 4096.0;
    float R = 10000.0 * (3.3 / voltage - 1); // 10kΩ 분배기
    float ln_R = log(R);
    float T_inv = A + B * ln_R + C * (ln_R * ln_R * ln_R);
    return 1 / T_inv - 273.15;
}

int main(void) {
    ADC1_Init();
    while (1) {
        float temp = Read_Thermistor();
        printf("온도: %.2f °C\n", temp);
        for (volatile int i = 0; i < 1000000; i++);
    }
}
        

5.4 적외선 온도센서 (MLX90614)

#include "stm32f10x.h"
#include "stm32f10x_i2c.h"

void I2C1_Init(void) {
    RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
    GPIOB->CRL = (GPIOB->CRL & ~(GPIO_CRL_MODE6 | GPIO_CRL_CNF6 | GPIO_CRL_MODE7 | GPIO_CRL_CNF7)) |
                 GPIO_CRL_CNF6_1 | GPIO_CRL_MODE6_1 | GPIO_CRL_CNF7_1 | GPIO_CRL_MODE7_1;
    I2C1->CR2 = 36; // 36MHz
    I2C1->CCR = 180; // 100kHz
    I2C1->TRISE = 37;
    I2C1->CR1 |= I2C_CR1_PE;
}

float MLX90614_Read(uint8_t reg) {
    I2C1->CR1 |= I2C_CR1_START;
    while (!(I2C1->SR1 & I2C_SR1_SB));
    I2C1->DR = 0x5A << 1;
    while (!(I2C1->SR1 & I2C_SR1_ADDR));
    (void)I2C1->SR2;
    I2C1->DR = reg;
    while (!(I2C1->SR1 & I2C_SR1_TXE));
    I2C1->CR1 |= I2C_CR1_START;
    I2C1->DR = (0x5A << 1) | 1;
    while (!(I2C1->SR1 & I2C_SR1_ADDR));
    (void)I2C1->SR2;
    while (!(I2C1->SR1 & I2C_SR1_RXNE));
    uint16_t lsb = I2C1->DR;
    while (!(I2C1->SR1 & I2C_SR1_RXNE));
    uint16_t msb = I2C1->DR;
    I2C1->CR1 |= I2C_CR1_STOP;
    return ((msb << 8) | lsb) * 0.02 - 273.15;
}

int main(void) {
    I2C1_Init();
    while (1) {
        float ambient = MLX90614_Read(0x06);
        float object = MLX90614_Read(0x07);
        printf("주변: %.2f °C, 물체: %.2f °C\n", ambient, object);
        for (volatile int i = 0; i < 1000000; i++);
    }
}
        

6. 온도센서의 신호 처리 회로

6.1 열전대

증폭기: INA125 또는 AD8495, CJC: Pt100, 필터: RC 저역통과 (100Hz).

6.2 RTD

3선식: \( R_t = R_{\text{measured}} - 2 R_{\text{wire}} \), 4선식: 켈빈 연결.

6.3 써미스터

\[ V_{\text{out}} = V_{\text{ref}} \frac{R_{\text{therm}}}{R_{\text{therm}} + R_{\text{ref}}} \]

6.4 적외선 센서

I2C/SPI 인터페이스, 방사율 보정.

7. 온도센서의 캘리브레이션 절차

1. 준비: NIST 추적 온도 소스 (0°C, 100°C).

2. 절차: 단일점/다지점 캘리브레이션, 오차 보정: \( T_{\text{corrected}} = T_{\text{measured}} + k_0 + k_1 T_{\text{measured}} \).

8. 성능 분석 및 비교

센서 유형 온도 범위 (°C) 정확도 (°C) 응답 시간 비용 내구성 인터페이스
열전대 -270 ~ 1820 ±1 ~ ±2 10ms ~ 1s 중간 높음 아날로그
RTD (Pt100) -200 ~ 850 ±0.1 ~ ±0.5 100ms ~ 1s 높음 중간 아날로그/디지털
써미스터 -50 ~ 150 ±0.05 ~ ±0.2 10ms ~ 500ms 저렴 낮음 아날로그
반도체 센서 -55 ~ 150 ±0.5 ~ ±1 100ms ~ 1s 저렴 중간 디지털
적외선 센서 -50 ~ 3000 ±0.5 ~ ±2 50ms ~ 200ms 중간 중간 디지털

9. 응용 사례

  • 산업 공정: 열전대 및 RTD로 고로 온도 제어
  • 의료: 써미스터 및 적외선 센서로 체온 측정
  • 항공우주: 열전대(S형)로 제트 엔진 온도 모니터링
  • IoT: DS18B20으로 스마트 홈 온도 관리

10. 최신 기술 동향

  • MEMS 기반 센서: 초소형화
  • AI/ML 보정: 비선형 출력 보정
  • 무선 통신: Wi-Fi, LoRaWAN
  • 고온 초전도 센서: 극저온 측정

11. 미래 전망

  • 초정밀 센서: ±0.01°C 정확도
  • 스마트 센서: AI 내장
  • 5G/IoT 통합: 초저지연
  • 환경 지속 가능성: 재활용 재료

12. 결론

온도센서는 열역학, 재료 과학, 전자공학의 융합 기술로, 다양한 산업에서 핵심 역할을 수행합니다. 본 내용은 온도센서의 동작 원리, 수학적 모델, 재료 특성, 예제 기반 코드, 신호 처리, 최신 동향을 포괄적으로 다루었습니다.

13. 참고문헌

  • IEC 60751:2008, Industrial Platinum Resistance Thermometers
  • ASTM E230/E230M, Standard Specification for Thermocouples
  • Steinhart, J.S., Hart, S.R., "Calibration curves for thermistors," Deep-Sea Research, 1968
반응형