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

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

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

    [LV.2]偶尔看看I

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

    EDA365欢迎您登录!

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

    x
    这个是理想传输线的Pspice等效电路,但是我看NGSPICE里面的理想传输线模型不是节点矩阵法实现的,下面是传输线源程序
    ) V& M+ A3 U: h9 j1 ]5 s7 C8 F' d#include "cktdefs.h"6 ^& @! a0 h/ `' E# `
    #include "tradefs.h"
    0 W% K' v) Z4 Z2 r#include "sperror.h"
    & P+ P$ l# o+ G#include "suffix.h"
    1 R4 Q7 ~' g7 E7 r3 A- m
    3 a& \3 Q# q' B* u$ u
    & Y1 }5 _8 Y4 W6 u" N, Kint
    9 O# {7 P7 D1 r9 v; Y% yTRAaccept(ckt,inModel): M& ~; A: O# X& {; C& p
        register CKTcircuit *ckt;5 S+ h8 M0 H7 \' y6 u7 J  e
        GENmodel *inModel;
    8 \+ o! Y5 N/ E1 ^1 c{
    1 j8 ]# C* R) g6 \    register TRAmodel *model = (TRAmodel *)inModel;. H. ^6 J! |$ h2 F  U
        register TRAinstance *here;* O- b3 W3 T" T8 k5 g7 c2 |! x3 j
        register int i=0,j;% f1 r4 R% W9 ?0 P- I. j; r" N
        double v1,v2,v3,v4;" T  g& ]# K! K) [! l- G
        double v5,v6,d1,d2,d3,d4;
    8 n' g6 @$ p. V( ]    double *from,*to;
    6 d, Q6 D/ k( Q7 d    int error;
    , B0 C8 f: P5 Y+ J6 A* [9 g. C4 \! B. h4 e; S+ w( e* ~# x$ r3 S5 S

    ! T0 {0 w; F& A& K7 d& N5 T' I& t    /*  loop through all the transmission line models */
    ! z' d% G; k- K, D! \    for( ; model != NULL; model = model->TRAnextModel ) {
    ! I: H6 ~7 _8 S+ J* D8 Z# J
    2 \2 q$ x6 q  V% |9 \; ?        /* loop through all the instances of the model */5 R) T: m& R% H. P- B: L* @
            for (here = model->TRAinstances; here != NULL ;
    ' D2 ^; [6 T4 J/ h" y5 h; s) |                here=here->TRAnextInstance) {
    2 d6 _( Y" D( M% Z3 f5 W6 [            if( (ckt->CKTtime - here->TRAtd) > *(here->TRAdelays+6)) {
    % s3 x: y' _, n- S% c. f                /* shift! */6 m7 a& V$ h5 O8 ?1 m& s' n4 z( n0 n
                    for(i=2;i<here->TRAsizeDelay &&
    . b" `* N& X0 n  @6 G9 r( ~$ D                    (ckt->CKTtime - here->TRAtd > *(here->TRAdelays+3*i));i++)
    3 r# O5 O8 j- {* ]; O$ {5 J                        { /* loop does it all */ ; }- y: Q, |9 b6 s5 i( X. q$ T9 p
                    i -= 2;& r  R, R1 j9 O) c' t' [1 M' Z
                    for(j=i;j<=here->TRAsizeDelay;j++) {5 |& ^) Y% _2 n- U& P
                        from = here->TRAdelays + 3*j;
    ! G5 C. U3 h' q) J8 t, V( R                    to = here->TRAdelays + 3*(j-i);& D5 \  y& _2 @) [: x
                        *(to) = *(from);* A" P# X9 d  S" @5 ]3 d; H6 n
                        *(to+1) = *(from+1);
    " M. x% W. ]3 y- e                    *(to+2) = *(from+2);8 @3 G* f! H, `9 h+ u! D% Z
                    }
    3 r6 M: M; u' o+ F: F9 C: N) y                here->TRAsizeDelay -= i;8 ?( N& g: u  S& }5 G; v
                }7 V, V0 ?  G5 j  }
                if(ckt->CKTtime - *(here->TRAdelays+3*here->TRAsizeDelay) >) _* N7 l/ r3 T0 U7 X
                        ckt->CKTminBreak) {: ~) o+ C1 ~4 o/ |
                    if(here->TRAallocDelay <= here->TRAsizeDelay) {
    / Z" z/ v  |3 _7 h) ?" f2 g8 \  z2 I( X                    /* need to grab some more space */' ^& d: e1 J4 A% e$ `( z
                        here->TRAallocDelay += 5;/ m/ ~4 n9 m/ o$ y
                        here->TRAdelays = (double *)REALLOC((char *)here->TRAdelays,2 b: b! [+ z4 k- w, B
                            (here->TRAallocDelay+1)*3*sizeof(double));0 p: [, D" ^. e  o& ~
                    }
    2 I& k! W9 N4 m" S) g2 T; C                here->TRAsizeDelay ++;3 T) f+ S( _  p" y" r$ W4 ?2 L
                    to = (here->TRAdelays  +3*here->TRAsizeDelay);6 e+ r8 S% x: x: g. H- H; x3 h
                    *to = ckt->CKTtime;6 {- ~" k  |& ?, _
                    to = (here->TRAdelays+1+3*here->TRAsizeDelay);4 |1 t4 _4 O2 I( f( c9 X
                    *to = ( *(ckt->CKTrhsOld + here->TRAposNode2)
    2 p8 t" B6 `2 l: d3 ~- {/ V                     -*(ckt->CKTrhsOld + here->TRAnegNode2))
    : j* q9 J' N& Y; R' k. O                    + *(ckt->CKTrhsOld + here->TRAbrEq2)*4 W/ ?1 K* M7 I( u# F) d: X+ w
                            here->TRAimped;  w  {/ n! |5 ^$ n" M
                    *(here->TRAdelays+2+3*here->TRAsizeDelay) =
    ( T: D. ^3 ~6 e" @5 G7 o* T                    ( *(ckt->CKTrhsOld + here->TRAposNode1)
    ) @% |5 k! ~4 k( m                     -*(ckt->CKTrhsOld + here->TRAnegNode1))7 c6 b7 z; ?& `' {
                        + *(ckt->CKTrhsOld + here->TRAbrEq1)*+ @5 I3 ]4 c! J) I2 a
                            here->TRAimped;/ e' t; r9 g* U" c0 j
    #ifdef NOTDEF+ _4 H$ [5 W+ G6 B9 r' B
                    v1 = *(here->TRAdelays+1+3*here->TRAsizeDelay);6 @$ l* t" D8 ]- p6 x2 b) I, E
                    v2 = *(here->TRAdelays+1+3*(here->TRAsizeDelay-1));
    6 F$ v  P% x% S7 D                v3 = *(here->TRAdelays+2+3*here->TRAsizeDelay);
      A& k( N+ ?; c# _! U$ F                v4 = *(here->TRAdelays+2+3*(here->TRAsizeDelay-1));
    $ p! V) V$ H% X7 y& Y& X- s$ b" {% V6 L' t                if( (FABS(v1-v2) >= 50*ckt->CKTreltol*
    $ g4 P$ x: m0 z, x  R                        MAX(FABS(v1),FABS(v2))+50*ckt->CKTvoltTol) ||
    ! A/ g* i) F- r  o                    (FABS(v3-v4) >= 50*ckt->CKTreltol*3 c6 ]) N# f( Y6 ~- ?) j
                            MAX(FABS(v3),FABS(v4))+50*ckt->CKTvoltTol)  ) {
    $ L: t, x+ Y  G0 {2 a/ N                    /* changing - need to schedule after delay */2 x. D; D' d2 P) F! Y6 r' J
                        /*printf("%s:  at %g set for %g and %g\n",here->TRAname,
    : S3 A% p4 ?2 ]- O3 V0 ^                        ckt->CKTtime,* u8 N& i; J# T5 [- K
                            ckt->CKTtime+here->TRAtd,
    4 B8 Z+ ?  E& F$ x# ?9 K5 {0 y                        *(here->TRAdelays+3*here->TRAsizeDelay-3)+
    6 x* L5 D1 a) I# h                                here->TRAtd);*/6 s  _1 J' r/ o* [/ U
                        error = CKTsetBreak(ckt,ckt->CKTtime+here->TRAtd);% G% X' X5 r% N  V! T
                        if(error) return(error);) o5 ]3 o# `2 u
                        /* also set for break after PREVIOUS point */
    # O8 e+ i; m$ M9 S& z+ U                    error = CKTsetBreak(ckt,
    8 G: `/ s) S3 O- r) j                            *(here->TRAdelays+3*here->TRAsizeDelay -3) +
    + A% m9 y# A( G% N                            here->TRAtd);
    8 \0 O9 K9 l4 F8 F                    CKTbreakDump(ckt);
    * H0 c  r& E4 @" L" J                    if(error) return(error);  A' V4 {/ q. }& O- @& J* `( ]: K
                    }
    3 [& M3 Q8 D% w0 ]3 y( F, G- v#else
    $ Z! o7 \9 v5 e& e. j7 b' j4 _                v1 = *(here->TRAdelays+1+3*here->TRAsizeDelay);
    ( U* Y% w! U+ U# u! {                v2 = *(here->TRAdelays+1+3*(here->TRAsizeDelay-1));
    5 [( K* U7 u1 ~: X( T; I                v3 = *(here->TRAdelays+1+3*(here->TRAsizeDelay-2));
    * N6 R8 e/ E. s- [8 Z( S8 i4 |: \                v4 = *(here->TRAdelays+2+3*here->TRAsizeDelay);
    ; k; p; t7 a5 S& M                v5 = *(here->TRAdelays+2+3*(here->TRAsizeDelay-1));, \) U6 {+ \: j+ B
                    v6 = *(here->TRAdelays+2+3*(here->TRAsizeDelay-2));8 P' W1 H+ I& \' N" {( p6 p
                    d1 = (v1-v2)/ckt->CKTdeltaOld[0];: s9 r/ w3 T; F- p9 F9 I4 @
                    d2 = (v2-v3)/ckt->CKTdeltaOld[1];
    5 \. W9 v9 \$ t/ b( b                d3 = (v4-v5)/ckt->CKTdeltaOld[0];7 r: {- V2 a" L( l: o
                    d4 = (v5-v6)/ckt->CKTdeltaOld[1];
    . ~1 c. }) Q7 Q0 ~                /*printf("%s: at %g derivs are %g, %g and %g, %g\n",$ R. F; T1 l7 L$ D& m8 q: I+ L3 r
                            here->TRAname,ckt->CKTtime,d1,d2,d3,d4);*/+ z. V$ E, N9 c7 {
                    if( (FABS(d1-d2) >= here->TRAreltol*MAX(FABS(d1),FABS(d2))+
    5 k) w2 {  k; \5 A7 M% u                        here->TRAabstol) ||
    / L5 ]( S% S% O  i  j; v1 {                        (FABS(d3-d4) >= here->TRAreltol*MAX(FABS(d3),FABS(d4))+) @# G  c0 J; k# D5 C
                            here->TRAabstol) ) {
    + l6 d+ j. [! B1 g+ o                    /* derivitive changing - need to schedule after delay */: ~: z( x8 p9 h/ W; T+ l
                        /*printf("%s:  at %g set for %g\n",here->TRAname,
    5 z2 @( e8 l' E0 z, T                        ckt->CKTtime,
    ) f5 R+ X* h, }: v" h                        *(here->TRAdelays+3*here->TRAsizeDelay-3)+here->TRAtd/ Z1 x8 [3 O, C9 L4 q
                            );*/% B' e, q7 f' a8 Q& v( H( ^/ n
                        /*printf("%g, %g, %g -> %g, %g \n",v1,v2,v3,d1,d2);*/
      s# c2 T0 o' p+ @8 U                    /*printf("%g, %g, %g -> %g, %g \n",v4,v5,v6,d3,d4);*/
    , p  c& ^6 U+ L; ^                    /* also set for break after PREVIOUS point *// Y  I( c1 e% t3 [) l2 }
                        /*printf("setting break\n");*/
    1 s  `7 N5 U1 p$ q7 `* N                    error = CKTsetBreak(ckt,
    & \" _* |) O- y8 i                            *(here->TRAdelays+3*here->TRAsizeDelay -3) +8 W$ |, ]# z  a
                                here->TRAtd);# z9 u0 B- a* r
                        if(error) return(error);/ `& N2 L" Y9 [+ u
                    }
    6 f) K5 F7 H% D" U3 R6 B7 q#endif /*NOTDEF*/
    ( ^5 |, ^8 Y" F, c            }3 E2 r4 W' P7 J' K: ], m( j
            }
    ! y0 R: S! S; l. p/ d+ K    }* X  |: l% I" |* ]
        return(OK);" l, n) @" I& m: d) K9 z! E5 I
    }) o6 R' O3 b/ s, n! p' h9 L5 _

    * A* s) C7 o6 T; F1 T
    $ e8 H# p" K4 P$ K

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

    20210707150337.png

    该用户从未签到

    2#
    发表于 2021-7-8 14:10 | 只看该作者
    我也想知道,看看别人怎么说
    2 {* o8 V8 t6 v8 u! f
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-12 07:08 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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