Languages

CommunityCategory: XMODEL가변 커패시터의 모델링

XMODEL

가변 커패시터의 모델링

SA Support Team Staff 2023-03-31

MEMS 커패시터와 같이 외부 입력(예를 들면, 가속도)에 따라서 커패시턴스 값이 바뀔 수 있는 가변커패시터를 모델링하고 싶습니다. 처음에는 'cap_sw' primitive을 사용해 커패시터 소자를 표현하고, 변화하는 커패시턴스 값을 'C' 입력에 인가해 모델링을 해보았습니다. 그러나, 이 모델은 커패시턴스 값(C)의 변화로 인해 발생하는 전류를 제대로 표현하지 못하는 것 같습니다. 다시 말해, 일반적으로 양단의 전압이 V인 가변 커패시터에 흐르는 전류 I는 아래와 같이 표현될 수 있는데,

I = d(C·V)/dt = C·dV/dt + V·dC/dt

제가 'cap_sw' primitive를 사용해 만든 모델은 첫번째 성분(C·dV/dt)은 잘 표현하지만, 두번째 성분(V·dC/dt)은 포함하지 않네요. XMODEL에서는 어떻게 가변 커패시터를 모델링해야 하나요?

1 Answers
SA Support Team Staff 2023-03-31

관찰하신 바와 같이, 'cap_sw' primitive는 커패시턴스 값의 변화로 인해 발생하는 전류를 표현하지 못합니다. 이 'cap_sw' primitive는 디지털 입력에 위해 커패시턴스 값이 조절되는 경우처럼, 커패시턴스 값이 불연속적인 값 사이에서 스위칭하는 커패시터 소자를 모델링하기에 적합합니다. 하지만, 이 primitive는 커패시턴스 값이 연속적으로 변화할때의 효과들은 모델링하지 않기에 말씀하신 MEMS 커패시터를 모델링하기에는 부적합한 면이 있습니다.
현재 XMODEL에는 커패시턴스 값이 연속적으로 변할 수 있는 가변 커패시터를 모델링하기 위한 primitive는 없습니다만, 기존의 primitive들을 활용해 그와 동등한 동작을 모델링할 수 있습니다. 예를 들어, 'cap_sw''res_sw' primitive들의 병렬조합으로 가변 커패시터 소자를 모델링해서, 'cap_sw' primitive로는 설명해주신 전류식의 첫번째 성분(C·dV/dt)을 표현하고, 'res_sw' primitive로는 그 저항값이 1/(dC/dt)이 되도록 모델링해서 전류식의 두번째 성분(V·dC/dt)을 표현하는 방법이 있겠습니다.

아래의 코드가 기술하는 'cap_tvar' module는 이러한 원리로 가변 커패시터를 모델링한 예를 보여줍니다. 앞서 설명드린 바와 같이, 기본적으로 'cap_sw''res_sw' primitive들의 병렬조합으로 가변 커패시터를 표현하고 있고, 이때 'cap_sw' primitive의 'C' 입력값은 가변 커패시터의 커패시턴스 C의 샘플된 값을, 'res_sw' primitive의 'R' 입력값은 1/(dC/dt)의 샘플된 값을 갖도록 모델이 작성되었습니다. 여기서 샘플된 값들을 사용하는 이유는 'cap_sw''res_sw' primitive들의 'C''R' 입력신호들이 'real' 타입 신호이기 때문에, 연속적으로 변하는 커패시턴스 값을 표현할때 너무 많은 이벤트가 발생하는 것을 막기 위함입니다. 이 예제에서는 우선 커패시턴스 C 신호의 값을 'period' 파라메터로 정의되는 주기로 주기적으로 샘플하고, 그 결과값으로부터 등가 커패시턴스 및 저항 값(모델에서는 각각 'C_eff' and 'R_eff' 값)들을 계산합니다. 그리고 그 계산된 값들이 'abstol''reltol' 파라메터로 정의되는 어떤 기준값 이상으로 변화할 때마다 그 값들을 'cap_sw''res_sw' primitive에 전달합니다.

이 모델의 동작을 확인하기 위해 세가지의 테스트벤치를 준비했습니다. 아래의 첫번째 테스트벤치('tb_cap_tvar_dV')는 설명드린 'cap_tvar' 모델의 커패시턴스 값은 1uF로 고정되어 있고, 양단의 전압은 진폭 0.1V, 오프셋 1V의 20MHz 정현파 형태로 변화할때의 전류 파형을 측정합니다. 참고로 'cap_tvar' 모델의 'period', 'abstol''reltol' 파라메터 값들은 각각 1ns, 0.01u, 0.01로 설정하였습니다. 이 테스트벤치는 커패시터 양단의 전압을 전압원으로 직접 구동하고 있기 때문에, 전류파형을 측정하려면 아주 작은 저항을 직렬로 연결해주어야 합니다. 이에 대한 자세한 설명은 이 링크에서 확인하시기 바랍니다.

아래의 시뮬레이션 파형은 이 모델이 예상대로 잘 동작함을 보여줍니다. 즉, 'cap_tvar' 모델에 흐르는 전류 파형은 설명해주신 전류식의 첫번째 성분인 C·dV/dt와 잘 일치함을 알 수 있습니다.

두번째 테스트벤치('tb_cap_tvar_dC')는 반대로 전압은 고정되어 있고, 커패시턴스 값만 변화할 때의 전류를 측정합니다. 즉, 전압은 1V의 고정값을 가지고, 커패시턴스 값이 0.1uF의 진폭, 1uF의 오프셋을 가진 10MHz의 정현파 형태로 변화하도록 구성했습니다.

이 경우에도 이 가변 커패시터 모델이 예상대로 잘 동작함을 시뮬레이션 파형을 통해 알 수 있습니다. 즉, 가변 커패시터 모델에 흐르는 전류 파형이 설명해주신 전류식의 두번째 성분인 V·dC/dt와 잘 일치합니다.

마지막으로 세번째 테스트벤치('tb_cap_tvar')는 전압과 커패시턴스 값이 모두 변화할때의 전류를 측정합니다. 즉, 양단의 전압은 진폭 0.1V, 오프셋 1V의 20MHz 정현파 형태로 변화하고, 커패시턴스 값은 0.1uF의 진폭, 1uF의 오프셋을 가진 10MHz의 정현파 형태로 변화하도록 구성했습니다.

아래의 시뮬레이션된 전류파형은 앞서 살펴본 두 가지 경우의 전류파형의 합과 같습니다. 다시 말해, 이 가변 커패시터 모델에 흐르는 전류는 두가지 전류 성분의 합, 즉, C·dV/dt +V·dC/dt을 잘 표현하고 있습니다.

첨부: cap_tvar_20230331.tar.gz

XMODEL

Modeling a variable capacitor

SA Support Team Staff 2023-03-31

I’d like to model a MEMS capacitor, of which capacitance can vary with an external input (e.g. acceleration). I first tried using the 'cap_sw' primitive, by feeding the capacitance value to its 'C' input. However, I found that it does not properly model the current due to the change in the capacitance (C). That is, the current (I) flowing through a variable capacitor with the voltage across its terminals equal to V should be:

I = d(C·V)/dt = C·dV/dt + V·dC/dt.

The current through the 'cap_sw' primitive includes the first term (C·dV/dt), but not the second term (V·dC/dt). How should I model a variable capacitor in XMODEL?

1 Answers
SA Support Team Staff 2023-03-31

관찰하신 바와 같이, 'cap_sw' primitive는 커패시턴스 값의 변화로 인해 발생하는 전류를 표현하지 못합니다. 이 'cap_sw' primitive는 디지털 입력에 위해 커패시턴스 값이 조절되는 경우처럼, 커패시턴스 값이 불연속적인 값 사이에서 스위칭하는 커패시터 소자를 모델링하기에 적합합니다. 하지만, 이 primitive는 커패시턴스 값이 연속적으로 변화할때의 효과들은 모델링하지 않기에 말씀하신 MEMS 커패시터를 모델링하기에는 부적합한 면이 있습니다.
현재 XMODEL에는 커패시턴스 값이 연속적으로 변할 수 있는 가변 커패시터를 모델링하기 위한 primitive는 없습니다만, 기존의 primitive들을 활용해 그와 동등한 동작을 모델링할 수 있습니다. 예를 들어, 'cap_sw''res_sw' primitive들의 병렬조합으로 가변 커패시터 소자를 모델링해서, 'cap_sw' primitive로는 설명해주신 전류식의 첫번째 성분(C·dV/dt)을 표현하고, 'res_sw' primitive로는 그 저항값이 1/(dC/dt)이 되도록 모델링해서 전류식의 두번째 성분(V·dC/dt)을 표현하는 방법이 있겠습니다.

아래의 코드가 기술하는 'cap_tvar' module는 이러한 원리로 가변 커패시터를 모델링한 예를 보여줍니다. 앞서 설명드린 바와 같이, 기본적으로 'cap_sw''res_sw' primitive들의 병렬조합으로 가변 커패시터를 표현하고 있고, 이때 'cap_sw' primitive의 'C' 입력값은 가변 커패시터의 커패시턴스 C의 샘플된 값을, 'res_sw' primitive의 'R' 입력값은 1/(dC/dt)의 샘플된 값을 갖도록 모델이 작성되었습니다. 여기서 샘플된 값들을 사용하는 이유는 'cap_sw''res_sw' primitive들의 'C''R' 입력신호들이 'real' 타입 신호이기 때문에, 연속적으로 변하는 커패시턴스 값을 표현할때 너무 많은 이벤트가 발생하는 것을 막기 위함입니다. 이 예제에서는 우선 커패시턴스 C 신호의 값을 'period' 파라메터로 정의되는 주기로 주기적으로 샘플하고, 그 결과값으로부터 등가 커패시턴스 및 저항 값(모델에서는 각각 'C_eff' and 'R_eff' 값)들을 계산합니다. 그리고 그 계산된 값들이 'abstol''reltol' 파라메터로 정의되는 어떤 기준값 이상으로 변화할 때마다 그 값들을 'cap_sw''res_sw' primitive에 전달합니다.

이 모델의 동작을 확인하기 위해 세가지의 테스트벤치를 준비했습니다. 아래의 첫번째 테스트벤치('tb_cap_tvar_dV')는 설명드린 'cap_tvar' 모델의 커패시턴스 값은 1uF로 고정되어 있고, 양단의 전압은 진폭 0.1V, 오프셋 1V의 20MHz 정현파 형태로 변화할때의 전류 파형을 측정합니다. 참고로 'cap_tvar' 모델의 'period', 'abstol''reltol' 파라메터 값들은 각각 1ns, 0.01u, 0.01로 설정하였습니다. 이 테스트벤치는 커패시터 양단의 전압을 전압원으로 직접 구동하고 있기 때문에, 전류파형을 측정하려면 아주 작은 저항을 직렬로 연결해주어야 합니다. 이에 대한 자세한 설명은 이 링크에서 확인하시기 바랍니다.

아래의 시뮬레이션 파형은 이 모델이 예상대로 잘 동작함을 보여줍니다. 즉, 'cap_tvar' 모델에 흐르는 전류 파형은 설명해주신 전류식의 첫번째 성분인 C·dV/dt와 잘 일치함을 알 수 있습니다.

두번째 테스트벤치('tb_cap_tvar_dC')는 반대로 전압은 고정되어 있고, 커패시턴스 값만 변화할 때의 전류를 측정합니다. 즉, 전압은 1V의 고정값을 가지고, 커패시턴스 값이 0.1uF의 진폭, 1uF의 오프셋을 가진 10MHz의 정현파 형태로 변화하도록 구성했습니다.

이 경우에도 이 가변 커패시터 모델이 예상대로 잘 동작함을 시뮬레이션 파형을 통해 알 수 있습니다. 즉, 가변 커패시터 모델에 흐르는 전류 파형이 설명해주신 전류식의 두번째 성분인 V·dC/dt와 잘 일치합니다.

마지막으로 세번째 테스트벤치('tb_cap_tvar')는 전압과 커패시턴스 값이 모두 변화할때의 전류를 측정합니다. 즉, 양단의 전압은 진폭 0.1V, 오프셋 1V의 20MHz 정현파 형태로 변화하고, 커패시턴스 값은 0.1uF의 진폭, 1uF의 오프셋을 가진 10MHz의 정현파 형태로 변화하도록 구성했습니다.

아래의 시뮬레이션된 전류파형은 앞서 살펴본 두 가지 경우의 전류파형의 합과 같습니다. 다시 말해, 이 가변 커패시터 모델에 흐르는 전류는 두가지 전류 성분의 합, 즉, C·dV/dt +V·dC/dt을 잘 표현하고 있습니다.

첨부: cap_tvar_20230331.tar.gz