这里主要有L型匹配和PI型匹配两种
#include <math.h>
#include <stdio.h>
#include<stdlib.h>
void main()
{
double RL,XL,Q,Rs;
double Q1,Q2,Qe,L1,L2,L3,XL1,XL2,B,Ri,XC1,XC2,C1,C2,C;
double Freq,w,Xs,Xp,ind,cap;
int i=1,goon=1,select;
do{
i=0;
printf("请输入工作频率(MHz) Frequency = ");
scanf("%lf",&Freq);
printf(" 请输入源阻抗 Rs = ");
scanf("%lf",&Rs);
printf(" 输入实部 Real(Z) = ");
scanf("%lf",&RL);
printf(" 输入虚部 Imag(Z) = ");
scanf("%lf",&XL);
if(XL > 0)
printf("=========在%g Hz下,需要进行匹配的阻抗为%g + j*%g\n\n",Freq,RL,XL);
else
printf("=========在%g Hz下,需要进行匹配的阻抗为%g - j*%g\n\n",Freq,RL,-XL);
printf(" L型匹配请按-------1 PI型匹配请按-------2\n Input: ");
scanf("%d",&select);
if(select==1)
{
if(RL < Rs)
{
Q = sqrt(Rs/RL-1);
Xs = Q * RL;
Xp = Rs/Q;
w = 2*3.1416*Freq*1e6;
ind = Xs*1e6/w-XL*1e6/w;
cap = 1e6/(Xp*w);
printf("\n\n ******先并后串******* \n");
if(cap >= 1)
printf("第一种匹配方式:\n----C1 = %.3f uF",cap);
else if(cap*1e3 > 1)
printf("第一种匹配方式:\n----C1 = %.3f nF",cap*1e3);
else if(cap*1e6 > 1)
printf("第一种匹配方式:\n----C1 = %.3f pF",cap*1e6);
else
printf("第一种匹配方式:\n----C1 = %.3f fF",cap*1e9);
if(ind >= 1)
printf(" L1 = %.3f uH\n",ind);
else if(ind*1e3 > 1)
printf(" L1 = %.3f nH\n",ind*1e3);
else
printf(" L1 = %.3f pH\n",ind*1e6);
ind = Xp*1e6/w;
if (XL == 0)
cap = 1e6/(Xs*w);
else
cap = 1/(1/(1e6/(Xs*w))+1/(1e6/(XL*w)));
if(ind >= 1)
printf("第二种匹配方式:\n----L1 = %.3f uH",ind);
else if(ind*1e3 > 1)
printf("第二种匹配方式:\n----L1 = %.3f nH",ind*1e3);
else
printf("第二种匹配方式:\n----L1 = %.3f pH",ind*1e6);
if(cap >= 1)
printf(" C1 = %.3f uF\n",cap);
else if(cap*1e3 > 1)
printf(" C1 = %.3f nF\n",cap*1e3);
else if(cap*1e6 > 1)
printf(" C1 = %.3f pF\n",cap*1e6);
else
printf(" C1 = %.3f fF\n",cap*1e9);
}
else
{
Q = XL/RL;
RL = RL*(1+Q*Q);
XL = XL*(1+1/(Q*Q));
Q = sqrt(RL/Rs-1);
Xs = Q * Rs;
Xp = RL/Q;
w = 2*3.1416*Freq*1e6;
ind = Xs*1e6/w;
if (XL == 0)
cap = 1e6/(Xp*w);
else
cap = 1e6/(Xp*w)+1e6/(XL*w);
printf("\n\n --------先串后并--------\n");
if(ind >= 1)
printf("第一种匹配方式:\n----L1 = %.3f uH",ind);
else if(ind*1e3 > 1)
printf("第一种匹配方式:\n----L1 = %.3f nH",ind*1e3);
else
printf("第一种匹配方式:\n----L1 = %.3f pH",ind*1e6);
if(cap >= 1)
printf(" C1 = %.3f uF\n",cap);
else if(cap*1e3 > 1)
printf(" C1 = %.3f nF\n",cap*1e3);
else if(cap*1e6 > 1)
printf(" C1 = %.3f pF\n",cap*1e6);
else
printf(" C1 = %.3f fF\n",cap*1e9);
if (XL == 0)
ind = Xp*1e6/w;
else
ind = 1/(1/(Xp*1e6/w)-1/(XL*1e6/w));
cap = 1e6/(Xs*w);
if(cap >= 1)
printf("第二种匹配方式:\n----C1 = %.3f uF",cap);
else if(cap*1e3 > 1)
printf("第二种匹配方式:\n----C1 = %.3f nF",cap*1e3);
else if(cap*1e6 > 1)
printf("第二种匹配方式:\n----C1 = %.3f pF",cap*1e6);
else
printf("第二种匹配方式:\n----C1 = %.3f fF",cap*1e9);
if(ind >= 1)
printf(" L1 = %.3f uH\n",ind);
else if(ind*1e3 > 1)
printf(" L1 = %.3f nH\n",ind*1e3);
else
printf(" L1 = %.3f pH\n",ind*1e6);
}
}
else if(select==2)
{
XL=0-XL;
printf("====该匹配需要确定 Q= ");
scanf("%lf",&Qe);
Q2=2*Qe;
Ri=(RL/(1+Q2*Q2));
XL2=RL/Q2;
XC2=Q2*Ri;
Q1=sqrt((50/Ri)-1);
XL1=50/Q1;
XC1=Q1*Ri;
w=2*3.14159*Freq*1E6;
C1=1/(w*XC1);
C2=1/(w*XC2);
C=(C1*C2)/(C1+C2);
L1=XL1/w;
L2=XL2/w;
L3=XL/w;
B=Freq/Q2;
printf("*************在%g MHz下,匹配的样式如下:并L1,串C,并L2,串L3\n",Freq);
if((L1 >= 1E-6)&&(L1 <= 1E-3))
printf("==========先并联电感L1为 %.2f uH",L1*1E6);
if((L1 >= 1E-9)&&(L1 <= 1E-6))
printf("==========先并联电感L1为 %.2f nH",L1*1E9);
if((L1 >= 1E-12)&&(L1 <= 1E-9))
printf("==========先并联电感L1为 %.2f pH",L1*1E12);
if((C >= 1E-6)&&(C <= 1E-3))
printf("再串联电容C为 %.2f uF\n",C*1E6);
if((C >= 1E-9)&&(C <= 1E-6))
printf("再串联电容C为 %.2f nF\n",C*1E9);
if((C >= 1E-12)&&(C <= 1E-9))
printf("再串联电容C为 %.2f pF\n",C*1E12);
if((C >= 1E-15)&&(C <= 1E-12))
printf("再串联电容C为 %.2f fF\n",C*1E15);
if((L2 >= 1E-6)&&(L2 <= 1E-3))
printf("==========然后并联电感L2为 %.2f uH",L2*1E6);
if((L2 >= 1E-9)&&(L2 <= 1E-6))
printf("==========然后并联电感L2为 %.2f nH",L2*1E9);
if((L2 >= 1E-12)&&(L2 <= 1E-9))
printf("==========然后并联电感L2为 %.2f pH",L2*1E12);
if((L3 >= 1E-6)&&(L3 <= 1E-3))
printf("最后串联电感L3为 %.2f uH\n",L3*1E6);
if((L3 >= 1E-9)&&(L3 <= 1E-6))
printf("最后串联电感L3为 %.2f nH\n",L3*1E9);
if((L3 >= 1E-12)&&(L3 <= 1E-9))
printf("最后串联电感L3为 %g.2f pH\n",L3*1E12);
if((B >= 1E-3)&&(B <= 1))
printf("带宽为 %g MHz\n",B*1E3);
else
printf("带宽为 %g MHz\n",B);
}
else
i=1;
printf("\n=======是否继续阻抗匹配,继续请按1,退出请按任意键=========\n\n\n");
scanf("%d",&goon);
if(goon==1)
i=1;
else
i=0;
}
while(i==1);
}