반응형

스레드 동기화(Thread Synchronization)

여러 스레드가 동시에 실행되면 데이터 불일치 문제가 발생할 수 있습니다. 동기화를 사용하면 이 문제를 방지할 수 있습니다. 동기화는 데이터 불일치 문제를 극복하기 위해 한 번에 하나의 스레드만 실행할 수 있도록 합니다. 동기화는 실행해야 하는 스레드가 둘 이상인 경우 한 번에 단일 스레드가 임계 영역에 액세스할 수 있도록 보장하는 메커니즘입니다.

동기화 프리미티브를 보장하는 동안 교착 상태 및 경쟁 조건과 같은 두 가지 주요 문제가 발생할 수 있습니다.

 

다음 스크립트는 두 스레드가 함께 실행되어 불규칙하게 출력되는 모습을 보여주고 있습니다.

 

from threading import *

import time

 

def func(n):  

  for i in range(2):

    print("Hi:", end='')

    time.sleep(2)

    print(n)

 

t1 = Thread(target = func, args = ("Park", ))

t2 = Thread(target = func, args = ("Kim", ))

t1.start()

t2.start()

 

Output:

Hi:Hi:ParkKim

Hi:

Hi:Kim

Park

 

 

Lock 사용

Lock에는 두 가지 정의된 상태가 있습니다. 하나는 잠금 상태이고 다른 하나는 잠금 해제 상태입니다.

Lock은 초기 생성 시에 잠금 해제 상태로 생성됩니다. 지원되는 두 가지 메서드는 acquire() release()가 있습니다.

Lockacquire()하면 해당 스레드만 공유 데이터에 접근할 수 있고 Lockrelease()해야만 다른 스레드에서 공유 데이터에 접근 할 수 있습니다.

 

acquire()

-  잠금 상태인 경우, 다른 스레드에서 release()호출을 통해서 잠금 해지 상태로 바꿀 때까지 블록 됩니다. 잠금 상태에서 acquire() 메서드를 호출하면 다시 잠금으로 재설정하고 반환합니다.

-  잠금 해지 상태인 경우, 잠금 상태로 변경하고 반환합니다.

release()

-  잠금 상태인 경우, 잠금 해지 상태로 변경합니다.

-  잠금 해지 상태인 경우, RuntimeError가 발생합니다.

 

다음 스크립트는 잠금 해지 상태에서 release()를 호출했을 때 발생하는 오류입니다.

 

from threading import *

 

lock = Lock()

lock.release()

 

Output:

RuntimeError: release unlocked lock

 

다음 스크립트는 acquire()release()를 사용하는 방법을 보여주고 있습니다. 두 스레드가 순차적으로 출력하고 있는 모습을 보여주고 있습니다.

 

from threading import *

import time

 

lock = Lock()

 

def func(n): 

  lock.acquire() 

  for i in range(2):

    print("Hi:", end='')

    print(n)

  lock.release()

 

t1 = Thread(target = func, args = ("Park", ))

t2 = Thread(target = func, args = ("Kim", ))

t1.start()

t2.start()

 

Output:

Hi:Park

Hi:Park

Hi:Kim

Hi:Kim

 

RLock 사용

스레드가 재귀적으로 리소스에 액세스하면 스레드가 동일한 잠금을 다시 획득하여 스레드가 차단될 수 있습니다. 따라서 Lock 잠금 방법은 재귀 함수 실행에 적합하지 않습니다. 이러한 문제를 처리하기 위해 재진입 잠금(RLock)이 선호됩니다.

재진입 잠금은 동일한 스레드가 여러 번 획득할 수 있는 동기화 프리미티브입니다.

기본 잠금에서 사용되는 잠금 또는 잠금 해제 상태 외에 스레드 및 재귀 수준을 소유한다는 개념을 따릅니다.

잠금 상태의 경우 일부 스레드가 잠금을 소유하는 반면 잠금 해제 상태의 경우 잠금을 소유하는 스레드가 없습니다.

스레드는 잠금을 수행하기 위해 acquire() 메서드를 호출하고 반환합니다.

스레드는 잠금을 해제하기 위해 release() 메서드를 호출합니다.

 

from threading import *

 

lock = RLock()

 

def fact(n):

    lock.acquire() 

    if n == 0:

        opt = 1

    else:

        opt = n * fact(n-1)

    lock.release()

    return opt

 

def opt(n):

    print("Factorial", n, ":", fact(n))

 

t1 = Thread(target = opt, args = (3, ))

t2 = Thread(target = opt, args = (5, ))

t1.start()

t2.start()

 

Output:

Factorial 3 : 6

Factorial 5 : 120

 

다음 표는 LockRlock의 차이를 보여줍니다.

 

Lock Rlock
- 메인 스레드를 포함하여 한 번에 하나의 스레드만 획득할 수 있습니다.
 
- 재귀 및 중첩 함수에서는 선호되지 않습니다.
 
- 객체의 잠금 및 잠금 해제만 담당합니다. 메인 쓰레드와 재귀 수준을 고려하지 않습니다.
- 한 번에 하나의 스레드만 획득할 수 있지만 메인 스레드는 여러 번 획득할 수 있습니다.
 
- 재귀 및 중첩 함수에 가장 적합합니다.
 
 
- 잠금, 잠금 해제, 메인 스레드 및 재귀 수준도 담당합니다.
 

 

세마포어 사용

세마포어는 공유 리소스의 액세스를 제한하는 데 선호됩니다.

세마포어는 모든 acquire() 호출에 의해 감소되고 모든 release() 호출에 의해 증가되는 내부 카운터를 처리합니다. 카운터는 0보다 작을 수 없습니다. 카운터는 동시에 액세스할 수 있는 최대 스레드 수를 나타냅니다. 기본값은 1입니다.

 

기본 구문은 다음과 같습니다.

(세마포어 객체 생성) = Semaphore(counter)

 

사용 예)

s = Semaphore()

여기에서 카운터 값은 1이고 한 번에 하나의 스레드에만 액세스가 허용됩니다.

s = Semaphore(3)

여기서 세마포어 객체는 세 개의 스레드에서 동시에 액세스할 수 있습니다. 나머지 스레드는 세마포어가 해제될 때까지 기다려야 합니다.

 

다음 스크립트는 세마포어의 카운터를 1로 설정하고 수행한 예제입니다. 카운터가 1이므로 한번에 하나의 스레드에만 액세스 할 수 있어서 순차적으로 출력됨을 보여주고 있습니다.

 

from threading import *

import time

 

s = Semaphore(1)

 

def func(n): 

    s.acquire() 

    for i in range(2):

        print("Hi:", end='')

        time.sleep(2)

        print(n)

    s.release()

 

t1 = Thread(target = func, args = ("Park", ))

t2 = Thread(target = func, args = ("Kim", ))

t1.start()

t2.start()

 

Output:

Hi:Park

Hi:Park

Hi:Kim

Hi:Kim

 

다음 스크립트는 세마포어의 카운터를 2로 설정하고 수행한 예제입니다. 두개의 스레드에 동시에 접근하므로 불규칙하게 출력됩니다.

 

from threading import *

import time

 

s = Semaphore(2)

 

def func(n): 

    s.acquire() 

    for i in range(2):

        print("Hi:", end='')

        time.sleep(2)

        print(n)

    s.release()

 

t1 = Thread(target = func, args = ("Park", ))

t2 = Thread(target = func, args = ("Kim", ))

t1.start()

t2.start()

 

Output:

Hi:Hi:KimPark

Hi:

Hi:Park

Kim

반응형
반응형

NETD(Noise Equivalent Temperature Difference)

 

열화상 카메라의 기술적인 세부 사항을 보면 "NETD"라는 표현을 접할 수 있습니다이 표현은 "Noise Equivalent Temperature Difference" 의 약자입니다이것은 열화상 감지기가 이미지에서 열 복사의 아주 작은 차이를 얼마나 잘 구별할 수 있는지에 대한 척도입니다

 

NETD는 일반적으로 밀리 켈빈(mK)으로 표시됩니다때로는 "열 대비"라고도 합니다노이즈가 측정 가능한 가장 작은 온도 차이와 같을 때 감지기는 유용한 열 신호를 분석할 수 있는 능력의 한계에 도달한 것입니다노이즈가 많을수록 검출기의 NETD 값이 높아집니다.

 

비냉각식열화상 카메라의 일반적인 값은 45mK 정도입니다광자 기반 극저온 냉각 카메라 는 약 18mK NETD 값을 얻을 수 있습니다노이즈 측정 값은 측정에 영향을 미치므로 특정 물체 온도에서 지정해야 합니다

 

: NETD @ 30C: 60mK

 

NETD 측정 방법

검출기의 노이즈 등가 온도차를 측정하기 위해서는 카메라가 온도가 조절되는 흑체를 향해야 합니다측정을 시작하기 전에 흑체가 안정화되어야 합니다그런 다음 특정 온도에서 노이즈 등가 온도 차이를 측정합니다이것은 단일 스냅샷 측정이 아니라 노이즈의 시간적 측정입니다. NETD 값은 mK로 변환된 히스토그램(STDEV)의 표준 편차입니다.

 

NETD가 측정에 미치는 영향

아래 이미지는 두 대의 다른 카메라로 촬영한 동일한 장면을 보여줍니다한 카메라의 NETD 60mK이고 두 번째 카메라의 값은 80mK입니다온도가 매우 낮은 이미지 영역은 80mK 카메라로 촬영한 이미지에서 훨씬 더 많은 노이즈를 보여줍니다. 20mK 차이는 별로 없어 보이지만 이미지 품질과 측정 정확도에 큰 영향을 미칠 가능성이 있습니다.

 

 

NETD에 영향을 줄 수 있는 몇 가지 요인이 있습니다

열화상 카메라는 때때로 하나 이상의 보정된 온도 측정 범위와 함께 제공됩니다

 

1.  노이즈 측정값은 선택한 범위와 물체 온도에 따라 달라질 수 있습니다이미지에 상당한 열 대비가 있고 관심 온도가 배경 온도보다 훨씬 높으면 측정 정확도에 큰 영향을 미치지 않습니다

 

2.  NETD값을 비교할 때는 동일한 검출기 해상도와 프레임 속도에 대해 비교하는 것이 중요합니다. 검출기 해상도와 프레임 속도에 따라 검출기가 적외선을 누적하는 량이 달라지면 노이즈도 달라지기 때문입니다.

 

3.  광학 조리개(f-stop)의 값은 NETD에 제곱근만큼 영향을 줍니다. 가시광선 이미징에서는 광학 조리개 또는 F-stop이 렌즈에 의해 수집되는 빛의 양에 해당합니다. 열화상에서는 대부분 0.8에서 1.6사이의 F-number로 표시됩니다. 검출기 단독의 경우 NETD는 일반적으로 F/1로 제공됩니다. 모듈이나 카메라의 경우 NETDF-number에 의존합니다.

 

NETD = NETD 검출기 x (F-number 의 제곱)

 

예를 들어 NETD50mK @F/1 검출기의 경우

F/1.2이면 NETD 72mK

F/0.8이면 NETD32mK

 

4.  노이즈 수준은 감지기 또는 카메라 온도의 영향도 받을 수 있습니다카메라가 높은 주변 온도에 노출되면 시스템 노이즈가 증가할 수 있습니다이는 카메라가 내부적으로 얼마나 잘 안정화되었는지에 달려 있습니다이 내부 온도 드리프트의 영향은 불균일 보정 또는 NUC 사이에서 관찰될 수 있습니다

반응형
반응형

멀티태스킹은 여러 작업을 동시에 실행하는 것입니다.

 

멀티태스킹 유형은 다음과 같습니다.

 

1.    프로세스 기반 멀티태스킹:

모든 작업이 단일 프로세서에서 실행되는 동시에 여러 작업을 실행하는 것이 프로세스 기반 멀티태스킹입니다. 예를 들어, 이력서를 입력하고, 인터넷을 통해 영화를 다운로드하고, 같은 컴퓨터에서 동시에 노래를 들을 수 있습니다. 이것은 작업을 동시에 독립적으로 실행하는 예입니다. OS 레벨에 가장 적합합니다.

 

2.    스레드 기반 멀티태스킹:

모든 작업이 동일한 프로그램의 개별 부분인 시간에 다양한 작업을 실행하는 것을 스레드 기반 멀티태스킹이라고 하고 모든 개별 부분을 스레드라고 합니다. 프로그래밍 수준에서 가장 적합합니다.

 

여러 개의 독립적인 작업을 동시에 실행해야 하는 경우 멀티스레딩이 선호됩니다. 스레드 배포에 선호되는 Python에서 지원하는 "threading"이라는 내장 모듈이 있습니다. 모든 Python 프로그램에서 사용할 수 있는 메인 스레드가 있습니다. 프로그래밍 수준에서 가장 적합합니다.

 

다음 스크립트는 현재 처리중인 스레드의 이름을 출력하는 예제입니다.

 

import threading

print("Current Executing Thread:", threading.current_thread().getName())

 

Output:

Current Executing Thread: MainThread

 

스레드를 생성하는 방법

1.  클래스를 사용하지 않고 스레드 생성

프로그램에서 여러 스레드를 사용할 경우 실행 순서를 예측할 수 없으므로 다중 스레드 프로그램의 정확한 출력을 예측할 수 없습니다. 따라서 동일한 프로그램에 대해 정확한 출력을 제공할 수 없습니다.

 

from threading import *

 

def func():

  for i in range(1, 5):

    print("Child Thread Part")

 

t = Thread(target = func)

t.start()

 

for i in range(1, 5):

  print("Main Thread Part")

 

Output:

Child Thread PartMain Thread Part

Main Thread Part

Main Thread Part

Main Thread Part

 

Child Thread Part

Child Thread Part

Child Thread Part

 

2.  스레드 클래스를 확장하여 스레드 생성

스레드 클래스에 대한 자식 클래스를 만들어야 합니다. 자식 클래스에서 run() 메서드는 필요한 작업을 재정의해야 합니다. start() 메서드를 호출하면 run() 메서드가 자동으로 실행되고 필요한 작업을 수행합니다.

 

from threading import *

 

class user_class(Thread):       # Thread 클래스 상속

  def run(self):

    for i in range(1, 5):

      print("Child Thread Part")

 

t = user_class()

t.start()

 

for i in range(1, 5):

  print("Main Thread Part")

 

Output:

Child Thread PartMain Thread Part

Main Thread Part

Main Thread Part

Main Thread Part

 

Child Thread Part

Child Thread Part

Child Thread Part

 

3.  스레드 클래스로 확장하지 않고 스레드 생성

 

from threading import *

 

class user_class:

  def func(self):

    for i in range(1, 5):

      print("Child Thread Part")

 

a = user_class()

t = Thread(target = a.func)

t.start()

 

for i in range(1, 5):

  print("Main Thread Part")

 

Output:

Child Thread PartMain Thread Part

Main Thread Part

Main Thread Part

Main Thread Part

 

Child Thread Part

Child Thread Part

Child Thread Part

 

다음 스크립트는 멀티 스레딩 없이 두 함수를 호출해서 결과를 출력하고 시간을 측정한 예제입니다.

 

from threading import *

import time

 

def func1(n):

  for i in n:

    time.sleep(1)

    print("Double:", 2*i)

 

def func2(n):

  for i in n:

    time.sleep(1)

    print("Square:", i*i)

 

n = [2, 4]

begin_time = time.time()

func1(n)

func2(n)

print("Total time:", time.time()-begin_time)

 

Output:

Double: 4

Double: 8

Square: 4

Square: 16

Total time: 4.006982088088989

 

다음 스크립트는 멀티 스레딩을 사용하여 두 함수를 호출해서 결과를 출력하고 시간을 측정한 예제입니다.

 

from threading import *

import time

 

def func1(n):

  for i in n:

    time.sleep(1)

    print("Double:", 2*i)

 

def func2(n):

  for i in n:

    time.sleep(1)

    print("Square:", i*i)

 

n = [2, 4]

begin_time = time.time()

t1 = Thread(target = func1, args = (n,))

t2 = Thread(target = func2, args = (n,))

t1.start()

t2.start()

t1.join()

t2.join()

print("Total time:", time.time()-begin_time)

 

Output:

Double: 4

Square: 4

Double: Square: 16

8

Total time: 2.0042953491210938

 

스레드 이름 설정 및 가져오기

Python에서 모든 스레드에는 이름이 있습니다. 이름은 PVM(Parallel Virtual Machine)에 의해 생성된 기본 이름이거나 프로그래머가 할당한 사용자 정의 이름일 수 있습니다. 스레드 이름을 가져오고 설정하는 데 다음 방법이 사용됩니다.

 

t.getName(): 스레드의 이름이 반환됩니다.

t.setName(): 사용자 정의 이름이 설정됩니다.

 

다음 스크립트는 스레드 이름을 출력하고 설정하는 예제입니다.

from threading import *

 

print(current_thread().getName())

current_thread().setName("UserName")

print(current_thread().getName())

print(current_thread().name)

 

Output:

MainThread

UserName

UserName

 

스레드 식별 번호

고유 식별 번호는 Python에서 제공합니다. 이 식별 번호는 암시적 변수 "ident"로 액세스할 수 있습니다.

 

from threading import *

 

def func():

  print("Child Thread Part\n")

 

t = Thread(target = func)

t.start()

print("Main Thread Identification Number:", current_thread().ident)

print("Child Thread Identification Number:", t.ident)

 

Output:

Child Thread Part

Main Thread Identification Number: 139818129758080

Child Thread Identification Number: 139817633142528

 

Active_count() 함수

현재 실행 중인 활성 스레드 수를 반환합니다.

 

from threading import *

import time

 

def func():

  print(current_thread().getName(), "    start")

  time.sleep(3)

  print(current_thread().getName(), "    end")

  print("Active Thread:", active_count())

 

t1 = Thread(target = func, name = "ChildThread-1")

t2 = Thread(target = func, name = "ChildThread-2")

t1.start()

t2.start()

print("Active Thread:", active_count())

time.sleep(5)

print("Active Thread:", active_count())

 

Output:

ChildThread-1ChildThread-2     start

Active Thread: 12

     start

ChildThread-2     end

Active Thread: 12

ChildThread-1     end

Active Thread: 11

Active Thread: 10

 

열거 기능

현재 실행 중인 모든 활성 스레드 목록을 생성합니다. 종료된 스레드나 아직 시작되지 않은 스레드는 포함되지 않습니다.

 

from threading import *

import time

 

def func():

  print(current_thread().getName(), "--> started")

  time.sleep(3)

  print(current_thread().getName(), "--> ended")

 

t1 = Thread(target = func, name = "ChildThread-1")

t2 = Thread(target = func, name = "ChildThread-2")

t1.start()

t2.start()

 

el = enumerate()

for e in el:

  print("Thread Name:", e.name)

 

time.sleep(5)

 

el = enumerate()

for e in el:

  print("Thread Name:", e.name)

 

Output:

ChildThread-1 --> started

ChildThread-2 --> started

Thread Name: UserName

Thread Name: Thread-2

Thread Name: Thread-3

Thread Name: Thread-1

Thread Name: pydevd.Writer

Thread Name: pydevd.Reader

Thread Name: pydevd.CommandThread

Thread Name: Thread-9

Thread Name: pydevd.CheckAliveThread

Thread Name: _colab_inspector_thread

Thread Name: ChildThread-1

Thread Name: ChildThread-2

ChildThread-1 --> endedChildThread-2

 --> ended

Thread Name: UserName

Thread Name: Thread-2

Thread Name: Thread-3

Thread Name: Thread-1

Thread Name: pydevd.Writer

Thread Name: pydevd.Reader

Thread Name: pydevd.CommandThread

Thread Name: Thread-9

Thread Name: pydevd.CheckAliveThread

Thread Name: _colab_inspector_thread

 

IsAlive() 메서드

스레드 객체를 사용하여 지정된 스레드가 현재 실행 중인지 여부를 확인합니다. 스레드가 살아 있으면 True, 그렇지 않으면 False를 반환합니다.

 

from threading import *

import time

 

def func():

  print(current_thread().getName(), "--> started")

  time.sleep(3)

  print(current_thread().getName(), "--> ended")

 

t1 = Thread(target = func, name = "ChildThread-1")

t2 = Thread(target = func, name = "ChildThread-2")

t1.start()

t2.start()

 

print(t1.name, "isAlive :", t1.isAlive())

print(t2.name, "isAlive :", t1.isAlive())

time.sleep(5)

print(t1.name, "isAlive :", t1.isAlive())

print(t2.name, "isAlive :", t1.isAlive())

 

Output:

ChildThread-1 --> started

ChildThread-2 --> started

ChildThread-1 isAlive : True

ChildThread-2 isAlive : True

ChildThread-1 --> ended

ChildThread-2 --> ended

ChildThread-1 isAlive : False

ChildThread-2 isAlive : False

 

Join() 메서드

스레드가 다른 스레드가 완료될 때까지 기다리려면 join() 메서드가 사용됩니다.

join() 메서드를 호출하면 주 스레드 객체가 종료될 때까지 호출 스레드가 차단됩니다. 스레드 개체는 다음 경우 중 하나에서 종료됩니다.

 

정상 종료

처리되지 않은 예외

선택적 타임아웃까지

 

따라서 join() 메서드는 메인 스레드 객체가 종료될 때까지 대기 상태를 보여줍니다. 시간 제한 값은 조인 방법과 관련하여 지정할 수도 있습니다. 몇 번이든 호출할 수 있습니다.

 

다음 스크립트는 메인 스레드가 자식 스레드 실행을 완료할 때까지 기다리는 예제입니다. 자식 스레드가 모두 수행될 때까지 기다렸다가 메인 스레드를 실행하였습니다.

 

from threading import *

import time

 

def func():

  for i in range(5):

    print("Child thread")

    time.sleep(2)

 

t1 = Thread(target = func)

t1.start()

t1.join()

 

for i in range(3):

  print("Main thread")

 

Output:

Child thread

Child thread

Child thread

Child thread

Child thread

Main thread

Main thread

Main thread

 

다음 스크립트는 메인 쓰레드가 join() 메소드에서 주어진 시간만큼 기다리는 예제입니다.

 

from threading import *

import time

 

def func():

  for i in range(5):

    print("Child thread")

    time.sleep(2)

 

t1 = Thread(target = func)

t1.start()

t1.join(5)

 

for i in range(3):

  print("Main thread")

 

Output:

Child thread

Child thread

Child thread

Main thread

Main thread

Main thread

 

데몬 스레드

데몬 스레드는 백그라운드에서 실행되는 스레드입니다. 기본적으로 GC(가비지 수집기)와 같은 데몬이 아닌 스레드에 대한 지원을 제공합니다. 메인 스레드가 메모리 부족에 직면하면 PVM은 즉시 가비지 수집기를 실행하여 쓸모 없는 개체를 제거하고 여유 메모리를 제공하므로 메인 스레드가 메모리 문제에 직면하지 않고 처리를 계속합니다.

 

스레드가 데몬 스레드인지 확인하려면 t.isDaemon()을 사용하면 됩니다.

 

from threading import *

 

print(current_thread().isDaemon())

print(current_thread().daemon)

 

반응형
반응형

IR 검출기(Detector)

 

적외선 분류에 따라 주요 활용처가 달라집니다. 다음 표는 적외선 분류에 따른 주요 활용처를 나타냅니다.

용어 파장 활용처
VLWIR(극원적외선) 15~1000um 우주 관찰
LWIR(원적외선) 8~14um 조준경, 보안감시, 산불감시
MWIR(중적외선) 3~5um 항공, 감시, 정찰, 유도무기, 인공위선
SWIR(단적외선) 1~3um 근거리 관측, 레이저 감시
NIR(근적외선) 0.8 ~ 1um 저가 열상

 

 

IR 검출기는 빛이 없는 어두운 상태에서도 물체에서 방출되는 적외선을 탐지하여 적외선의 양을 영상으로 표출해 줍니다.

 

IR 검출기는 적외선 에너지를 전기 신호로 변환하는 변환기 역할을 합니다. 이 변환의 품질은 열화상 시스템의 성능을 크게 결정합니다.

 

IR 검출기는 광자 검출기와 열형 검출기의 두 그룹으로 나눌 수 있습니다.

광자(또는 양자) 검출기에서 단일 단계 변환은 IR 방사선에서 광자를 흡수할 때 검출기 요소의 자유 전하 캐리어의 농도 또는 이동도를 변화시킵니다. 입사 방사선이 비평형 전하 캐리어를 생성하면 검출기 소자의 전기 저항이 변경되거나 추가 광전류가 생성됩니다.

이 검출기는 극도로 민감하므로 냉각이 필요합니다.

 

열형 검출기는 입사된 방사선을 흡수하여 재료의 온도 변화에 의해 발생되는 검출소자의 전기적 특성(기전력, 저항, 전하 등)을 측정하는 방법입니다.

 

다음 표는 적외선 검출기 비교를 보여주고 있습니다.

항목 열형 검출기 양자형 검출기
구동방법 비냉각 방식 냉각기 필요
감지방법 온도변화에 의해 발생되는 검출소자의 전기적 특성(저항, 저항)을 측정 입사된 적외선 에너지의 강도에 따라 발생되는 전하 캐리어의 농도에 의한 전기적 특성(기전력, 전도도)으로 측정
재료 Si, Vox MCT(HgCdTe), InSb
탐지성능 양자형에 비해 떨어짐 고성능 구현 가능
동작 온도 상온(300K) 80K(-193) 근처에서 동작
종류 Bolometer, Pyroelectric Photoconductive, Photovoltaic
단가 저가 고가
이용분야 민수용, 휴대용 군수용, 군사무기탐지

 

 

IR 검출기는 파장이 7~14μm인 적외선 복사에 민감한 작은 열 감지 센서 어레이입니다각 어레이 요소의 치수는 약 17 x 17µm(0.025 x 0.025mm)입니다적외선 에너지가 개별 볼로미터 요소에 부딪치면 요소의 온도가 상승하고 전기 저항이 변경됩니다이 저항 변화를 측정한 다음 열화상으로 그래픽으로 나타낼 수 있는 온도 값으로 처리합니다.

 

다음 그림은 열화상 카메라의 마이크로 볼로미터 감지기의 단일 픽셀을 보여줍니다픽셀은 기판에서 분리되고 아래에서 집적 회로(ROIC)를 판독하는 두 개의 다리가 있는 테이블 모양입니다. "테이블" VOx와 같은 전기 전도성 재료로 만들어지며 기본 전자 장치와 함께 완전한 회로를 형성합니다. 입사 LWIR 에너지가 "탁상"에 부딪치면 재료의 전기 저항이 변경됩니다. 더 많은 입사 방사선은 저항의 더 큰 변화를 일으킵니다. 이 저항 변화는 장치에 전류를 통과시켜 조사할 수 있습니다. 따라서 온도 변화를 전자 신호로 읽어 이미지를 생성하는 데 사용할 수 있습니다. 픽셀 디자인이 복잡해지는 이유 중 하나는 "다리"가 픽셀을 열적으로 격리(응답을 생성하기 위해)하고 전기를 전도해야(응답을 조사할 수 있도록)하기 때문입니다.

 

 

마이크로볼로미터 센서는 MEMS(Micro-Electro-Mechanical System) 공정을 사용하여 제조되며, 일반적으로 특수 VOx 처리 기능을 갖춘 맞춤형 주조 공장에서 사용됩니다. 먼저 맞춤형 ROIC 웨이퍼가 제조됩니다. 여기에는 열 유도 저항 변화를 해석하는 데 필요한 복잡한 회로가 포함됩니다. 그런 다음 픽셀 어레이가 이 웨이퍼에 증착됩니다. 일반적인 픽셀 디자인은 상당히 복잡하며 기본 CMOS 레이어가 포함될 때 30개 이상의 마스크 레이어가 필요할 수 있습니다. 픽셀 어레이가 증착되면 웨이퍼는 개별 다이로 절단되어 완성된 마이크로볼로미터 센서를 생성하기 위해 진공 포장됩니다. 그런 다음 센서는 제어 및 처리 전자 장치에 통합되고 LWIR 광학 장치도 부착됩니다. 전체 엔진은 주변 온도에 대한 성능을 위해 보정되고 판매 준비가 완료됩니다.

반응형

+ Recent posts