零基础入门智能射频—— 基于python的PCB对数周期天线设计(一)

2022-04-13 来源:微波射频网 作者:江右射频 字号:

1  前言

天线是一种变换器,它把传输线上传播的导行波,变换成在无界媒介(通常是自由空间)中传播的电磁波,或者进行相反的变换。在无线电设备中用来发射或接收电磁波的部件。凡是利用电磁波来传递信息的,都依靠天线来进行工作。一般无源天线都具有可逆性,即同一副天线既可用作发射天线,也可用作接收天线。同一天线作为发射或接收的基本特性参数是相同的。这就是天线的互易定理。

本系列将陆续探究各种类型的天线,通过该系列的学习让刚入行的新人由浅到深地掌握天线设计理论知识,同时也有助于不是天线专业的系统工程师结合系统指标要求,根据各型天线特点对天线选型。

2  对数周期偶极子天线理论

2.1  概述

偶极子天线是一种经典的天线形式,偶极子天线可分为电偶极子和磁偶极子天线两种形态。其中,电偶极子天线在其 E 面,辐射方向图形状为∞,在 H 面,其辐射方向图形状为O形。而磁偶极子在 E 面,H 面的辐射方向图正好与电偶极子的辐射方向图相反。理论上,只要增加单个偶极子的辐射体表面积,便可拓展其带宽,然而当fH/fL>3即实现3个倍频程以上时,此时需要将一组按照一定比例关系偶极子天线组合从而实现超宽带天线,这便是下面要介绍的对数周期偶极子天线(LPDA)。

按照LPDA的实现形式,可以分为线天线和PCB平面天线两大类,如图1所示。LPDA是一种非频变天线,即天线按照任何比例变动后仍等效于其原先的结构,那么,其电性能就与频率不相关,即天线的尺寸与工作的频带按相同百分比变化,天线的特征仍旧稳定。

零基础入门智能射频--基于python的PCB对数周期天线设计(一)

图1 对数周期偶极子天线

2.2  对数周期偶极子天线特点

对数周期偶极子天线具有如下特点:

a) 具有超宽带,通常倍频程可达3以上;

b) 工作带宽范围内增益平坦;

c) 增加偶极子的数量可提高天线增益;

d) 增加偶极子的数量可扩展天线带宽;

但是对于相同尺寸的八木等天线而言,LPDA增益要略低。

2.3  对数周期偶极子天线结构

传统的LPDA天线由一对集合线和N对偶极子组成,如图2所示。两根集合线形成了空气介质的传输线,作为偶极子天线的馈源。在天线后端由金属紧固件固定两根集合线,同时也可看作是短路端。因此,集合线间距决定了传输线的特征阻抗,也决定了天线的驻波比。

零基础入门智能射频--基于python的PCB对数周期天线设计(一)

零基础入门智能射频--基于python的PCB对数周期天线设计(一)

图2 LPDA天线组成

每一对偶极子均直接与集合线相连,这里的集合线就是偶极子天线的馈源。由偶极子天线工作原理可知,偶极子天线的振子长度为工作频率的半波长λ/2,此时LPDA其他振长度如果大于λ/2,则其作用等效于反射器;如果其他振子长度小于λ/2,则其作用等效于导引器,如图3所示。借由不同长度的偶极子天线组合,LDPA扩宽工作频段。

零基础入门智能射频--基于python的PCB对数周期天线设计(一)

图3 LPDA不同频率谐振振子

2.4  传统对数周期偶极子天线设计

a) 参数设计

目前比较实用的LPDA设计法是由卡雷尔提出的,平行排列且相互对称的振子的 N 个交叉馈电构成对数周期偶极天线。Ln表示每个偶极子天线的长度,每个天线振子的末端用一条线连接,其延长线相较于一点,其被称为虚拟顶点,夹角为2α。从虚拟顶点对每个天线单元的垂直距离由Rn表示,各偶极子间距为Sn,每个振子的直径为dn

零基础入门智能射频--基于python的PCB对数周期天线设计(一)

图4  LPDA天线结构

LPDA各参数如下:

顶角α

式中,τ是比例因子,σ是间隔因子。

只要确定了其中的一组振子的直径,其他振子的直径便可依据上述公式得出。但是其计算结果并不利于工程实现,主要有以下原因:

·  找不到参数一样的型材做振子

·  振子型材种类多不利于控制成本

鉴于此,工程实现中通常使用同一口径的振子在保证性能的同时降低生产成本。

b)  工程实现

通常而言,LPDA的集合线是空中的铝材,在集合线的短路端安装射频连接器(如N型、SMA型等),同轴线缆此时穿过空中的其中一个集合线到达LPDA的开路端,实现LPDA的馈电。

零基础入门智能射频--基于python的PCB对数周期天线设计(一)

图5  LPDA天线馈电方式

2.5  PCB平面对数周期偶极子天线设计

2.4节介绍了基于LPDA设计理论的线天线设计,该类型天线受限于加工与装配工艺,通常设计的截至频率为1GHz。而1GHz以上则采用PCB形态实现LPDA,如下图所示。

PCB印制LPDA天线的设计参数也采用卡雷尔设计法。

零基础入门智能射频--基于python的PCB对数周期天线设计(一)

零基础入门智能射频--基于python的PCB对数周期天线设计(一)

图6 PCB LPDA

PCB LPDA天线同样是由一对集合线和N对偶极子组成。其中,

集合线做成PCB走线形式分布于介质板的上下两侧;

各个振子可以按照计算参数实现;

刚性线缆焊接到一侧的集合线上固定,同轴线缆的一头装接插件,另一头通过PCB上的过孔焊机至另一侧的集合线上。

3  基于python的对数周期偶极子天线联合仿真设计

3.1  联合仿真概述

Python语言依靠强大的社区支持和各种大量丰富的数据分析库、人工智能库,使得其在科学计算领域的潜力巨大。因此,从本篇起我们将逐步学习如何借助Python实现天线设计的自动化、智能化设计。

目前脚本语言+HFSS联合设计主要有两种方法:

a)  HFSS加载脚本语言。该方法需要人工打开HFSS软件,然后手动操作HFSS加载脚本语言。

b)  程序调用HFSS。该方法可以实现从打开HFSS、模型建模、参数设置、结果分析等一站式服务。这也是本学习系列的主导方向。

3.2  项目实例

图7所示,在HFSS建立一个PCB LPDA,,PCB选用FR-4材料,PCB顶部和底部均为PCB振子。

a)  参数计算

按照2.4节的计算公式,首先确定比例因子τ和间隔因子σ,这两个参数同时决定了设计的PCB LPDA天线的尺寸。

接着,依次计算得到各个振子的宽度、长度。

零基础入门智能射频--基于python的PCB对数周期天线设计(一)

图7 PLPDA 天线

b)  python建模脚本语言

python脚本语言代码如下,注意和vbs脚本是有区别的。这里包含了从建模、参数设置以及仿真自动运行的命令,下列代码可直接运行。

oAnsoftApp = win32com.client.Dispatch('AnsoftHfss.HfssScriptInterface')

oProject = oDesktop.GetActiveProject()

oProject.InsertDesign("HFSS", "HFSSDesign2", "DrivenModal", "" )

oDesign = oProject.SetActiveDesign("HFSSDesign2")

oEditor = oDesign.SetActiveEditor("3D Modeler")

oEditor.Import(

       [

              "NAME:NativeBodyParameters",

              "HealOption:="            , 0,

              "Options:="           , "-1",

              "FileType:="          , "UnRecognized",

              "MaxStitchTol:="    , -1,

              "ImportFreeSurfaces:=" , False,

              "GroupByAssembly:="  , True,

              "CreateGroup:="          , True,

              "SourceFile:="       , "F:\\LPDA.stp"

       ])

oEditor.AssignMaterial(

       [

              "NAME:Selections",

              "Selections:="        , "top_element,top_element_1"

       ],

       [

              "NAME:Attributes",

              "MaterialValue:="  , "\"pec\"",

              "SolveInside:="             , False,

              "IsMaterialEditable:="    , True,

              "UseMaterialAppearance:=", False

       ])

oEditor.AssignMaterial(

       [

              "NAME:Selections",

              "Selections:="        , "substrate"

       ],

       [

              "NAME:Attributes",

              "MaterialValue:="  , "\"FR4_epoxy\"",

              "SolveInside:="             , True,

              "IsMaterialEditable:="    , True,

              "UseMaterialAppearance:=", False

       ])

oEditor = oDesign.SetActiveEditor("3D Modeler")

oEditor.CreateRectangle(

       [

              "NAME:RectangleParameters",

              "IsCovered:="        , True,

              "XStart:="              , "-1.67001336815218mm",

              "YStart:="              , "3mm",

              "ZStart:="              , "915.17837372953mm",

              "Width:="              , "3.34002673630436mm",

              "Height:="             , "-6mm",

              "WhichAxis:="              , "Z"

       ],

       [

              "NAME:Attributes",

              "Name:="              , "Rectangle1",

              "Flags:="        , "",

              "Color:="       , "(143 175 143)",

              "Transparency:="  , 0,

              "PartCoordinateSystem:=", "Global",

              "UDMId:="            , "",

              "MaterialValue:="  , "\"vacuum\"",

              "SurfaceMaterialValue:=", "\"\"",

              "SolveInside:="             , True,

              "IsMaterialEditable:="    , True,

              "UseMaterialAppearance:=", False

       ])

oEditor.CreateRectangle(

       [

              "NAME:RectangleParameters",

              "IsCovered:="        , True,

              "XStart:="              , "1.67001336815218mm",

              "YStart:="              , "-3mm",

              "ZStart:="              , "10.0200802089131mm",

              "Width:="              , "-3.34002673630436mm",

              "Height:="             , "6mm",

              "WhichAxis:="              , "Z"

       ],

       [

              "NAME:Attributes",

              "Name:="              , "Rectangle2",

              "Flags:="        , "",

              "Color:="       , "(143 175 143)",

              "Transparency:="  , 0,

              "PartCoordinateSystem:=", "Global",

              "UDMId:="            , "",

              "MaterialValue:="  , "\"vacuum\"",

              "SurfaceMaterialValue:=", "\"\"",

              "SolveInside:="             , True,

              "IsMaterialEditable:="    , True,

              "UseMaterialAppearance:=", False

       ])

oModule = oDesign.GetModule("BoundarySetup")

oModule.AssignPerfectE(

       [

              "NAME:PerfE1",

              "Objects:="           , ["Rectangle2"],

              "InfGroundPlane:="      , False

       ])

oModule.AssignLumpedPort(

       [

              "NAME:1",

              "Objects:="           , ["Rectangle1"],

              "RenormalizeAllTerminals:=", True,

              "DoDeembed:="          , False,

              [

                     "NAME:Modes",

                     [

                            "NAME:Mode1",

                            "ModeNum:="             , 1,

                            "UseIntLine:="              , True,

                            [

                                   "NAME:IntLine",

                                   "Start:="         , ["0mm","-3mm","915.17837372953mm"],

                                   "End:="                 , ["0mm","3mm","915.17837372953mm"]

                            ],

                            "AlignmentGroup:="    , 0,

                            "CharImp:="          , "Zpi",

                            "RenormImp:="            , "50ohm"

                     ]

              ],

              "ShowReporterFilter:=" , False,

              "ReporterFilter:="  , [True],

              "Impedance:="             , "50ohm"

       ])

oEditor.Delete(

       [

              "NAME:Selections",

              "Selections:="        , "mesh_assist"

       ])

oModule = oDesign.GetModule("AnalysisSetup")

oModule.InsertSetup("HfssDriven",

       [

              "NAME:Setup1",

              "AdaptMultipleFreqs:="       , False,

              "Frequency:="              , "1.2GHz",

              "MaxDeltaS:="              , 0.02,

              "PortsOnly:="        , False,

              "UseMatrixConv:="       , False,

              "MaximumPasses:="     , 10,

              "MinimumPasses:="     , 1,

              "MinimumConvergedPasses:=", 1,

              "PercentRefinement:=" , 30,

              "IsEnabled:="        , True,

              "BasisOrder:="             , 1,

              "DoLambdaRefine:="    , True,

              "DoMaterialLambda:=" , True,

              "SetLambdaTarget:="   , False,

              "Target:="             , 0.3333,

              "UseMaxTetIncrease:=" , False,

              "PortAccuracy:="   , 2,

              "UseABCOnPort:="       , False,

              "SetPortMinMaxTri:="   , False,

              "UseDomains:="           , False,

              "UseIterativeSolver:="   , False,

              "SaveRadFieldsOnly:=" , False,

              "SaveAnyFields:=" , True,

              "IESolverType:="    , "Auto",

              "LambdaTargetForIESolver:=", 0.15,

              "UseDefaultLambdaTgtForIESolver:=", True,

              "RayDensityPerWavelength:=", 4,

              "MaxNumberOfBounces:=" , 5,

              "InfiniteSphereSetup:="        , -1,

              "SkipSBRSolveDuringAdaptivePasses:=", True

       ])

oModule.InsertFrequencySweep("Setup1",

       [

              "NAME:Sweep",

              "IsEnabled:="        , True,

              "RangeType:="             , "LinearCount",

              "RangeStart:="             , "1GHz",

              "RangeEnd:="       , "2GHz",

              "RangeCount:="           , 10,

              "Type:="        , "Interpolating",

              "SaveFields:="              , False,

              "SaveRadFields:=" , False,

              "InterpTolerance:="      , 0.5,

              "InterpMaxSolns:="       , 250,

              "InterpMinSolns:="       , 0,

              "InterpMinSubranges:="      , 1,

              "ExtrapToDC:="            , False,

              "InterpUseS:="              , True,

              "InterpUsePortImped:="       , False,

              "InterpUsePropConst:="      , True,

              "UseDerivativeConvergence:=", False,

              "InterpDerivTolerance:=", 0.2,

              "UseFullBasis:="    , True,

              "EnforcePassivity:="      , True,

              "PassivityErrorTolerance:=", 0.0001

       ])

oProject.SaveAs("F:\\PLPDA\\Project3.aedt", True)

oDesign.AnalyzeAll()

c)  PLPDA仿真结果

经过HFSS软件运行之后得到图8所示的运行结果。可以看出该频点的天线增益9dBi。

零基础入门智能射频--基于python的PCB对数周期天线设计(一)

图8 PCB LPDA 辐射图

主题阅读:PCB  天线