Jump to content

    

PSpice модель конденсатора, емкость которого зависит от напряженяи на нем

Может кто подскажет, как покрасивее реализовать модель конденсатора, емкость которого изменяется по заранее известной формуле (нелинейный закон), в зависимости от приложенного напряжения к нему? В том числе и отрицательного напряжения. Интересует макромодель или subcst.

Share this post


Link to post
Share on other sites

Встроенной модели такого конденсатора в PSpice нет, но можно сделать, как вы уже написали макромодель (subckt). С помощью обычной емкости и зависимых источников. Сообщите зависимость c(v), которую необходимо реализовать.

Share this post


Link to post
Share on other sites
Может кто подскажет, как покрасивее реализовать модель конденсатора, емкость которого изменяется по заранее известной формуле (нелинейный закон), в зависимости от приложенного напряжения к нему? В том числе и отрицательного напряжения. Интересует макромодель или subcst.

 

Пользовался моделью диода, там есть возможность задать вольт-фарадную характеристику. При необходимости, используйте два встречно включенных элемента.

Share this post


Link to post
Share on other sites
Встроенной модели такого конденсатора в PSpice нет, но можно сделать, как вы уже написали макромодель (subckt). С помощью обычной емкости и зависимых источников. Сообщите зависимость c(v), которую необходимо реализовать.

if (x<3) { p1=0.000000000029209 p2=-0.000000000032376 p3=-0.000000000302083 p4=0.00000000155; p5=1; }

else if (x<9) { p1=-0.000000000001668 p2=0.000000000016579 p3=-0.000000000081081 p4=0.00000000105; p5=3; }

else if (x<13) { p1=0.00000000000823 p2=-0.000000000044843 p3=-0.000000000062311 p4=0.0000000008; p5=9; }

else if (x<20) { p1=-0.000000000000087 p2=0.000000000002389 p3=-0.000000000026007 p4=0.00000000036; p5=13; }

else if (x<50) { p1=0 p2=0.000000000000078 p3=-0.000000000005424 p4=0.000000000265; p5=20; }

 

x = x-p5;

y=p4+x*(p3+x*(p2+x*p1));

 

Ну это я так, для примера выложил. Емкости все разные, с разными формулами. Интересует вид (описание) модели, а уж в источник тока или напряжения (или еще какой :-)), т.е. куда надо - туда и впишу. Да, эта формула не описывает поведение емкости ниже 0 (отрицательные) и выше 50, т.е. это просто пример.

 

Пользовался моделью диода, там есть возможность задать вольт-фарадную характеристику. При необходимости, используйте два встречно включенных элемента.

 

По приведенной выше формуле вряд ли получиться воспользоваться таким способом... А еще и покруче будут варианты вычислений...

Share this post


Link to post
Share on other sites

Емкости и индуктивности, управляемые напряжением, можно моделировать в Orcad.

Share this post


Link to post
Share on other sites
Емкости и индуктивности, управляемые напряжением, можно моделировать в Orcad.

Так уж завелось, что пользуюсь микрокапом... В принципе поставить Оркад есть возможность, 16 вроде. А что там за модель такая? И любой закон изменения можно вписать?

Share this post


Link to post
Share on other sites

В библиотеке anl_misc.olb модели управляемых напряжением комплексного сопротивления и комплексной проводимости ZX и YX. Насколько сложную функцию сумеете заложить в источник управляющего напряжения, такой закон управления и будет.

Share this post


Link to post
Share on other sites

Либо я тормознул, либо уже путаю чего то - ведь в микрокапе емкость конденсатора можно любым выражением задавать??? т.е. вписывать туда просто свою формулу?

 

Только вот с условиями не умеет...

 

Вот упростил формулу, для более удобного переваривания:

 

if (V(C1)<3) 1.55E-09+(V(C1)-1)*(-3.02083E-10+(V(C1)-1)*(-3.2376E-11+(V(C1)-1)*2.9209E-11))

else if (V(C1)<9) 1.05E-09+(V(C1)-3)*(-8.1081E-11+(V(C1)-3)*(1.6579E-11+(V(C1)-3)*-1.668E-12))

else if (V(C1)<13) 8E-10+(V(C1)-9)*(-6.2311E-11+(V(C1)-9)*(-4.4843E-11+(V(C1)-9)*8.23E-12))

else if (V(C1)<20) 3.6E-10+(V(C1)-13)*(-2.6007E-11+(V(C1)-13)*(2.389E-12+(V(C1)-13)*-8.7E-14))

else if (V(C1)<50) 2.65E-10+(V(C1)-20)*(-5.424E-12+(V(C1)-20)*(7.8E-14+(V(C1)-20)*0))

 

где V(C1) - собственно напряжение на этом конденсаторе.

Share this post


Link to post
Share on other sites

Микрокапом пользуюсь редко и такой возможности не использовал.

Share this post


Link to post
Share on other sites
if (x<3) { p1=0.000000000029209 p2=-0.000000000032376 p3=-0.000000000302083 p4=0.00000000155; p5=1; }

else if (x<9) { p1=-0.000000000001668 p2=0.000000000016579 p3=-0.000000000081081 p4=0.00000000105; p5=3; }

else if (x<13) { p1=0.00000000000823 p2=-0.000000000044843 p3=-0.000000000062311 p4=0.0000000008; p5=9; }

else if (x<20) { p1=-0.000000000000087 p2=0.000000000002389 p3=-0.000000000026007 p4=0.00000000036; p5=13; }

else if (x<50) { p1=0 p2=0.000000000000078 p3=-0.000000000005424 p4=0.000000000265; p5=20; }

x = x-p5;

y=p4+x*(p3+x*(p2+x*p1));

 

Ну это я так, для примера выложил...

Что-то вот такое получилось, походу старался писать комментарии:...

.subckt Cnl pin1 pin2

*

* p1...p5 polynomes value tables

e_p1 p1 0 TABLE {v(pin1,pin2)}

+ -100, 0.000000000029209

+ 2.9999, 0.000000000029209

+ 3.0001, -0.000000000001668

+ 8.9999, -0.000000000001668

+ 9.0001, 0.00000000000823

+ 12.9999, 0.00000000000823

+ 13.0001, -0.000000000000087

+ 19.9999, -0.000000000000087

+ 20.0001, 0

e_p2 p2 0 TABLE {v(pin1,pin2)}

+ -100, -0.000000000032376

+ 2.9999, -0.000000000032376

+ 3.0001, 0.000000000016579

+ 8.9999, 0.000000000016579

+ 9.0001, -0.000000000044843

+ 12.9999, -0.000000000044843

+ 13.0001, 0.000000000002389

+ 19.9999, 0.000000000002389

+ 20.0001, 0.000000000000078

e_p3 p3 0 TABLE {v(pin1,pin2)}

+ -100, -0.000000000302083

+ 2.9999, -0.000000000302083

+ 3.0001, -0.000000000081081

+ 8.9999, -0.000000000081081

+ 9.0001, -0.000000000062311

+ 12.9999, -0.000000000062311

+ 13.0001, -0.000000000026007

+ 19.9999, -0.000000000026007

+ 20.0001, -0.000000000005424

e_p4 p4 0 TABLE {v(pin1,pin2)}

+ -100, 0.00000000155

+ 2.9999, 0.00000000155

+ 3.0001, 0.00000000105

+ 8.9999, 0.00000000105

+ 9.0001, 0.0000000008

+ 12.9999, 0.0000000008

+ 13.0001, 0.00000000036

+ 19.9999, 0.00000000036

+ 20.0001, 0.000000000265

e_p5 p5 0 TABLE {v(pin1,pin2)}

+ -100, 1

+ 2.9999, 1

+ 3.0001, 3

+ 8.9999, 3

+ 9.0001, 9

+ 12.9999, 9

+ 13.0001, 13

+ 19.9999, 13

+ 20.0001, 20

*

* "x = x-p5" expression

e_Xshift Xshift 0 value={v(pin1,pin2)-v(p5)}

*

* "y=p4+x*(p3+x*(p2+x*p1))" expression, c(v) function

e_Cfactor Cfactor 0

+ value={v(p4)+v(Xshift)*(v(p3)+v(Xshift)*(v(p2)+v(Xshift)*v(p1)))}

*

* Ideal analog buffer for voltage of external pins

E_pin pin 0 value={v(pin1,pin2)}

*

* Voltage source (zero value) is sensor of current

Vsensor pin Vsens 0V

*

* Reference Capacitor for current measure

C_ref Vsens 0 1nF

*

* Icap Voltage value node is equal current of C_ref

* 1Meg factor is equal 1/1nF

H_Icap Icap 0 Vsensor 1Meg

*

* Output current for simulate nonlinear capacitor.

G_out pin1 pin2 value={v(Icap)*v(Cfactor)}

*

.ends Cnl

 

В точках "стыковки" (3, 9, 13 и 20) в области +-0.0001 есть "всплески" результирующей функции. Это скорее всего из-за конструкции "x = x-p5" и из-за того, что PSpice не "умеет" обрабатывать конструкции "IF" и пришлось сделать кусочно-линейные аппроксимации коэффициентов полинома на заданном интервале.

На картинке c(v).png "всплески" выглядят более широкими из-за того, что шаг моделирования равен 0.2.

На картинке c(v)_without_spikes.png "всплески" отсунствуют, т.к. расчетные точки не попадают в точки "стыковки".

 

ЗЫ. Посмотрел еще раз встроенную модель конденсатора, в ней возможно задать нелинейность (полином) 2-го порядка с помощью параметров VC1 и VC2. В результате емкость будет умножаться на полином 1+VC1*V+VC2*V**2.

 

ЗЫ2. Макромодель можно сделать через полином намного большего порядка, поэтому если избавиться от "IF" то функцию можно сделать гладкой.

 

 

Только вот с условиями не умеет...
да, переходов по условию нету к сожалению...

post-28262-1230404988_thumb.jpg

post-28262-1230405022_thumb.jpg

Share this post


Link to post
Share on other sites

Ну Вы МОЛОДЕЦ! Нет слов, чтоб выразить благодарность! При беглом взгляде - графики те!!! Спасибо, я в синтаксисе спайса не особо силен, вот и парюсь :-)

 

Емкость только в нФ должна была получиться, но это уже мелочи :-)

 

А вот на ЗЫ и ЗЫ2 можно поподробней?

 

Можно схему в виде картинки, в которой Вы это реализовали? Это ведь Оркад у Вас? У меня просто его нет.

Share this post


Link to post
Share on other sites
Ну Вы МОЛОДЕЦ! Нет слов, чтоб выразить благодарность! При беглом взгляде - графики те!!! Спасибо, я в синтаксисе спайса не особо силен, вот и парюсь :-)

Емкость только в нФ должна была получиться, но это уже мелочи :-)

А вот на ЗЫ и ЗЫ2 можно поподробней?

Можно схему в виде картинки, в которой Вы это реализовали? Это ведь Оркад у Вас? У меня просто его нет.

да, емкость д.б. в нФ, значения полинома были порядка 1e-9...

В макромодели одна строчка неправильная, найдите строчку "H_Icap Icap 0 Vsensor 1Meg" и замените ее на "H_Icap Icap 0 Vsensor 1e9" и будут нанофарады.

OrCAD у меня есть, но использовал не его, а MicroSim DesignLab, но это не принципиально. Вообще-то это должно работать в любом Spice-подобном симуляторе. Тот текст, который жирным шрифтом, скопируйте в любой текстовый редактор и сохраните в виде файла. А потом в своем симуляторе подключить его в качестве модели к символу с двумя выводами, только полярность напряжения д.б. правильной.

Схемы нету, вернее есть фрагменты на листке бумаги. Модель писал сразу именно в таком тесктовом виде, это не трансляция из графической схемы. Попробуйте нарисовать ее сами - специально писал комментарии. Если все таки не получится, то нарисую :)

 

про ЗЫ (конденсатор с моделью):

CFDBCK 3 33 <model name> 10pF

.MODEL <model name> CAP [model parameters]

-------------------------------------------------

Model Parameters, Description, Units, Default

-------------------------------------------------

C, capacitance multiplier, -, 1.0

TC1, linear temperature coefficient, 1/°C, 0.0

TC2, quadratic temperature coefficient, 1/°C**2, 0.0

T_ABS, absolute temperature, °C, -

T_MEASURED, measured temperature, °C, -

T_REL_GLOBAL, relative to current temperature, °C, -

T_REL_LOCAL, relative to AKO model temperature, °C, -

VC1, linear voltage coefficient, 1/volt, 0.0

VC2, quadratic voltage coefficient, 1/volt**2, 0.0

 

про ЗЫ2: если можно будет сделать полином более высокого порядка и без разрывов на поддиапазоны, то у макромодели не будет всплесков и макромодель будет проще.

post-28262-1230471947_thumb.jpg

Edited by Jurenja

Share this post


Link to post
Share on other sites

Моделька вроде не ругается, но никак не могу получить такой же график, как у Вас. Что в Дизайнлабе подразумевается под MAX(I(Epin))/(2*pi*1Meg) и vpin? В тексте модели не могу найти Epin и vpin. Есть источник E_pin и вывод pin. Поясните плиз. И если можно, расшифруйте синтаксис для ИТУТ Н1_Icap.

Share this post


Link to post
Share on other sites
Моделька вроде не ругается, но никак не могу получить такой же график, как у Вас. Что в Дизайнлабе подразумевается под MAX(I(Epin))/(2*pi*1Meg) и vpin? В тексте модели не могу найти Epin и vpin. Есть источник E_pin и вывод pin. Поясните плиз. И если можно, расшифруйте синтаксис для ИТУТ Н1_Icap.
ниже полный нетлист для моделирования, в нем все, что не нашлось:

 

Circuit : CNL_T

*

* ***********************************************************

* * *

* * NX-SPICE Version 1.31B *

* * Copyright © 1983,1986 - Personal CAD Systems, Inc. *

* * *

* * File In : CNL_T.NLT *

* * File Out : CNL_T.SPI *

* * Log File : NXSPICE.LOG *

* * *

* ***********************************************************

*

*

.WIDTH IN=80 OUT=132

*

*

* ELEMENTS

*

*

X_TRAN OUT 0 CNL

X PIN 0 CNL

R_TRAN IN OUT 1K

*

* Top File Cnl_t.add

.Options Itl5=0 Vntol=200mV Abstol=20uA

+ NoPage Node Acct

*.Incl d:\pcad\SymPrt1l\add\W_L.mod

*

.Probe

*

* v_GND $g_GND 0

* Vcc $g_GND $g_Vcc -5

.Lib d:\pcad\SymPrt1l\add\S_Analog.lib

.lib d:\pcad\SymPrt1l\add\BSIM3v2.mod

*

V_in In 0 pwl 0ns 50v 10ps 0v

Cout Out 0 1fF ; very small

*

Epin pin V_ACsource value={Vpin}

V_ACsource V_ACsource 0 AC=1

*

.subckt Cnl pin1 pin2

*

* p1...p5 polynomes value tables

e_p1 p1 0 TABLE {v(pin1,pin2)}

+ -100, 0.000000000029209

+ 2.9999, 0.000000000029209

+ 3.0001, -0.000000000001668

+ 8.9999, -0.000000000001668

+ 9.0001, 0.00000000000823

+ 12.9999, 0.00000000000823

+ 13.0001, -0.000000000000087

+ 19.9999, -0.000000000000087

+ 20.0001, 0

e_p2 p2 0 TABLE {v(pin1,pin2)}

+ -100, -0.000000000032376

+ 2.9999, -0.000000000032376

+ 3.0001, 0.000000000016579

+ 8.9999, 0.000000000016579

+ 9.0001, -0.000000000044843

+ 12.9999, -0.000000000044843

+ 13.0001, 0.000000000002389

+ 19.9999, 0.000000000002389

+ 20.0001, 0.000000000000078

e_p3 p3 0 TABLE {v(pin1,pin2)}

+ -100, -0.000000000302083

+ 2.9999, -0.000000000302083

+ 3.0001, -0.000000000081081

+ 8.9999, -0.000000000081081

+ 9.0001, -0.000000000062311

+ 12.9999, -0.000000000062311

+ 13.0001, -0.000000000026007

+ 19.9999, -0.000000000026007

+ 20.0001, -0.000000000005424

e_p4 p4 0 TABLE {v(pin1,pin2)}

+ -100, 0.00000000155

+ 2.9999, 0.00000000155

+ 3.0001, 0.00000000105

+ 8.9999, 0.00000000105

+ 9.0001, 0.0000000008

+ 12.9999, 0.0000000008

+ 13.0001, 0.00000000036

+ 19.9999, 0.00000000036

+ 20.0001, 0.000000000265

e_p5 p5 0 TABLE {v(pin1,pin2)}

+ -100, 1

+ 2.9999, 1

+ 3.0001, 3

+ 8.9999, 3

+ 9.0001, 9

+ 12.9999, 9

+ 13.0001, 13

+ 19.9999, 13

+ 20.0001, 20

*

* "x = x-p5" expression

e_Xshift Xshift 0 value={v(pin1,pin2)-v(p5)}

*

* "y=p4+x*(p3+x*(p2+x*p1))" expression, c(v) function

e_Cfactor Cfactor 0

+ value={v(p4)+v(Xshift)*(v(p3)+v(Xshift)*(v(p2)+v(Xshift)*v(p1)))}

*

* Ideal analog buffer for voltage of external pins

E_pin pin 0 value={v(pin1,pin2)}

*

* Voltage source (zero value) is sensor of current

Vsensor pin Vsens 0V

*

* Reference Capacitor for current measure

C_ref Vsens 0 1nF

*

* Icap Voltage value node is equal current of C_ref

* 1e9 factor is equal 1/1nF

H_Icap Icap 0 Vsensor 1e9

*

* Output current for simulate nonlinear capacitor.

G_out pin1 pin2 value={v(Icap)*v(Cfactor)}

*

.ends Cnl

 

.Param Vpin=0v

.Step Param Vpin 0.1V 50V 0.2V

.AC lin 100 999kHz 1MegHz

*

*.DC V_ACsource -1V 51V 1mV

*

*.tran 5ns 10ns 0ns 50ps

*

* End File Cnl_t.add

*

*

*

.END

 

Проводится АС анализ, он проводится много раз (инструкция .Step) при этом напряжение на емкости меняется от 0 до 50 В.

MAX(I(Epin))/(2*pi*1Meg) - это для программы Microsim Probe формула расчета емкости C=I/(2*pi*F), MAX(I(Epin)) - это значение тока через емкость при частоте 1 МГц, т.к. AC анализ проводится в диапазоне 999кГц-1МГц и максимум тока для емкости будет на частоте 1МГц. При параметрическом анализе расчет проводится много раз, в результате получаем график c(v).

Попробуйте запустить на моделирование нетлист, который выше, затем загрузите результаты (.dat файл) в Microsim Probe, затем в Microsim Probe нужно на панели нажать кнопочку Performance Analysis, а только после этого выводить кривую MAX(I(Epin))/(2*pi*1Meg).

Вам совсем необязательно повторять один-в-одим мое моделирование, вы можете потестировать емкость любым другим понятным вам способом :)

 

H_Icap это ИНУТ (ист. напряжения, управляемый током)

Строка H_Icap Icap 0 Vsensor 1e9 означает что напряжение в узле Icap численно равно току через источник Vsensor, умноженному на 1e9. Т.к. ток через источник Vsensor получается подачей внешнего напряжения на емкость 1нФ (1e-9), то напряжение в узле Icap соответствует току через емкость 1e9*1нФ=1Ф. Зачем этот ток умножается на полином и выдается во внешнюю цепь: G_out pin1 pin2 value={v(Icap)*v(Cfactor)}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this