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

Thermistor(써미스터)

by linuxgo 2025. 8. 5.
반응형

써미스터는 온도 변화에 따라 저항값이 변하는 반도체 소자로, 온도 측정, 보상, 과열 보호 등 다양한 응용 분야에서 사용됩니다.

1. 써미스터의 작동 원리

써미스터는 온도에 따라 저항이 변하는 반도체 소자로, 주로 금속 산화물 또는 세라믹 재료로 제작됩니다. 온도 변화에 따라 전하 캐리어 이동성이 달라지며, 이로 인해 저항값이 변화합니다. 저항-온도 관계는 비선형적이며, 다음 두 공식으로 표현됩니다:

  • 베타 공식:
    \[ R_T = R_0 e^{\beta \left( \frac{1}{T} - \frac{1}{T_0} \right)} \]
    • \(R_T\): 온도 \(T\)에서의 저항값 (옴, Ω)
    • \(R_0\): 기준 온도 \(T_0\) (보통 25°C, 298.15K)에서의 저항값
    • \(\beta\): 써미스터의 물질 상수 (단위: K, 2000~5000K)
    • \(T\), \(T_0\): 절대 온도 (켈빈, K)
  • 스테인하트-하트 방정식 (고정밀 모델):
    \[ \frac{1}{T} = A + B \ln(R) + C (\ln(R))^3 \]
    • \(A\), \(B\), \(C\): 제조사 제공 상수
    • \(R\): 측정된 저항값
    • 넓은 온도 범위에서 ±0.01°C 수준의 정확도 제공

작동 메커니즘:

  • NTC 써미스터: 온도 증가 시 전하 캐리어 밀도 증가로 저항 감소.
  • PTC 써미스터: 큐리 온도 이상에서 결정 구조 변화로 저항 급증.

2. 써미스터의 종류

종류 특징 특성 곡선 주요 응용
NTC 써미스터 온도 증가 시 저항 감소 지수적 감소 (비선형) 온도 센서, 온도 보상 (예: 온도계, BMS)
PTC 써미스터 온도 증가 시 저항 증가, 큐리 온도에서 급증 특정 온도에서 급변 과열 보호, 전류 제한 (예: 모터 보호)

3. 써미스터의 재료

3.1 NTC 써미스터 재료

  • 주요 재료: 망간(Mn), 니켈(Ni), 코발트(Co), 철(Fe), 구리(Cu) 등의 금속 산화물 (예: Mn₃O₄, NiO).
  • 제작 공정: 금속 산화물 분말 혼합, 고온 소결로 세라믹 구조 형성, 도펀트 첨가로 저항값 조정.
  • 특징: 저항 100Ω~10MΩ, β 값 2000~5000K, 소형화 가능.

3.2 PTC 써미스터 재료

  • 주요 재료: 바륨 티타네이트(BaTiO₃), 스트론튬/납 티타네이트 기반 세라믹.
  • 제작 공정: 세라믹 분말 압축 성형 후 소결, 도펀트(이트륨, 란타넘)로 큐리 온도 조정.
  • 특징: 저항 10Ω~kΩ, 큐리 온도 60°C~200°C.

3.3 기타 재료

  • 폴리머 PTC: 탄소 입자 포함 폴리머, 유연성, 저비용.
  • 고온용 써미스터: 지르코늄 산화물(ZrO₂), 실리콘 카바이드(SiC), 300°C 이상.
  • 박막 써미스터: 스퍼터링 공정, 초소형화.
재료 유형 주요 재료 특징 응용
NTC 써미스터 Mn₃O₄, NiO, Co₃O₄ 높은 β 값, 저항 100Ω~10MΩ 온도 센서, 온도 보상
PTC 써미스터 BaTiO₃, SrTiO₃ 큐리 온도에서 저항 급증, 10Ω~kΩ 과열 보호, 전류 제한
폴리머 PTC 탄소 입자 포함 폴리머 유연성, 저비용 플렉시블 전자기기
고온용 써미스터 ZrO₂, SiC 300°C 이상, 내구성 고온 산업 응용

4. 써미스터의 주요 특성

특성 설명
비선형성 저항-온도 곡선이 비선형, 특정 온도 범위에서 민감도 높음
민감도 NTC: 온도 1°C당 저항 1~5% 감소, PTC: 큐리 온도에서 저항 급증
응답 속도 열적 질량 작아 10ms 이내 응답
온도 범위 NTC: -50°C ~ 150°C (특수: ~300°C), PTC: 0°C ~ 200°C
내구성 습도, 화학적 노출, 진동에 취약 가능
자기 가열 전류로 인한 발열로 온도 오차 발생 가능

5. 보정 방법

써미스터의 비선형 저항-온도 특성으로 인해 정확한 온도 측정을 위해 보정이 필요합니다. 아래는 주요 보정 방법과 C 코드입니다.

5.1 루프업 테이블(Look-Up Table, LUT)

제조사 제공 저항-온도 데이터 테이블을 사용, 중간값은 선형 보간법으로 계산.

  • 장점: 간단, 빠른 처리.
  • 단점: 메모리 소모, 데이터 부족 시 부정확.
  • 응용 사례: Arduino 기반 온도계.
#include <stdio.h>

typedef struct {
    double resistance;
    double temperature;
} LutEntry;

// Example LUT from NTC thermistor datasheet
LutEntry lut[] = {
    {32760, -20.0},
    {25000, -10.0},
    {15000, 0.0},
    {10000, 25.0},
    {6800, 40.0},
    {4700, 50.0},
    {3300, 60.0},
    {2000, 80.0},
    {1200, 100.0}
};
const int LUT_SIZE = sizeof(lut) / sizeof(lut[0]);

double lut_interpolation(double resistance) {
    // Boundary checks
    if (resistance > lut[0].resistance) {
        printf("Warning: Resistance %.2fΩ is above LUT range. Returning lowest temperature.\n", resistance);
        return lut[0].temperature;
    }
    if (resistance < lut[LUT_SIZE-1].resistance) {
        printf("Warning: Resistance %.2fΩ is below LUT range. Returning highest temperature.\n", resistance);
        return lut[LUT_SIZE-1].temperature;
    }

    // Linear interpolation
    for (int i = 0; i < LUT_SIZE-1; i++) {
        double r_high = lut[i].resistance;
        double r_low = lut[i+1].resistance;
        if (r_low <= resistance && resistance <= r_high) {
            double t_high = lut[i].temperature;
            double t_low = lut[i+1].temperature;
            // T = T_low + (T_high - T_low) * (R - R_low) / (R_high - R_low)
            return t_low + (t_high - t_low) * (resistance - r_low) / (r_high - r_low);
        }
    }
    return 0.0; // Should not reach here
}

int main() {
    double test_resistances[] = {15000, 5000, 50000, 1000};
    int num_tests = sizeof(test_resistances) / sizeof(test_resistances[0]);
    
    for (int i = 0; i < num_tests; i++) {
        double temp = lut_interpolation(test_resistances[i]);
        printf("Resistance: %.2fΩ -> Temperature: %.2f°C\n", test_resistances[i], temp);
    }
    return 0;
}
    

5.2 스테인하트-하트 방정식

저항값을 스테인하트-하트 방정식에 대입해 온도 계산, 고정밀.

  • 장점: ±0.01°C 정확도, 넓은 온도 범위.
  • 단점: 계산 복잡, 상수 필요.
  • 응용 사례: 의료 기기, 산업용 센서.
#include <stdio.h>
#include <math.h>

// Steinhart-Hart coefficients (example)
const double A = 1.129148e-3;
const double B = 2.341077e-4;
const double C = 8.775468e-8;

double steinhart_hart(double resistance) {
    if (resistance <= 0) {
        printf("Error: Resistance must be positive\n");
        return -999.0; // Error code
    }

    // Calculate 1/T = A + B*ln(R) + C*(ln(R))^3
    double ln_r = log(resistance);
    double inv_temp = A + B * ln_r + C * pow(ln_r, 3);

    // Convert to temperature in Kelvin and then to Celsius
    if (inv_temp == 0) {
        printf("Error: Invalid Steinhart-Hart calculation\n");
        return -999.0;
    }
    double temp_kelvin = 1.0 / inv_temp;
    if (temp_kelvin < 0) {
        printf("Error: Negative Kelvin temperature\n");
        return -999.0;
    }
    double temp_celsius = temp_kelvin - 273.15;
    return temp_celsius;
}

int main() {
    double test_resistances[] = {32760, 10000, 1200, -100};
    int num_tests = sizeof(test_resistances) / sizeof(test_resistances[0]);
    
    for (int i = 0; i < num_tests; i++) {
        double temp = steinhart_hart(test_resistances[i]);
        if (temp != -999.0) {
            printf("Resistance: %.2fΩ -> Temperature: %.2f°C\n", test_resistances[i], temp);
        }
    }
    return 0;
}
    

5.3 베타 공식

단순화된 지수 함수로 저항-온도 변환, 좁은 온도 범위에서 유효.

  • 장점: 계산 간단, 저사양 시스템 적합.
  • 단점: ±25°C 범위에서만 정확.
  • 응용 사례: 가전제품, 간단한 로깅.
#include <stdio.h>
#include <math.h>

// Beta parameters (example for 10kΩ NTC thermistor)
const double R0 = 10000.0; // Resistance at T0 (ohms)
const double T0 = 25.0 + 273.15; // Reference temperature in Kelvin
const double BETA = 3950.0; // Beta value in Kelvin

double beta_formula(double resistance) {
    if (resistance <= 0) {
        printf("Error: Resistance must be positive\n");
        return -999.0;
    }

    // Calculate 1/T = 1/T0 + (1/BETA) * ln(R/R0)
    double inv_temp = (1.0 / T0) + (1.0 / BETA) * log(resistance / R0);
    if (inv_temp == 0) {
        printf("Error: Invalid Beta calculation\n");
        return -999.0;
    }

    double temp_kelvin = 1.0 / inv_temp;
    if (temp_kelvin < 0 || temp_kelvin > 1000) {
        printf("Error: Temperature out of realistic range\n");
        return -999.0;
    }
    double temp_celsius = temp_kelvin - 273.15;
    return temp_celsius;
}

int main() {
    double test_resistances[] = {32760, 10000, 1200, 0};
    int num_tests = sizeof(test_resistances) / sizeof(test_resistances[0]);
    
    for (int i = 0; i < num_tests; i++) {
        double temp = beta_formula(test_resistances[i]);
        if (temp != -999.0) {
            printf("Resistance: %.2fΩ -> Temperature: %.2f°C\n", test_resistances[i], temp);
        }
    }
    return 0;
}
    

5.4 선형 근사

특정 온도 구간에서 저항-온도 관계를 선형으로 근사.

  • 장점: 계산 간단, 저사양 시스템 적합.
  • 단점: 좁은 범위, 낮은 정확도.
  • 응용 사례: 저비용 실내 온도계.
#include <stdio.h>

double linear_approximation(double resistance, double r1, double t1, double r2, double t2) {
    if (r1 == r2) {
        printf("Error: Resistance values must be different\n");
        return -999.0;
    }

    // T = T1 + (T2 - T1) * (R - R1) / (R2 - R1)
    double temperature = t1 + (t2 - t1) * (resistance - r1) / (r2 - r1);
    
    // Validate temperature range
    if (temperature < -50 || temperature > 150) {
        printf("Warning: Temperature %.2f°C is outside typical thermistor range\n", temperature);
    }
    return temperature;
}

int main() {
    double resistance = 15000;
    double r1 = 20000, t1 = 10.0; // Point 1
    double r2 = 10000, t2 = 25.0; // Point 2
    
    double temp = linear_approximation(resistance, r1, t1, r2, t2);
    if (temp != -999.0) {
        printf("Resistance: %.2fΩ -> Temperature: %.2f°C\n", resistance, temp);
    }
    return 0;
}
    

5.5 ADC 통합 보정

분압기 회로에서 ADC로 측정한 전압을 저항으로 변환 후 온도 계산.

  • 장점: 실시간 처리, 실제 시스템 통합.
  • 단점: ADC 노이즈 관리 필요.
  • 응용 사례: 임베디드 시스템.
#include <stdio.h>
#include <math.h>

// Steinhart-Hart coefficients
const double A = 1.129148e-3;
const double B = 2.341077e-4;
const double C = 8.775468e-8;

// Voltage divider parameters
const double VIN = 5.0; // Input voltage (V)
const double R_FIXED = 10000.0; // Fixed resistor (ohms)
const int ADC_MAX = 1023; // 10-bit ADC
const double V_REF = 5.0; // Reference voltage (V)

double adc_to_resistance(int adc_value) {
    if (adc_value <= 0 || adc_value >= ADC_MAX) {
        printf("Error: ADC value out of range\n");
        return -1.0;
    }

    // Convert ADC to voltage
    double v_out = (adc_value / (double)ADC_MAX) * V_REF;
    
    // Calculate thermistor resistance: R_therm = R_fixed * (Vin/Vout - 1)
    if (v_out == 0) {
        printf("Error: Invalid voltage\n");
        return -1.0;
    }
    double r_thermistor = R_FIXED * (VIN / v_out - 1);
    return r_thermistor;
}

double steinhart_hart(double resistance) {
    if (resistance <= 0) {
        printf("Error: Resistance must be positive\n");
        return -999.0;
    }

    double ln_r = log(resistance);
    double inv_temp = A + B * ln_r + C * pow(ln_r, 3);
    if (inv_temp == 0) {
        printf("Error: Invalid Steinhart-Hart calculation\n");
        return -999.0;
    }
    double temp_kelvin = 1.0 / inv_temp;
    double temp_celsius = temp_kelvin - 273.15;
    return temp_celsius;
}

double adc_to_temperature(int adc_value) {
    double resistance = adc_to_resistance(adc_value);
    if (resistance < 0) {
        return -999.0;
    }
    return steinhart_hart(resistance);
}

int main() {
    int adc_values[] = {512, 700, 300, 1024};
    int num_tests = sizeof(adc_values) / sizeof(adc_values[0]);
    
    for (int i = 0; i < num_tests; i++) {
        double temp = adc_to_temperature(adc_values[i]);
        if (temp != -999.0) {
            printf("ADC: %d -> Temperature: %.2f°C\n", adc_values[i], temp);
        }
    }
    return 0;
}
    
방법 장점 단점 응용 사례 정확도
LUT 간단, 빠른 처리 메모리 소모, 데이터 부족 시 부정확 Arduino, 저비용 온도계 ±0.5°C
스테인하트-하트 고정밀 (±0.01°C), 넓은 온도 범위 계산 복잡, 상수 필요 의료 기기, 산업용 센서 ±0.01°C
베타 공식 계산 간단, 저사양 시스템 적합 ±25°C 범위에서만 정확 가전제품, 간단한 로깅 ±1°C
선형 근사 매우 간단, 저사양 시스템 적합 좁은 범위, 낮은 정확도 저비용 실내 온도계 ±2°C
ADC 통합 실시간 처리, 실제 시스템 통합 ADC 노이즈 관리 필요 임베디드 시스템 ±0.1°C (보정 후)

6. 보정 알고리즘

위 C 코드는 임베디드 시스템에 적합한 보정 알고리즘을 구현합니다. 최적화 방법:

  • 실시간 처리: LUT에 이진 탐색 적용.
  • 노이즈 필터링: ADC 값에 이동 평균 필터 적용.
  • 캘리브레이션: 기준 온도(0°C, 100°C)에서 측정으로 상수 조정.

7. 센싱 회로

회로 유형 구성 장점 단점 응용
분압기 회로 써미스터와 고정 저항 직렬 간단, 저비용 비선형 출력, ADC 필요 온도계, 가전제품
휘트스톤 브릿지 4개 저항 브릿지, 써미스터 포함 고정밀, 선형성 향상 복잡, 비용 증가 고정밀 측정
정전류 회로 써미스터에 일정 전류 인가 선형 출력 정전류 소스 필요, 전력 소모 산업용 센서

분압기 회로 공식:

\[ V_{out} = V_{in} \cdot \frac{R_{fixed}}{R_{thermistor} + R_{fixed}} \]

8. 응용 분야

응용 분야 설명 예시
온도 측정 온도 센서로 사용 디지털 온도계, 체온계, HVAC 시스템
온도 보상 회로 성능 안정화 트랜지스터, 오실레이터, 통신 장비
과열 보호 PTC 써미스터로 과열 방지 모터, 배터리, 전원 공급 장치
전류 제한 과전류 방지 스피커, 전원 회로
의료 기기 정밀 온도 측정 혈액 분석기, 인큐베이터
산업 응용 공정 제어, 열 분석 공정 모니터링, 열 분석 장비

9. 장단점

항목 장점 단점
장점 높은 민감도, 소형화, 저비용, 빠른 응답 -
단점 - 비선형성, 제한된 온도 범위, 자기 가열

10. 써미스터와 다른 온도 센서 비교

특성 써미스터 RTD 열전대
온도 범위 -50°C ~ 150°C (특수: ~300°C) -200°C ~ 850°C -200°C ~ 1750°C
정확도 ±0.1°C (보정 시 ±0.01°C) ±0.01°C ±1°C
비용 저렴 고가 중간
선형성 비선형 선형 비선형
응답 속도 빠름 (10ms 이내) 중간 (100ms~1s) 빠름 (10ms~100ms)

11. 설계 및 사용 시 고려사항

항목 고려사항
보정 회로 ADC 해상도 10비트 이상, 노이즈 필터링
환경 보호 방수 코팅, 내화학성 캡슐
자기 가열 방지 저전류(µA), 펄스 측정
재료 선택 NTC: 저온/중온, PTC: 고온 보호
캘리브레이션 기준 온도(0°C, 100°C)에서 측정

12. 결론

써미스터는 높은 민감도, 소형화, 저비용으로 다양한 온도 측정 및 제어 응용에서 필수적인 센서이며,비선형 특성을 보완하기 위해 LUT, 스테인하트-하트, 베타 공식, 선형 근사와 같은 보정 방법을 사용되어야 합니다.

반응형