找回密码
 注册
关于网站域名变更的通知
查看: 929|回复: 1
打印 上一主题 下一主题

怎么破解PSPICE里面器件模型,例如传输线模型,有高手支招吗?

[复制链接]
  • TA的每日心情
    开心
    2021-7-15 15:16
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    跳转到指定楼层
    1#
    发表于 2021-7-8 09:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    这个是理想传输线的Pspice等效电路,但是我看NGSPICE里面的理想传输线模型不是节点矩阵法实现的,下面是传输线源程序. h1 |/ V& S( y9 t3 s. Q5 |9 S  W$ k; A
    #include "cktdefs.h"
    5 |( A' q  X$ X/ _* K8 n#include "tradefs.h"" L6 {/ m4 M% k3 ^% e& d
    #include "sperror.h"
    1 c& e2 G, s$ s6 W" Q#include "suffix.h"
    1 N8 g- R- u. ]- y" u
    2 l3 U9 U; V7 G- K8 [- B) R4 b5 d( F" o* b
    int8 h, E4 o2 z$ b: q, g6 V& \
    TRAaccept(ckt,inModel)/ u2 m% P: m* X* s! t: y) o
        register CKTcircuit *ckt;
    4 J* P0 F, C+ ~% s. ?8 F3 ^    GENmodel *inModel;
    ( u) y% C3 ]; g$ w& }{4 G) w- h5 l1 e
        register TRAmodel *model = (TRAmodel *)inModel;
    ) Q1 q5 N( Y; k* E" c# L1 k  P; M    register TRAinstance *here;% `; [6 c1 z0 Q! Y, F: ~  v
        register int i=0,j;
    3 t; ?& e% a; i. Y) e4 }    double v1,v2,v3,v4;
    1 K& a) s) w/ ?/ B    double v5,v6,d1,d2,d3,d4;3 T  M' `: a1 v
        double *from,*to;
    8 `7 k% w0 ~# Q  P5 D    int error;
    ) X3 }8 d. B5 P, C8 t( H1 k+ _( |
    ; T  Z5 R; }' t* F- D. f- {+ [3 `% ?, m3 J8 T. S+ t3 f5 Q3 C
        /*  loop through all the transmission line models */
    " `1 o7 \6 f+ B$ J8 ]# Z9 o( g; Y    for( ; model != NULL; model = model->TRAnextModel ) {
    . O, R2 E: ]# O5 e% D) N) _) @2 g1 R; S  D" O8 a% K
            /* loop through all the instances of the model */
    + V8 f# G$ K/ m8 ^        for (here = model->TRAinstances; here != NULL ;4 f5 A& u" y7 n  @. y2 N, T
                    here=here->TRAnextInstance) {, |7 W- C" w8 Y6 E4 h, M* M
                if( (ckt->CKTtime - here->TRAtd) > *(here->TRAdelays+6)) {
    & z# W8 O. G: n9 Q& x2 k9 l( p                /* shift! */
    1 k" U" g* F; w7 M: |' C/ E, z$ y                for(i=2;i<here->TRAsizeDelay && : H. B/ T/ n6 e2 p1 T" t
                        (ckt->CKTtime - here->TRAtd > *(here->TRAdelays+3*i));i++)0 s. a2 J% |4 p% `& v( C
                            { /* loop does it all */ ; }$ e, F' B5 p, V3 J# g+ t
                    i -= 2;
    $ r0 f5 x# J3 k: H                for(j=i;j<=here->TRAsizeDelay;j++) {4 i  O& b$ Y: `2 ?
                        from = here->TRAdelays + 3*j;$ r# X8 l3 d2 \! O" `. E1 }8 p
                        to = here->TRAdelays + 3*(j-i);
    9 U. O6 e% ~/ w. ?6 C- u# g0 \  I. a                    *(to) = *(from);, W# t; \2 a/ p' f) x
                        *(to+1) = *(from+1);
    5 r( G' e% E1 I                    *(to+2) = *(from+2);
    + y! q2 ?# t. w2 ~; y' v! q& p                }6 D% ~) B7 u1 E' t" y
                    here->TRAsizeDelay -= i;
    $ y) D) g( y9 J7 [            }: S) h- w: \4 |+ K$ y5 {& h
                if(ckt->CKTtime - *(here->TRAdelays+3*here->TRAsizeDelay) >
    , b3 ]; a8 A$ m- b$ q$ h7 u                    ckt->CKTminBreak) {' g5 L+ \( A" H7 f
                    if(here->TRAallocDelay <= here->TRAsizeDelay) {
    - s6 _" c/ T5 o$ t5 G, P                    /* need to grab some more space */
    3 R. i$ ?/ V. v$ C                    here->TRAallocDelay += 5;
    1 K' K. U. b0 j, o( }' s                    here->TRAdelays = (double *)REALLOC((char *)here->TRAdelays,
    + e1 H0 e/ Q0 R8 S                        (here->TRAallocDelay+1)*3*sizeof(double));; J/ r% \3 j$ _6 U9 Z4 ~, D3 H8 }* n/ X
                    }
    . Z4 H+ w7 t! {* h% Z- O% S. t                here->TRAsizeDelay ++;
    5 r& Z* q8 W, M. J% ]4 y7 s$ i                to = (here->TRAdelays  +3*here->TRAsizeDelay);7 B. _" ^/ t, S' \. U# v
                    *to = ckt->CKTtime;3 M; C- W$ q( S0 {
                    to = (here->TRAdelays+1+3*here->TRAsizeDelay);3 ]+ @3 g0 J, c$ X' B
                    *to = ( *(ckt->CKTrhsOld + here->TRAposNode2)
    ' G/ U4 V! B4 Q                     -*(ckt->CKTrhsOld + here->TRAnegNode2))
    / H! k) {3 x# N- |1 \. B4 P3 K                    + *(ckt->CKTrhsOld + here->TRAbrEq2)*
    % T2 E  l; d. v                        here->TRAimped;# o7 R" ]# G1 G
                    *(here->TRAdelays+2+3*here->TRAsizeDelay) = * B4 W$ G0 _# b5 H6 z
                        ( *(ckt->CKTrhsOld + here->TRAposNode1)4 m! b1 ?& h9 e6 Y+ @5 Y3 U
                         -*(ckt->CKTrhsOld + here->TRAnegNode1))& N: z% d( \# k6 f4 E. P1 }
                        + *(ckt->CKTrhsOld + here->TRAbrEq1)*0 N9 s- s' }: i3 F1 u
                            here->TRAimped;5 u" ~# ~) R- U$ }8 N5 |& L
    #ifdef NOTDEF0 }9 Z8 H2 x6 S; o# ]
                    v1 = *(here->TRAdelays+1+3*here->TRAsizeDelay);
    # ?, C' q- x0 g7 b2 p# o                v2 = *(here->TRAdelays+1+3*(here->TRAsizeDelay-1));7 ^, {- L/ n: u! M3 G% {
                    v3 = *(here->TRAdelays+2+3*here->TRAsizeDelay);
    : K1 ^# c6 u* J                v4 = *(here->TRAdelays+2+3*(here->TRAsizeDelay-1));9 t4 T  `6 z' W3 l
                    if( (FABS(v1-v2) >= 50*ckt->CKTreltol*
    6 h0 Z8 v4 v  s+ i8 M                        MAX(FABS(v1),FABS(v2))+50*ckt->CKTvoltTol) ||
    9 R0 W% `5 L& z7 B3 K- |                    (FABS(v3-v4) >= 50*ckt->CKTreltol*
    9 m% t$ e( m6 o  t* j& W8 W                        MAX(FABS(v3),FABS(v4))+50*ckt->CKTvoltTol)  ) {
    0 m1 M3 Y1 |: x) H                    /* changing - need to schedule after delay */
    5 J+ D! O4 g" c' O                    /*printf("%s:  at %g set for %g and %g\n",here->TRAname,
    % s1 }% ^: s" H- H                        ckt->CKTtime,
    $ M- g; P- t3 O# @: ~: o7 }: o: a                        ckt->CKTtime+here->TRAtd,
    % D# g# ]! j$ p* a; o                        *(here->TRAdelays+3*here->TRAsizeDelay-3)+% q6 c7 V& {$ E1 t) |6 i
                                    here->TRAtd);*/2 |/ U  M) x" t" q. s& Z
                        error = CKTsetBreak(ckt,ckt->CKTtime+here->TRAtd);
    + q, E1 O, l5 o5 Z* _- `                    if(error) return(error);$ G- l2 z. k( F+ J+ X8 [7 x' A! S
                        /* also set for break after PREVIOUS point */: {: B+ T0 G. ?' m+ o( y# u, E8 b4 d
                        error = CKTsetBreak(ckt,8 ]% k6 k7 V& F/ N  S1 q, h! t0 m2 t5 f
                                *(here->TRAdelays+3*here->TRAsizeDelay -3) +* Y' G, E8 J9 q2 d$ z! `! n/ h3 ^. S$ s
                                here->TRAtd);
    % x5 F/ h, O5 ?, a% w+ b* e; T                    CKTbreakDump(ckt);
      z" I5 i5 M" p9 G5 ~' \                    if(error) return(error);" q1 F1 a1 q2 s! M; ^3 V8 k
                    }
    # K5 I, E* f) }9 f8 o& w#else
    ) X/ u5 d+ f0 H1 s* a/ {                v1 = *(here->TRAdelays+1+3*here->TRAsizeDelay);0 U. ^" J: i$ H, Q
                    v2 = *(here->TRAdelays+1+3*(here->TRAsizeDelay-1));( _1 b) A: L: J' u6 _4 a
                    v3 = *(here->TRAdelays+1+3*(here->TRAsizeDelay-2));6 j3 I) s% N% ]/ N7 \
                    v4 = *(here->TRAdelays+2+3*here->TRAsizeDelay);1 @% d+ w. O5 d
                    v5 = *(here->TRAdelays+2+3*(here->TRAsizeDelay-1));
    % z2 t1 b8 T/ g2 N1 {                v6 = *(here->TRAdelays+2+3*(here->TRAsizeDelay-2));9 I+ }# t3 N5 ^. t, v: C
                    d1 = (v1-v2)/ckt->CKTdeltaOld[0];
    0 {+ d6 n  u/ h1 }6 A                d2 = (v2-v3)/ckt->CKTdeltaOld[1];5 d2 G+ H& F( I7 K5 f3 y2 T' \
                    d3 = (v4-v5)/ckt->CKTdeltaOld[0];$ _9 T, X$ J7 P! m6 c
                    d4 = (v5-v6)/ckt->CKTdeltaOld[1];
    6 s5 ?8 ]' |( k9 V! {  ]  t/ f) U                /*printf("%s: at %g derivs are %g, %g and %g, %g\n",; C; w, s+ ]' ?% p9 ^
                            here->TRAname,ckt->CKTtime,d1,d2,d3,d4);*/
    : j1 @6 ]1 b' m                if( (FABS(d1-d2) >= here->TRAreltol*MAX(FABS(d1),FABS(d2))+
    ; A! Y/ N# y' `                        here->TRAabstol) ||
    ! d: S! S7 x/ b$ ~8 m( H( {, D                        (FABS(d3-d4) >= here->TRAreltol*MAX(FABS(d3),FABS(d4))+
    1 o$ j0 x0 f5 w( f, C                        here->TRAabstol) ) {
    + k& z0 w, b1 ~                    /* derivitive changing - need to schedule after delay */; U! l. x6 |1 q$ Q
                        /*printf("%s:  at %g set for %g\n",here->TRAname,
    0 e& K! f4 @+ Y" s+ J                        ckt->CKTtime,  W5 L% N8 y! {1 B) p
                            *(here->TRAdelays+3*here->TRAsizeDelay-3)+here->TRAtd
    - _" h4 v0 u/ K' Y. S% L6 `; O0 i                        );*/# D# E+ t: J5 a0 T! Z1 H
                        /*printf("%g, %g, %g -> %g, %g \n",v1,v2,v3,d1,d2);*/
      ?* i& c* ^7 u% [. n                    /*printf("%g, %g, %g -> %g, %g \n",v4,v5,v6,d3,d4);*/
    6 J7 X3 @  {+ i                    /* also set for break after PREVIOUS point */
    ( y. m3 I* d: i. U0 {                    /*printf("setting break\n");*/9 N. p, D, r2 Z) F1 Z
                        error = CKTsetBreak(ckt,
    9 M; D8 T3 l6 y' B' g% }0 ]9 L6 Y                            *(here->TRAdelays+3*here->TRAsizeDelay -3) +; ~# ^: [$ K% n& j; A3 F
                                here->TRAtd);6 F6 G! d. \- X6 h' f% A
                        if(error) return(error);0 Z. v8 r6 ^  E! w) z1 j* A
                    }
    , C+ A  k0 v  x/ |, s#endif /*NOTDEF*/
    ( @" M9 Y" [% Q0 U! d            }
    - [, d5 X# ^5 n+ P8 T6 s+ M        }0 @; Z1 L# w& x7 h: s" \9 X
        }
    $ [. x8 c( I4 Y; y5 C/ J( b    return(OK);
    # L& C0 E/ X: W" X# L6 a}7 c1 Z6 A% N& M# t0 J
    7 M: I* I: ^% w# d; b- b
    , S6 x$ [5 v3 c% f) e' B+ W

    20210707150337.png (131.8 KB, 下载次数: 2)

    20210707150337.png

    该用户从未签到

    2#
    发表于 2021-7-8 14:10 | 只看该作者
    我也想知道,看看别人怎么说8 p; N6 O7 f" g6 Y7 f- L+ T
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-10-12 16:16 , Processed in 0.140625 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表