📄 jfetload.c
字号:
if (vgs <= -5*here->JFETtemp*CONSTKoverQ) { ggs = -csat/vgs+ckt->CKTgmin; cg = ggs*vgs; } else { evgs = exp(vgs/(here->JFETtemp*CONSTKoverQ)); ggs = csat*evgs/(here->JFETtemp*CONSTKoverQ)+ckt->CKTgmin; cg = csat*(evgs-1)+ckt->CKTgmin*vgs; } if (vgd <= -5*(here->JFETtemp*CONSTKoverQ)) { ggd = -csat/vgd+ckt->CKTgmin; cgd = ggd*vgd; } else { evgd = exp(vgd/(here->JFETtemp*CONSTKoverQ)); ggd = csat*evgd/(here->JFETtemp*CONSTKoverQ)+ckt->CKTgmin; cgd = csat*(evgd-1)+ckt->CKTgmin*vgd; } cg = cg+cgd; /* * compute drain current and derivitives for normal mode */ if (vds >= 0) { vgst=vgs-model->JFETthreshold; /* * normal mode, cutoff region */ if (vgst <= 0) { cdrain=0; gm=0; gds=0; } else { betap=beta*(1+model->JFETlModulation*vds); twob=betap+betap; if (vgst <= vds) { /* * normal mode, saturation region */ cdrain=betap*vgst*vgst; gm=twob*vgst; gds=model->JFETlModulation*beta*vgst*vgst; } else { /* * normal mode, linear region */ cdrain=betap*vds*(vgst+vgst-vds); gm=twob*vds; gds=twob*(vgst-vds)+model->JFETlModulation*beta* vds*(vgst+vgst-vds); } } } else { /* * compute drain current and derivitives for inverse mode */ vgdt=vgd-model->JFETthreshold; if (vgdt <= 0) { /* * inverse mode, cutoff region */ cdrain=0; gm=0; gds=0; } else { /* * inverse mode, saturation region */ betap=beta*(1-model->JFETlModulation*vds); twob=betap+betap; if (vgdt <= -vds) { cdrain = -betap*vgdt*vgdt; gm = -twob*vgdt; gds = model->JFETlModulation*beta*vgdt*vgdt-gm; } else { /* * inverse mode, linear region */ cdrain=betap*vds*(vgdt+vgdt+vds); gm=twob*vds; gds=twob*vgdt-model->JFETlModulation*beta*vds* (vgdt+vgdt+vds); } } } /* * compute equivalent drain current source */ cd=cdrain-cgd; if ( (ckt->CKTmode & (MODETRAN | MODEAC | MODEINITSMSIG) ) || ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) ){ /* * charge storage elements */ czgs=here->JFETtCGS*here->JFETarea; czgd=here->JFETtCGD*here->JFETarea; twop=here->JFETtGatePot+here->JFETtGatePot; fcpb2=here->JFETcorDepCap*here->JFETcorDepCap; czgsf2=czgs/model->JFETf2; czgdf2=czgd/model->JFETf2; if (vgs < here->JFETcorDepCap) { sarg=sqrt(1-vgs/here->JFETtGatePot); *(ckt->CKTstate0 + here->JFETqgs) = twop*czgs*(1-sarg); capgs=czgs/sarg; } else { *(ckt->CKTstate0 + here->JFETqgs) = czgs*here->JFETf1 + czgsf2*(model->JFETf3 *(vgs- here->JFETcorDepCap)+(vgs*vgs-fcpb2)/ (twop+twop)); capgs=czgsf2*(model->JFETf3+vgs/twop); } if (vgd < here->JFETcorDepCap) { sarg=sqrt(1-vgd/here->JFETtGatePot); *(ckt->CKTstate0 + here->JFETqgd) = twop*czgd*(1-sarg); capgd=czgd/sarg; } else { *(ckt->CKTstate0 + here->JFETqgd) = czgd*here->JFETf1+ czgdf2*(model->JFETf3* (vgd- here->JFETcorDepCap)+(vgd*vgd-fcpb2)/ (twop+twop)); capgd=czgdf2*(model->JFETf3+vgd/twop); } /* * store small-signal parameters */ if( (!(ckt->CKTmode & MODETRANOP)) || (!(ckt->CKTmode & MODEUIC)) ) { if(ckt->CKTmode & MODEINITSMSIG) { *(ckt->CKTstate0 + here->JFETqgs) = capgs; *(ckt->CKTstate0 + here->JFETqgd) = capgd; continue; /*go to 1000*/ } /* * transient analysis */ if(ckt->CKTmode & MODEINITTRAN) { *(ckt->CKTstate1 + here->JFETqgs) = *(ckt->CKTstate0 + here->JFETqgs); *(ckt->CKTstate1 + here->JFETqgd) = *(ckt->CKTstate0 + here->JFETqgd); } error = NIintegrate(ckt,&geq,&ceq,capgs,here->JFETqgs); if(error) return(error); ggs = ggs + geq; cg = cg + *(ckt->CKTstate0 + here->JFETcqgs); error = NIintegrate(ckt,&geq,&ceq,capgd,here->JFETqgd); if(error) return(error); ggd = ggd + geq; cg = cg + *(ckt->CKTstate0 + here->JFETcqgd); cd = cd - *(ckt->CKTstate0 + here->JFETcqgd); cgd = cgd + *(ckt->CKTstate0 + here->JFETcqgd); if (ckt->CKTmode & MODEINITTRAN) { *(ckt->CKTstate1 + here->JFETcqgs) = *(ckt->CKTstate0 + here->JFETcqgs); *(ckt->CKTstate1 + here->JFETcqgd) = *(ckt->CKTstate0 + here->JFETcqgd); } } } /* * check convergence */ if( (!(ckt->CKTmode & MODEINITFIX)) | (!(ckt->CKTmode & MODEUIC))) { if( (icheck == 1)#ifndef NEWCONV || (FABS(cghat-cg) >= ckt->CKTreltol* MAX(FABS(cghat),FABS(cg))+ckt->CKTabstol) || (FABS(cdhat-cd) > ckt->CKTreltol* MAX(FABS(cdhat),FABS(cd))+ckt->CKTabstol) #endif /*NEWCONV*/ ) { ckt->CKTnoncon++; } } *(ckt->CKTstate0 + here->JFETvgs) = vgs; *(ckt->CKTstate0 + here->JFETvgd) = vgd; *(ckt->CKTstate0 + here->JFETcg) = cg; *(ckt->CKTstate0 + here->JFETcd) = cd; *(ckt->CKTstate0 + here->JFETcgd) = cgd; *(ckt->CKTstate0 + here->JFETgm) = gm; *(ckt->CKTstate0 + here->JFETgds) = gds; *(ckt->CKTstate0 + here->JFETggs) = ggs; *(ckt->CKTstate0 + here->JFETggd) = ggd; /* * load current vector */load: ceqgd=model->JFETtype*(cgd-ggd*vgd); ceqgs=model->JFETtype*((cg-cgd)-ggs*vgs); cdreq=model->JFETtype*((cd+cgd)-gds*vds-gm*vgs); *(ckt->CKTrhs + here->JFETgateNode) += (-ceqgs-ceqgd); *(ckt->CKTrhs + here->JFETdrainPrimeNode) += (-cdreq+ceqgd); *(ckt->CKTrhs + here->JFETsourcePrimeNode) += (cdreq+ceqgs); /* * load y matrix */ *(here->JFETdrainDrainPrimePtr) += (-gdpr); *(here->JFETgateDrainPrimePtr) += (-ggd); *(here->JFETgateSourcePrimePtr) += (-ggs); *(here->JFETsourceSourcePrimePtr) += (-gspr); *(here->JFETdrainPrimeDrainPtr) += (-gdpr); *(here->JFETdrainPrimeGatePtr) += (gm-ggd); *(here->JFETdrainPrimeSourcePrimePtr) += (-gds-gm); *(here->JFETsourcePrimeGatePtr) += (-ggs-gm); *(here->JFETsourcePrimeSourcePtr) += (-gspr); *(here->JFETsourcePrimeDrainPrimePtr) += (-gds); *(here->JFETdrainDrainPtr) += (gdpr); *(here->JFETgateGatePtr) += (ggd+ggs); *(here->JFETsourceSourcePtr) += (gspr); *(here->JFETdrainPrimeDrainPrimePtr) += (gdpr+gds+ggd); *(here->JFETsourcePrimeSourcePrimePtr) += (gspr+gds+gm+ggs); } } return(OK);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -