基于数字双输入的超宽带Doherty功率放大器设计-从理论到ADS版图
参考论文: 高效连续型射频功率放大器研究
假期就要倒计时啦,估计是寒假假期的最后一个博客,希望各位龙年工作顺利,学业有成。
全部工程下载:基于数字双输入的超宽带Doherty功率放大器设计-从理论到ADS版图-ADS工程
不着急的穷学生和穷工程师可以私信我,打6-8折哦!
如果硕士毕业设计用到双输入,也算是比较深入的了,一般都是作为压轴的那一章。
作者我复现了七天,数字双输入的超宽带Doherty实际实现是有一定门槛的,需要对每个输入支路的功率、相位进行扫描,在此进行复现并给出模板、画图代码(虽然我现在不清楚实际测量的时候怎么搞,估计要写个脚本查表吧)。
使用几个频点的数据来近似说明整体的数据:
在0.7-3.1GHz的范围内,饱和输出功率为43.31-44.78dBm,饱和输出增益为10.37-12.24dB,饱和输出效率为60.5-74.07%,回退6dB效率为45.43%-61.5%。
前置文章:单输入Doherty 功率放大器的极限带宽分析(含Matlab分析代码),数字双输入的就是为解决此问题的,。
类似的双输入架构:双输入宽带混合 Doherty-Outphasing功率放大器设计(2021.02 MTT)-从理论到ADS版图
目录
- 基于数字双输入的超宽带Doherty功率放大器设计-从理论到ADS版图
- 0、实现效果展示
- 0.1、版图展示
- 0.2、扫描的结果
- 0.3、实现的效果
- 1、双输入的核心理论
- 1.1、提要
- 1.2、理论推导
- 1.3、所需的约束
- 2、基于ADS与CGH40010F的验证
- 2.1 θ 1 \theta_1 θ1电长度和阻抗的约束实现
- 2.2 θ 2 \theta_2 θ2电长度和阻抗的约束实现
- 2.3 后匹配网络阻抗匹配约束
- 2.4 输入匹配设计
- 3、系统仿真和扫描
- 3.1、系统仿真和扫描原理图
- 3.2、使用Matlab提取数据
- 3.3、画图分析的Matlab代码
- 4、运行环境
0、实现效果展示
基于CGH40010F
这个博客几乎就是对“高效连续型射频功率放大器研究”论文中数字双输入部分的复现,是在原来的基础上进行了一的OPTIM,主要是原来论文里面的微带线参数都是保留一位小数,精度可能不太够。
0.1、版图展示
整体的版图如下,由于是双输入的,有两个输入的端口:
0.2、扫描的结果
数字双输入的超宽带Doherty实际实现是有一定门槛的,需要对每个输入支路的功率、相位进行扫描,此处Pin1 的扫描范围为6-30dBm,Pin2 的扫描范围为6-30dBm,相位差的扫描范围为0-180,最后扫描模板得到的结果如下(例如2700MHz),一般都会对其取包络(使用Matlab脚本提取,后面介绍):
0.3、实现的效果
因为需要对每个频率下的参数进行扫描,所以取几个频率点的数据进行参考,使用几个频点的数据来近似说明整体的数据:
在0.7-3.1GHz的范围内,饱和输出功率为43.31-44.78dBm,饱和输出增益为10.37-12.24dB,饱和输出效率为60.5-74.07%,回退6dB效率为45.43%-61.5%。
使用Matlab脚本提取包络,700MHz效率与增益结果如下所示,在700MHz,实现了44.78dBm的饱和输出功率,12.24dB的饱和增益,饱和效率为72.2%,回退6dB效率为50.13%:
使用Matlab脚本提取包络,1500MHz效率与增益结果如下所示,在1500MHz,实现了43.38dBm的饱和输出功率,10.37dB的饱和增益,饱和效率为60.5%,回退6dB效率为61.5%:
使用Matlab脚本提取包络,2300MHz效率与增益结果如下所示,在2300MHz,实现了44.31dBm的饱和输出功率,11.3dB的饱和增益,饱和效率为70.48%,回退6dB效率为45.43%:
使用Matlab脚本提取包络,3100MHz效率与增益结果如下所示,在3100MHz,实现了43.3dBm的饱和输出功率,11.68dB的饱和增益,饱和效率为74.07%,回退6dB效率为49.91%:
1、双输入的核心理论
1.1、提要
单输入Doherty 功率放大器的极限带宽分析(含Matlab分析代码)中分析了单输入DPA的极限带宽。在传统单输入DPA中,存在固定的载波功放和固定的峰值功放,因此在回退点的等效电路是固定的(峰值功放视为开路),如:
但是,如果我们能够自定义输入功率,从而自定义哪个功放充当峰值功放和载波功放,就可以在回退时获得两种工作模式(相当于有两种电路了,自然带宽可以拓展):
1.2、理论推导
上图中, θ 1 \theta_1 θ1 θ 2 \theta_2 θ2都和频率相关,所提及的角度是在f0出的电长度。(先简单回顾一下一个基础知识,在 f 0 f_{0} f0处电长度为180,那么在x f 0 f_{0} f0处其等效电长度为x180。例如,在在 f 0 f_{0} f0处电长度为180,那么在2 f 0 f_{0} f0处其等效电长度为2180=360。)
为了简便起见,首先假设在某一工作频点处
θ
1
=
90
\theta_1=90
θ1=90,观察
θ
2
\theta_2
θ2的取值和带宽的关系(下面都使用Matlab脚本分析画图得到,分别对两种模式进行分析):
直观一些,可以看到无论
θ
2
\theta_2
θ2取何值,双输入 Doherty 功放在归一化频率f = 2处效率恶化严重。此时,工作在模式 I 下的双输入 Doherty 功放只有在f为 1 或者 3 附近具有良好的回退效率(红色鲜艳)。
可以看出,在工作模式 II 下,当 θ 2 \theta_2 θ2约为45°时,双输入 Doherty 功放在归一化频率1.3-2.6 之间可以获得良好的回退效率;而当 θ 2 \theta_2 θ2为其他值时,双输入 Doherty 功放只能在某一小频率区间获得良好的回退效率。
分析代码:
clc
clear
close all
Ropt=1;
% 相对带宽表达式
f0=1;
f_arrary=f0*linspace(0.6, 3.3, 99);
theta_1=90;
theta_2=0:5:180;
figure(1)
subplot(2,1,1)
[X,Y] = meshgrid(f_arrary,theta_2);
for i=1:1:length(theta_2)
for j=1:1:length(X)
Z(i,j)=DPA_Effi_Cal_v2(X(i,j),90,Y(i,j));
end
end
surf(Y,X,Z);
title('双输入 Doherty 功放工作在模式 I')
colormap jet%jet是一种配色方案,还有其他方案如winter,summer····见help colormap
colorbar
xlabel('\theta_2');
ylabel('归一化频率');
zlabel('Efficiency(%)');
subplot(2,1,2)
[X,Y] = meshgrid(f_arrary,theta_2);
for i=1:1:length(theta_2)
for j=1:1:length(X)
Z(i,j)=DPA_Effi_Cal_v2(X(i,j),Y(i,j),90);
end
end
surf(Y,X,Z);
title('双输入 Doherty 功放工作在模式 II')
colormap jet%jet是一种配色方案,还有其他方案如winter,summer····见help colormap
colorbar
xlabel('\theta_2');
ylabel('归一化频率');
zlabel('Efficiency(%)');
1.3、所需的约束
θ 1 \theta_1 θ1在f1处电长度为90°, θ 2 \theta_2 θ2在f1处电长度为45°,延时的变化符合微带线基本特性( θ 1 \theta_1 θ1在f2处电长度为2 * 90°, θ 2 \theta_2 θ2在f2处电长度为2 * 45°,以此类推)。
此外,TL1和TL2的阻抗要是Ropt,B类最佳阻抗。
负载RL的阻抗为Ropt/2,需要使用后匹配网络匹配到50欧姆。
2、基于ADS与CGH40010F的验证
作者论文中参数都是有效的,我是在原来的基础上进行了一的OPTIM,主要是原来论文里面的微带线参数都是保留一位小数,精度可能不太够。
作者Ropt选的是30欧姆,漏极电压28V,栅极电压-3.3V。
2.1 θ 1 \theta_1 θ1电长度和阻抗的约束实现
Output/OutputSub_TL2原理图
微带线TL2的在f1处电长度为90°,阻抗为Ropt,延时的变化符合微带线基本特性(
θ
1
\theta_1
θ1在f2处电长度为2 * 90°,以此类推)。构建优化:
查看阻抗和延时的实现效果,比较好:
2.2 θ 2 \theta_2 θ2电长度和阻抗的约束实现
Output/OutputSub_TL1原理图
微带线TL1的在f1处电长度为45°,阻抗为Ropt,延时的变化符合微带线基本特性(
θ
2
\theta_2
θ2在f2处电长度为2 * 45°,以此类推)。构建优化:
查看结果,差的不多:
2.3 后匹配网络阻抗匹配约束
Output/OutputSub_PMN
理论负载是Ropt/2,需要把Ropt/2变换到50欧姆,也就是要把15欧姆变换到50欧姆,构建优化:
匹配良好:
2.4 输入匹配设计
Input/InputMatch_Sub
输入匹配要求不高,我直接用作者提供的电路,需要自己设计的可以使用源牵引方法,参考:番外5:ADS功放设计之负载牵引与源牵引、ADS使用记录之AB类功放设计。
电路图如下:
匹配效果还可以:
3、系统仿真和扫描
3.1、系统仿真和扫描原理图
Test/HB1ToneGComp2swp_v1
双输入架构使用俩个输入端口,扫描的相位差为变量My_Delay:
Param1就是Pin1的输入功率,Param2就是Pin2的输入功率,My_Delay为扫描的相位差,RFfreq为当前的频率,需要自己设置:
运行得到结果,:
3.2、使用Matlab提取数据
把上面表格的数据导出为csv:
打开我提供的Matlab代码,修改名字为你的csv文件名,此外需要手动修改Mydelay为你ADS中所设的的延迟扫描参数,例如:
% 输入csv的名字
csv_name='3100.csv';
% 手动设定扫描延时
Mydelay=-180:5:0;
运行Matlab即可。
全部代码:
运行代码,可以得到效率、增益和所需的输入功率、延迟等信息(2700MHz):
作者也提供了输入功率、相位差数据,可以对比一下,其中两路的输入功率数据是高度一致的::
3.3、画图分析的Matlab代码
DPA_Effi_Cal_v2.m
function [effi] = DPA_Effi_Cal_v2(freq,theta_1,theta_2)
% theta是对于f0而言的,此处来计算在freq处的角度
theta_1=theta_1*freq/1;
theta_2=theta_2*freq/1;
Ropt=1;
RL=Ropt/2;
ZP_OPBO=Ropt./(1j*tand(theta_2));% 峰值负载为无穷
ZC_OPBO=1./(1/RL+1./ZP_OPBO);% 并联关系
ZCB=Ropt*(ZC_OPBO+1j*Ropt*tand(theta_1))./(Ropt+1j*ZC_OPBO.*tand(theta_1));% Zin计算
effi=78.54*real(ZCB)/(2*Ropt);% 计算效率,阻抗大于2Ropt被认为是饱和,效率为78.54
effi(effi>78.54)=78.54;
effi(isnan(effi))=78.54;
end
draw_data.m
clc
clear
close
% 输入csv的名字
csv_name='3100.csv';
data=readmatrix(csv_name);%csvread只能读取纯数据
% 手动设定扫描延时
Mydelay=-180:5:0;
%添加延时数据到data数组
repeat_times=length(data)/length(Mydelay);
Mydelay_data=[];
for ind=1:1:repeat_times
Mydelay_data=[Mydelay_data Mydelay];
end
data(:,5)=Mydelay_data;
Pout_dbm=data(:,3);%提取输出功率数据
Pout_dbm_Draw_step=0.4;
Pout_dbm_Draw=min(Pout_dbm):Pout_dbm_Draw_step:max(Pout_dbm);
for ind=1:1:length(Pout_dbm_Draw)
eval(['Pout_dbm_DataAll.data', num2str(ind), '= [];']);
end
% 获取每个输出功率为Pout_dbm_Draw附近的点数据
for ind=1:1:length(data)
for j=1:1:length(Pout_dbm_Draw)
if abs(data(ind,3)-Pout_dbm_Draw(j))<=Pout_dbm_Draw_step/2
eval(['Pout_dbm_DataAll.data', num2str(j), '=[Pout_dbm_DataAll.data', num2str(j),';data(ind,:)];']);
end
end
end
% 对每个数据提取最佳的效率点,并记录输入功率、延时等等
for ind=1:1:length(Pout_dbm_Draw)
% 判断是否是空数组
if eval(['isempty(Pout_dbm_DataAll.data',num2str(ind), ')'])
eval('DrawData.Pin_1(ind)=NaN;');
eval('DrawData.Pin_2(ind)=NaN;');
eval('DrawData.Pout_dbm_Real(ind)=NaN;');
eval('DrawData.Efficiency(ind)=NaN;');
eval('DrawData.Delay(ind)=NaN;');
else
eval(['[max_val,max_ind]=max(Pout_dbm_DataAll.data', num2str(ind), '(:,4));']);
eval(['DrawData.Pin_1(ind)=Pout_dbm_DataAll.data', num2str(ind), '(max_ind,1);']);
eval(['DrawData.Pin_2(ind)=Pout_dbm_DataAll.data', num2str(ind), '(max_ind,2);']);
eval(['DrawData.Pout_dbm_Real(ind)=Pout_dbm_DataAll.data', num2str(ind), '(max_ind,3);']);
eval(['DrawData.Efficiency(ind)=Pout_dbm_DataAll.data', num2str(ind), '(max_ind,4);']);
eval(['DrawData.Delay(ind)=Pout_dbm_DataAll.data', num2str(ind), '(max_ind,5);']);
end
end
% 空数组插值
DrawData.Pin_1 = fillmissing(DrawData.Pin_1,'movmean',5);
DrawData.Pin_2 = fillmissing(DrawData.Pin_2,'movmean',5);
DrawData.Pout_dbm_Real = fillmissing(DrawData.Pout_dbm_Real,'movmean',5);
DrawData.Efficiency = fillmissing(DrawData.Efficiency,'movmean',5);
DrawData.Delay = fillmissing(DrawData.Delay,'movmean',5);
% 计算总的输入功率
DrawData.PinAll=10*log10((10.^(0.1*(DrawData.Pin_1-30)))+(10.^(0.1*(DrawData.Pin_2-30))))+30;
% 计算增益
DrawData.Gain=DrawData.Pout_dbm_Real-DrawData.PinAll;
% 画图
figure(1)
plot(DrawData.Pout_dbm_Real,DrawData.Efficiency,'-o','Color','r','LineWidth',1);hold on
ylabel('Drain Efficiency(%),Gain(dB)');xlabel('Pout(dBm)');
plot(DrawData.Pout_dbm_Real,DrawData.Gain,'-square','Color','magenta','LineWidth',1);hold on
legend('Efficiency', 'Gain')
title(csv_name)
figure(2)
plot(DrawData.Pout_dbm_Real,DrawData.Pin_1,'-v','Color','b','LineWidth',1);hold on
plot(DrawData.Pout_dbm_Real,DrawData.Pin_2,'-v','Color','b','LineWidth',1);hold on
ylabel('Pin(dBm)');xlabel('Pout(dBm)');
yyaxis right
plot(DrawData.Pout_dbm_Real,abs(DrawData.Delay),'-o','Color','black','LineWidth',1);
ylabel('Delay(°)');
legend('Pin_1', 'Pin_2','Delay')
title(csv_name)
4、运行环境
ADS版本:ADS2023
依赖的ADS库文件:Cree公司的GAN库,CGH40010F管子、(文件中包含,但可能要调整路径)