본문 바로가기

전자공학을 즐겁게/누구나 취미전자공학

커패시턴스(Capacitance)로 만드는 지연(delay)

728x90
반응형

아날로그량을 LOW와 HIGH, 두 전압만으로 나타내는 PWM에 대하여 이야기했을 때, LED의 밝기를 시차를 두고 변화시키는 동작을 해 본 적도 있습니다. 이 때는 LED를 각각의 GPIO에 의해서 개별 제어한 것으로 소프트웨어에 의해서 밝기 조절의 시차를 만들 것이었습니다. PWM이 아니라 아날로그 전압으로써 이 동작을 만들어 볼 수 있을까요?

커패시터(Capacitor)는 충방전에 의하여 전압이 올라가는 시간 또는 떨어지는 시간을 달리 할 수 있습니다. 전압의 변화에 시차를 줄 수 있는 것입니다.  

단도직입으로 실험에 사용할 회로부터 살펴볼까요?

그냥 이번에 실험해 볼 회로입니다.

회로도에 3개의 LED 회로가 있습니다. R4와 C1//C2, R5와 C3, R6와 C4-C5를 빼고 보면, N-Channel MOSFET을 스위치로 사용한 3개의 LED 점등 회로입니다. 이것들만 없으면, MOSFET의 게이트(Gate) 전압을 인가하는 GPIO2에 의해서 3개의 LED가 켜지기도 하고 꺼지기도 하겠죠. 이것 자체에 대한 것은 "스위치로서의 MOSFET"을 참조하세요. 

R4와 C1//C2, R5와 C3, R6와 C4-C5의 저항과 커패시터를 MOSFET 스위치 회로에 추가하여 전압 변화에 제연을 만드는 시도를 해 본 것입니다.

 

더 설명을 이어가기 전에 이 실험에 사용한 커패시터에 대해서 잠시 이야기하고 넘어가겠습니다. 여기에서 사용한 커패시터는 $1000uF$ 용량의 커패시터로 용량이 좀 큰 편입니다. 이렇게 큰 용량은 전해 커패시터(Electrolytic Capacitor)를 사용하게 됩니다. 전해 커패시터는 극성을 가지고 있고, 대체로 큰 용량의 커패시턴스를 제공함으로써 전원 안정화와 같은 용도로 많이 사용이 됩니다.

이 실험에서 사용한 전해 커패시터(Electrolytic Capacitor)입니다.

전해 커패시터의 용량은 주로 케이스 표면에 명시적으로 기재되어 있습니다. 사진에서 보면 $1000uF$이라고 용량이 기재되어 있지요? 그리고, 그 위에 $6.3V$라고 기재된 것은 커패시터의 내압(rating voltage)이라고 부르는 것으로 커패시터 양단의 전압이 이 범위를 넘어서는 안 된다는 의미입니다. 이 전압을 넘으면 어떤 일이 벌어지냐구요? 커패시터가 뻥~하고 폭발할 수도 있습니다. 주의하세요. 그래서 보통 사용하려는 전압보다 여유를 가지고 내압을 선택하게 됩니다. 저와 같은 경우에는 아주 여유 있게 사용하고자 하는 전압의 2배 정도 되는 내압을 선택하는 경우가 많았습니다. 안전하게 사용하려는 전압이 내압의 70% 정도는 넘지 않게 하는 것이 좋겠습니다. 

전해 커패시터의 극성(polarity)은 스루홀(through-hole) 형태의 커패시터의 경우 단자(Lead)의 길이로부터 알 수 있습니다. 긴 단자가 +로 전압이 높은 쪽이 됩니다. 만약 누군가 단자를 잘라서 길이를 똑같이 만들었다면 커패시터 케이스에 있는 표시를 보면 -쪽 단자에 표시가 되어 있습니다. 이것은 스루홀 형태의 커패시터에 해당하는 것이고, 표면실장형인 경우에는 +쪽에 선으로 표시하는 경우가 많습니다. 

 

다시 실험을 위한 회로도로 돌아가겠습니다. 회로도에는 $1000uF$ 용량의 커패시터 5개가 사용이 되었습니다. 왜 $1000uF$을 사용했냐면요, 좀 큰 용량이 필요한데, 아저씨가 가지고 있는 용량이 $1000uF$ 밖에 없어서 어쩔 수가 없이 이 용량을 사용하게 되었습니다.

C1과 C2는 병렬로 연결이 되어 있고, C4와 C5는 직렬로 연결이 되어 있습니다. 이러한 경우 커패시터들의 합성 용량을 구하게 되는데, 여기에서는 자세히는 다루지 않겠습니다. 다만, 같은 용량의 커패시터 2개를 병렬 연결하면 용량이 2배, 직렬 연결하면 용량이 절반이 된다고 알아 두세요. 즉, C1//C2는 $2000uF$, C4-C5는 $500uF$이 됩니다. 결과적으로 각 점등 회로에 연결된 커패시턴스는 $2000uF$, $1000uF$, $500uF$가 되고, 이 커패시턴스의 차이에 따른 동작의 차이를 살펴볼 것입니다.

 

먼저 GPIO의 전압이 HIGH가 되어 MOSFET을 ON 시킨 경우부터 생각해 봅시다. 수식은 사용하지 않을 거예요. 직관적으로 바라보겠습니다. 정확한 수식 계산은 나중에 천천히 해 봐도 돼요. MOSFET Q1, Q2, Q3는 ON 되어서 드레인 전류 $I_D$는 흐르고 $V_{DS}$는 0V에 가까워집니다. 그러면, 커패시터들은 R4, R5, R6를 통하여 그라운드로 충전해 두었던 전하를 방전을 합니다. 시간을 충분히 길게 가져간다면 커패시터는 모두 방전이 되어서 전압이 충분히 떨어지게 되겠죠. 이때, GPIO의 전압을 LOW로 만들어 MOSFET을 모두 OFF 시킵니다. 이전 포스트 "스위치로서의 MOSFET", "아날로그의 표현 PWM"에서와 같다면 흐르던 전류는 바로 0이 되어 LED는 바로 꺼져 버렸을 것입니다. 그런데, 이번 회로처럼 커패시터를 추가한 경우, MOSFET에 OFF 되더라도 바로 직후에는 커패시터의 전압은 방전된 상태인 0V 가깝게 유지를 합니다. 커패시터 양쪽 전압은 갑자기 변할 수 없다고 했잖아요. 그러면 이번엔 반대로 커패시터 쪽으로 R4, R5, R6를 통해서 전류가 흐르고 커패시터를 충전하게 됩니다. 커패시터의 전압은 충전이 됨에 따라 서서히 올라가겠죠. 언제까지? 전압차가 발생하지 않아서 전류가 흐르지 않을 때까지겠죠. 그런데, 각 커패시터는 용량차이가 있으니까 큰 커패시터는 충전하는 데에 더 시간이 걸리게 되겠지요? 용량이 2 배면 충전하는 시간도 2배가 걸립니다. $C=\frac{Q}{v_C}$니까, $v_C=\frac{Q}{C}$로 다시 쓸 수 있겠죠? 이 수식은 "커패시터(Capacitor)에 대하여"에서도 잠시 언급했었습니다. 주입하는 전하량은 동일하다면 커패시턴스 C가 커지면 커패시터 양쪽의 전압은 더 낮게 됩니다. 충전에 시간이 더 오래 걸린다는 얘기는 LED에 흐르는 전류가 더 천천히 줄어들면서 더 오래 흐르게 된다는 의미고, LED에 전류가 흐른다는 것은 LED가 켜진다는 의미죠. 전류가 흐르지 않을 때까지, 그러나 서서히 전류량이 줄면서 어두워지고 결국에는 꺼진다는 이야기입니다. 마침내 가장 큰 커패시턴스를 충천시켜야 하는 놈이 가장 마지막에 꺼지겠죠.

말로 하니까 너무 복잡한가요? 그러면 이 회로도를 시뮬레이션 모델로 다시 그려서 전압과 전류의 변화를 살펴보겠습니다. 

QUCS에서 시뮬레이션 하기 위한 회로도입니다.

동일한 회로입니다. 다만, GPIO에 의하여 제어하는 전압을 V_TRIG로, 커패시터는 각각의 합성용량 $2000uF$, $1000uF$, $500uF$으로 하였습니다. 각각의 LED에 흐르는 전류는 Pr1, Pr2, Pr3가 되고, 각 LED 캐소드(cathode)의 전압 또는 각 MOSFET 드레인의 전압을 V_D1, V_D2, V_D3, 각 커패시터의 전압은 V_C1, V_C2, V_C3로 표시하였습니다.

다음 시뮬레이션 결과를 살펴보세요. 

시뮬레이션 결과입니다. 파란색 굵은 선은 V_TRIG, 즉 On/Off 제어 전압입니다.

먼저 눈여겨볼 것은 각 커패시터의 전압 V_Cx의 차이입니다. 용량이 큰 커패시터의 충방전 시간이 더 오래 걸린다는 것을 알 수 있죠 - 첫 번째 결과 그래프. 다음은 각 LED 캐소드 전압 V_Dx입니다. 충전 시간의 차이는 보이지만, 방전 시간은 거의 같아 보입니다 - 두 번째 결과 그래프. V_Cx는 갑자기 변할 수 없지만, V_Dx는 MOSFET이 On 되면서 GND로 연결이 되면서 전류가 흐르기 때문입니다. 이 100Ω의 저항들은 V_Dx가 갑자기 떨어졌을 때, 전압차를 온전히 받아서 열로 바꾸면서 커패시터들이 방전할 수 있는 시간을 주고 있습니다. MOSFET이 Off 되면 GND로의 연결이 끊어지고 전류는 커패시터로만 흐르게 되기 때문에 충전 시간의 차이를 보이는 것이구요.

이 결고로서 LED들에 흐르는 전류는 서로 시간차를 가지고 감소하는 것을 볼 수가 있습니다 - 세 번째 결과 그래프. LED에 흐르는 전류량은 밝기와 관계가 있으므로 서로 시차를 가지고 어두워진다고 보면 되겠습니다. 

728x90

 

다시 실제 회로로 돌아와서 실험 회로를 빵판 위에 꾸며 보겠습니다. 

실험 회로를 브레드보드에 구성하였습니다.

회로를 실제로 구성할 때, 결선도를 보고 하기보다는 회로도를 보면서 하는 습관을 가지는 것이 좋아요.

 

이것을 라즈베리파이 GPIO로 On/Off 할 텐데요, 코드는 전에 쓰던 것을 그대로 고치지 않고 사용할 것입니다. GPIO2에 연결하든 GPIO3에 연결하든 상관은 없습니다. 저는 GPIO2에 연결을 하였습니다. 

전원은 외부 전원을, 제어 신호는 라즈베리파이의 GPIO2에서 연결합니다. GND는 전원과 라즈베리파이가 서로 연결되어야 한다는 것을 잊지 마세요.

코드는 전에 만들었던 것을 그대로 사용할 것입니다.

# Import required modules
import RPi.GPIO as GPIO # RPi.GPIO module to contol GPIOs
from enum import Enum   # import Enum class to inherit and use enumumerators

class POLARITY(Enum):
    '''
    Enumerators for LED polarity
    ACTIVE_HIGH means LED is on when the state of GPIO is high and vice versa.
    '''
    ACTIVE_HIGH = 1
    ACTIVE_LOW = 0

class LED:
    '''
    Class for LED On/Off control
    '''
    def __init__(self, gpio, polarity=POLARITY.ACTIVE_HIGH):
        '''
        Initialize self. Specify gpio and polarity.
        The polarity is ACTIVE_HIGH by default.
        '''
        self.gpio = gpio
        self.polarity = polarity
        GPIO.setup(self.gpio, GPIO.OUT)
        self.off()
    def on(self):
        '''
        Turn on the LED
        '''
        GPIO.output(self.gpio, GPIO.HIGH if self.polarity == POLARITY.ACTIVE_HIGH else GPIO.LOW)
    def off(self):
        '''
        Turn off the LED
        '''
        GPIO.output(self.gpio, GPIO.LOW if self.polarity == POLARITY.ACTIVE_HIGH else GPIO.HIGH)

if __name__ == '__main__':
    # import time module for sleep to delay
    # Used only here so imported in this block
    import time
    
    GPIO.setmode(GPIO.BCM) # Specify the GPIO numbering mode.

    # Configure 2 LEDs
    led1 = LED(2)
    led2 = LED(3)

    # State flag to toggle LEDs
    on = False

    try:
        while(True):
            if (on):
                led1.on()
                led2.off()
                on = False # Invert the state
            else:
                led1.off()
                led2.on()
                on = True # Invert the state
            
            # Time delay for 1 sec
            time.sleep(1)
    except KeyboardInterrupt: # Ctrl+C will bering us here.
        GPIO.cleanup()
        exit(0)

https://github.com/sangyoungn/play_with_RPi/tree/main/led_control

 

GitHub - sangyoungn/play_with_RPi: Example Codes for Raspberry Pi

Example Codes for Raspberry Pi. Contribute to sangyoungn/play_with_RPi development by creating an account on GitHub.

github.com

 

다만, 구할 수 있는 커패시터의 용량 탓에 정확하게 예쁘게 1초 지연에 맞출 수 없었으니, 2초 지연해서도 확인해 보는 것이 좋겠습니다. 

            # Time delay for 1 sec
            time.sleep(2) # time.sleep(1)

 

결과는 영상으로 확인할게요.

728x90
반응형