⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bjtdset.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 2 页
字号:
	    d_ic.d2_q2 -= gbc2/here->BJTtBetaR + gbcn2;	    d_ic.d3_q3 -= gbc3/here->BJTtBetaR + gbcn3;	    /* check this point: where is the f2(vbe) contribution to ic ? */	    /* ic derivatives all set up now */	    /* base spread resistance */	    if ( !((rbpr == 0.0) && (rbpi == 0.0)))	    {		cb=cbe/here->BJTtBetaF+cben+cbc/here->BJTtBetaR+cbcn;		/* we are calculating derivatives w.r.t cb itself */		/*		  gx=rbpr+rbpi/qb;		*/		if (cb != 0.0) {		    if((xjrb != 0.0) && (rbpi != 0.0)) {			/* p = ib, q, r = anything */			dummy=MAX(cb/xjrb,1e-9);			EqualDeriv(&d_dummy, &d_p);			d_dummy.value = dummy;			d_dummy.d1_p = 1/xjrb;			SqrtDeriv(&d_dummy, &d_dummy);			TimesDeriv(&d_dummy, &d_dummy, 2.4317); 			/*			  dummy2=(-1+sqrt(1+14.59025*MAX(cb/xjrb,1e-9)));			*/			EqualDeriv(&d_dummy2, &d_p);			d_dummy2.value = 1+14.59025*MAX(cb/xjrb,1e-9);			d_dummy2.d1_p = 14.59025/xjrb;			SqrtDeriv(&d_dummy2, &d_dummy2);			d_dummy2.value -= 1.0;			DivDeriv(&d_z, &d_dummy2, &d_dummy);			TanDeriv(&d_tanz, &d_z);			/* now using dummy = tanz - z and dummy2 =                           z*tanz*tanz */			TimesDeriv(&d_dummy, &d_z, -1.0);			PlusDeriv(&d_dummy, &d_dummy, &d_tanz);			MultDeriv(&d_dummy2, &d_tanz, &d_tanz);			MultDeriv(&d_dummy2, &d_dummy2, &d_z);			DivDeriv(&d_rbb , &d_dummy, &d_dummy2);			TimesDeriv(&d_rbb,&d_rbb, 3.0*rbpi);			d_rbb.value += rbpr;			MultDeriv(&d_vbb, &d_rbb, &d_p);			/* power series inversion to get the                           conductance derivatives */			if (d_vbb.d1_p != 0) {			    gbb1 = 1/d_vbb.d1_p;			    gbb2 = -(d_vbb.d2_p2*0.5)*gbb1*gbb1;			    gbb3 = gbb1*gbb1*gbb1*gbb1*(-(d_vbb.d3_p3/6.0)							+ 2*(d_vbb.d2_p2*0.5)*(d_vbb.d2_p2*0.5)*gbb1);			}			else			    printf("\nd_vbb.d1_p = 0 in base spread resistance calculations\n");			/* r = vbb */			EqualDeriv(&d_ibb, &d_r);			d_ibb.value = cb;			d_ibb.d1_r = gbb1;			d_ibb.d2_r2 = 2*gbb2;			d_ibb.d3_r3 = 6.0*gbb3;		    }		    else		    {			/*			  rbb = rbpr + rbpi/qb;			  ibb = vbb /rbb; = f(vbe, vbc, vbb)			*/			EqualDeriv(&d_rbb,&d_p);			d_rbb.d1_p = 0.0;			if (rbpi != 0.0) {			    InvDeriv(&d_rbb, &d_qb);			    TimesDeriv(&d_rbb, &d_rbb,rbpi);			}			d_rbb.value += rbpr;			EqualDeriv(&d_ibb,&d_r);			d_ibb.value = vbb;			DivDeriv(&d_ibb,&d_ibb,&d_rbb);		    }		}		else		{		    EqualDeriv(&d_ibb,&d_r);		    if (rbpr != 0.0)			d_ibb.d1_r = 1/rbpr;		}	    }	    else	    {		EqualDeriv(&d_ibb,&d_p);		d_ibb.d1_p = 0.0;	    }	    /* formulae for base spread resistance over! */	    /* ib term */	    EqualDeriv(&d_ib, &d_p);	    d_ib.d1_p = 0.0;	    d_ib.value = cb;	    d_ib.d1_p = gbe/here->BJTtBetaF + gben;	    d_ib.d2_p2 = gbe2/here->BJTtBetaF + gben2;	    d_ib.d3_p3 = gbe3/here->BJTtBetaF + gben3;	    d_ib.d1_q = gbc/here->BJTtBetaR + gbcn;	    d_ib.d2_q2 = gbc2/here->BJTtBetaR + gbcn2;	    d_ib.d3_q3 = gbc3/here->BJTtBetaR + gbcn3;	    /* ib term over */	    /*	     *   charge storage elements	     */	    tf=model->BJTtransitTimeF;	    tr=model->BJTtransitTimeR;	    czbe=here->BJTtBEcap*here->BJTarea * here->BJTm;	    pe=here->BJTtBEpot;	    xme=model->BJTjunctionExpBE;	    cdis=model->BJTbaseFractionBCcap;	    ctot=here->BJTtBCcap*here->BJTareab * here->BJTm;	    czbc=ctot*cdis;	    czbx=ctot-czbc;	    pc=here->BJTtBCpot;	    xmc=model->BJTjunctionExpBC;	    fcpe=here->BJTtDepCap;	    czcs=model->BJTcapCS*here->BJTareac * here->BJTm;	    ps=model->BJTpotentialSubstrate;	    xms=model->BJTexponentialSubstrate;	    xtf=model->BJTtransitTimeBiasCoeffF;	    ovtf=model->BJTtransitTimeVBCFactor;	    xjtf=model->BJTtransitTimeHighCurrentF*here->BJTarea * here->BJTm;	    if(tf != 0 && vbe >0) {		EqualDeriv(&d_cbe, &d_p);		d_cbe.value = cbe;		d_cbe.d1_p = gbe;		d_cbe.d2_p2 = gbe2;		d_cbe.d3_p3 = gbe3;		if(xtf != 0){		    if(ovtf != 0) {			/* dummy = exp ( vbc*ovtf) */			EqualDeriv(&d_dummy, &d_q);			d_dummy.value = vbc*ovtf;			d_dummy.d1_q = ovtf;			ExpDeriv(&d_dummy, &d_dummy);		    }		    else		    {			EqualDeriv(&d_dummy,&d_p);			d_dummy.value = 1.0;			d_dummy.d1_p = 0.0;		    }		    if(xjtf != 0) {			EqualDeriv(&d_dummy2, &d_cbe);			d_dummy2.value += xjtf;			DivDeriv(&d_dummy2, &d_cbe, &d_dummy2);			MultDeriv (&d_dummy2, &d_dummy2, &d_dummy2);		    }		    else		    {			EqualDeriv(&d_dummy2,&d_p);			d_dummy2.value = 1.0;			d_dummy2.d1_p = 0.0;		    }					    MultDeriv(&d_tff, &d_dummy, &d_dummy2);		    TimesDeriv(&d_tff, &d_tff, tf*xtf);		    d_tff.value += tf;		}		else		{		    EqualDeriv(&d_tff,&d_p);		    d_tff.value = tf;		    d_tff.d1_p = 0.0;		}		/* qbe = tff/qb*cbe */		/*		  dummy = tff/qb;		*/		/* these are the cbe coeffs */		DivDeriv(&d_dummy, &d_tff, &d_qb);		MultDeriv(&d_qbe, &d_dummy, &d_cbe);	    }	    else	    {		EqualDeriv(&d_qbe, &d_p);		d_qbe.value = 0.0;		d_qbe.d1_p = 0.0;	    }	    if (vbe < fcpe) {		arg=1-vbe/pe;		sarg=exp(-xme*log(arg));		lcapbe1 = czbe*sarg;		lcapbe2 =		    0.5*czbe*xme*sarg/(arg*pe);		lcapbe3 =		    czbe*xme*(xme+1)*sarg/(arg*arg*pe*pe*6);	    } else {		f1=here->BJTtf1;		f2=model->BJTf2;		f3=model->BJTf3;		czbef2=czbe/f2;		lcapbe1 = czbef2*(f3+xme*vbe/pe);		lcapbe2 = 0.5*xme*czbef2/pe;		lcapbe3 = 0.0;	    }	    d_qbe.d1_p += lcapbe1;	    d_qbe.d2_p2 += lcapbe2*2.;	    d_qbe.d3_p3 += lcapbe3*6.;	    fcpc=here->BJTtf4;	    f1=here->BJTtf5;	    f2=model->BJTf6;	    f3=model->BJTf7;	    if (vbc < fcpc) {		arg=1-vbc/pc;		sarg=exp(-xmc*log(arg));		lcapbc1 = czbc*sarg;		lcapbc2 =		    0.5*czbc*xmc*sarg/(arg*pc);		lcapbc3 =		    czbc*xmc*(xmc+1)*sarg/(arg*arg*pc*pc*6);	    } else {		czbcf2=czbc/f2;		lcapbc1 = czbcf2*(f3+xmc*vbc/pc);		lcapbc2 = 0.5*xmc*czbcf2/pc;		lcapbc3 = 0;	    }	    if(vbx < fcpc) {		arg=1-vbx/pc;		sarg=exp(-xmc*log(arg));		lcapbx1 = czbx*sarg;		lcapbx2 =		    0.5*czbx*xmc*sarg/(arg*pc);		lcapbx3 =		    czbx*xmc*(xmc+1)*sarg/(arg*arg*pc*pc*6);	    } else {		czbxf2=czbx/f2;		lcapbx1 = czbxf2*(f3+xmc*vbx/pc);		lcapbx2 = 0.5*xmc*czbxf2/pc;		lcapbx3 = 0;	    }	    if(vsc < 0){		arg=1-vsc/ps;		sarg=exp(-xms*log(arg));		lcapsc1 = czcs*sarg;		lcapsc2 =		    0.5*czcs*xms*sarg/(arg*ps);		lcapsc3 =		    czcs*xms*(xms+1)*sarg/(arg*arg*ps*ps*6);	    } else {		lcapsc1 = czcs*(1+xms*vsc/ps);		lcapsc2 = czcs*0.5*xms/ps;		lcapsc3 = 0;	    }	    /*	     *   store small-signal parameters	     */	    here->ic_x = d_ic.d1_p;	    here->ic_y = d_ic.d1_q;	    here->ic_xd = d_ic.d1_r;	    here->ic_x2 = 0.5*model->BJTtype*d_ic.d2_p2;	    here->ic_y2 = 0.5*model->BJTtype*d_ic.d2_q2;	    here->ic_w2 = 0.5*model->BJTtype*d_ic.d2_r2;	    here->ic_xy = model->BJTtype*d_ic.d2_pq;	    here->ic_yw = model->BJTtype*d_ic.d2_qr;	    here->ic_xw = model->BJTtype*d_ic.d2_pr;	    here->ic_x3 = d_ic.d3_p3/6.;	    here->ic_y3 = d_ic.d3_q3/6.;	    here->ic_w3 = d_ic.d3_r3/6.;	    here->ic_x2w = 0.5*d_ic.d3_p2r;	    here->ic_x2y = 0.5*d_ic.d3_p2q;	    here->ic_y2w = 0.5*d_ic.d3_q2r;	    here->ic_xy2 = 0.5*d_ic.d3_pq2;	    here->ic_xw2 = 0.5*d_ic.d3_pr2;	    here->ic_yw2 = 0.5*d_ic.d3_qr2;	    here->ic_xyw = d_ic.d3_pqr;	    here->ib_x = d_ib.d1_p;	    here->ib_y = d_ib.d1_q;	    here->ib_x2 = 0.5*model->BJTtype*d_ib.d2_p2;	    here->ib_y2 = 0.5*model->BJTtype*d_ib.d2_q2;	    here->ib_xy = model->BJTtype*d_ib.d2_pq;	    here->ib_x3 = d_ib.d3_p3/6.;	    here->ib_y3 = d_ib.d3_q3/6.;	    here->ib_x2y = 0.5*d_ib.d3_p2q;	    here->ib_xy2 = 0.5*d_ib.d3_pq2;	    here->ibb_x = d_ibb.d1_p;	    here->ibb_y = d_ibb.d1_q;	    here->ibb_z = d_ibb.d1_r;	    here->ibb_x2 = 0.5*model->BJTtype*d_ibb.d2_p2;	    here->ibb_y2 = 0.5*model->BJTtype*d_ibb.d2_q2;	    here->ibb_z2 = 0.5*model->BJTtype*d_ibb.d2_r2;	    here->ibb_xy = model->BJTtype*d_ibb.d2_pq;	    here->ibb_yz = model->BJTtype*d_ibb.d2_qr;	    here->ibb_xz = model->BJTtype*d_ibb.d2_pr;	    here->ibb_x3 = d_ibb.d3_p3/6.;	    here->ibb_y3 = d_ibb.d3_q3/6.;	    here->ibb_z3 = d_ibb.d3_r3/6.;	    here->ibb_x2z = 0.5*d_ibb.d3_p2r;	    here->ibb_x2y = 0.5*d_ibb.d3_p2q;	    here->ibb_y2z = 0.5*d_ibb.d3_q2r;	    here->ibb_xy2 = 0.5*d_ibb.d3_pq2;	    here->ibb_xz2 = 0.5*d_ibb.d3_pr2;	    here->ibb_yz2 = 0.5*d_ibb.d3_qr2;	    here->ibb_xyz = d_ibb.d3_pqr;	    here->qbe_x = d_qbe.d1_p;	    here->qbe_y = d_qbe.d1_q;	    here->qbe_x2 = 0.5*model->BJTtype*d_qbe.d2_p2;	    here->qbe_y2 = 0.5*model->BJTtype*d_qbe.d2_q2;	    here->qbe_xy = model->BJTtype*d_qbe.d2_pq;	    here->qbe_x3 = d_qbe.d3_p3/6.;	    here->qbe_y3 = d_qbe.d3_q3/6.;	    here->qbe_x2y = 0.5*d_qbe.d3_p2q;	    here->qbe_xy2 = 0.5*d_qbe.d3_pq2;	    here->capbc1 = lcapbc1;	    here->capbc2 = lcapbc2;	    here->capbc3 = lcapbc3;	    here->capbx1 = lcapbx1;	    here->capbx2 = lcapbx2;	    here->capbx3 = lcapbx3;	    here->capsc1 = lcapsc1;	    here->capsc2 = lcapsc2;	    here->capsc3 = lcapsc3;	}    }    return(OK);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -