利用Python与HFSS联合仿真设计微带天线(全文共附260多行代码)

电子万花筒 2022-05-24 08:17
电子万花筒平台核心服务

 中国最活跃的射频微波天线雷达微信技术群

电子猎头:帮助电子工程师实现人生价值! 

电子元器件:价格比您现有供应商最少降低10%

射频微波天线新产品新技术发布平台:让更多优秀的国产射频微波产品得到最好的宣传!发布产品欢迎联系管理,专刊发布!强力曝光!


部分api设计参考使用了Matthew Radway在github中分享的Interact with ANSYS HFSS via the HFSS Windows COM API。

地址:http://mradway.github.io/hycohanz/


我们知道HFSS是一款电磁仿真商用软件,用其进行天线的设计十分方便。而该软件也预留了可以运行脚本的接口,使用者可以使用脚本对软件进行控制,实现模型的建立、求解等等。由于后期可能会用到联合仿真,而大多数联合仿真的脚本都是使用的Matlab进行编程,网上也有不少现成的api,因为对python比较熟悉,且python除了数值计算其他的功能也相当强大,并且免费开源,于是决定用python写一个建模的脚本(其实是我matlab学得太烂了),折腾了两天,终于把微带天线的模型建立与仿真的过程搞定了,当然是基于有Matthew Radway这位大牛的基础上。这个例子也是接触HFSS时手绘天线做的第一个例子,现在用代码做一遍,也是很有意思的事情。下面分享给大家。


1、连接软件


GetAppDesktop

Use:     GetAppDesktopis a function of    oAnsoftApp. This function does not take an input and it returns an object. The object is assigned to the variable   oDesktop.

Syntax:              GetAppDesktop()

Return Value:    Object.

Parameters:      None

Example:     

Set oDesktop = oAnsoftApp.GetAppDesktop()


给出了函数名,参数值,返回值,以及一个实例(这个帮助文档写得很不错,但是后面阅读过程中也发现了一些小错误,当然很可能是因为我用的是daoban)。这个返回值oAnsoftApp就是后面进行一系列操作要使用的对象,所有的操作的形式都是下面这样:oAnsoftApp.


python中编写了一个接口函数把这个函数封装在里面。代码如下:


  1. from __future__ import division, print_function, unicode_literals, absolute_import

  2.  

  3. import win32com.client

  4.  

  5. def setup_interface():

  6.     """

  7.     Set up the COM interface to the running HFSS process.

  8.     

  9.     Returns

  10.     -------

  11.     oAnsoftApp : pywin32 COMObject

  12.         Handle to the HFSS application interface

  13.     oDesktop : pywin32 COMObject

  14.         Handle to the HFSS desktop interface

  15.     

  16.     Examples

  17.     --------

  18.     >>> import Hyphasis as hfss

  19.     >>> [oAnsoftApp, oDesktop] = hfss.setup_interface()

  20.     

  21.     """

  22.     # I'm still looking for a better way to do this.  This attaches to an 

  23.     # existing HFSS process instead of creating a new one.  I would highly 

  24.     # prefer that a new process is created.  Apparently 

  25.     # win32com.client.DispatchEx() doesn't work here either.

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

  27.  

  28.     oDesktop = oAnsoftApp.GetAppDesktop()

  29.  

  30.     return [oAnsoftApp, oDesktop]


作者用了win32com.client.Dispatch()这个函数,这个函数是专门用来连接接口的,返回值中的那个oDesktop就是生成的对象。


实际调用代码:[oAnsoftApp, oDesktop] = hfss.setup_interface()



2、新建一个project


oProject = hfss.new_project(oDesktop)


这里就是用了上面生成的oDesktop对象新建了一个object,具体查阅help文档和编写api的工作和上一步一致,并且平时使用时直接使用接口调用即可。注意,下面进行的操作都在这个project中,所以下面操作的对象就是oProject了。这个时候HFSS里应该长这样了。



3、保存project


养成良好习惯,新建的文件之后先保存,在编写过程中因为没有先保存,生成了一堆临时文件,挺讨厌的。这个传人的参数可以包含路径。

hfss.save_as_project(oDesktop,"E:/dj/test/microstrip_antenna.hfss")


4、新建一个design


这里传人的参数为design的名字,设计模式。

oDesign = hfss.insert_design(oProject, "HFSSDesign1", "DrivenModal")

新建完成后发现和我们手动操作是一样的。



5、建立模型

教程中首先新建了一个地板,并设置为PEC。这里也分别调用了这两个函数,尺寸可以用字符串输入,很方便灵活,不需要自己转换为一堆小数点的数字。设置PEC表面首先需要获得平面的faceid,再给这个表面设置边界条件。

  1. raw_input('Press "Enter" to draw a ground plane>')

  2.  

  3. ground = hfss.create_rectangle(

  4.     oEditor,   

  5.     "-45mm", 

  6.     "-45mm", 

  7.     0,

  8.     "90mm", 

  9.     "90mm",

  10.     Name='ground',

  11.     Transparency=0.8)

  12.  

  13. raw_input('Press "Enter" to assign a PerfectE boundary condition on the ground.>')

  14. ground_faceid=[]

  15. ground_faceidnum = hfss.get_face_by_position(oEditor, ground, 0, 0, 0)

  16. print ground_faceidnum

  17. ground_faceid.append(ground_faceidnum)

  18. hfss.assign_perfect_e(oDesign, "ground", ground_faceid)


由于建模过程比较类似,这里就不逐个给出了,模型建立完毕如下图(包括了设置边界条件和设置端口):


6、设置求解和扫频

这里求解函数传人了中心频点;扫频传入了扫频方式,起始频率和终止频率,频率间隔。

  1. raw_input('Press "Enter" to insert analysis setup.>')  

  2.  

  3. setuplist=[]

  4.  

  5. setupname = hfss.insert_analysis_setup(oDesign, 2.45)

  6.  

  7. setuplist.append(setupname) 

  8.  

  9. raw_input('Press "Enter" to insert frequency sweep.>')  

  10.  

  11. hfss.insert_frequency_sweep(oDesign,

  12.                             setupname,

  13.                             "Sweep1",

  14.                             1.5,

  15.                             3.5,

  16.                             0.1,

  17.                             IsEnabled=True,

  18.                             SetupType="LinearStep",

  19.                             Type="Discrete",

  20.                             SaveFields=True,

  21.                             ExtrapToDC=False)


7、求解

对于每个setup进行求解。是不是和手动操作是一样的?

hfss.solve(oDesign,setuplist)


8、退出HFSS

hfss.quit_application(oDesktop)

结束语:

今天暂时研究到这儿,还有很多比如查看求解完成后的驻波、增益曲线等等还有设置主从边界啦很多的api还没有编写,有时间会继续完善。

做了个有趣的小玩意儿,分享给大家~

完整主函数源码(api部分还不是很完整,哦,相当不完整,就先不给出了):


  1. # -*- coding: utf-8 -*-

  2. """

  3. Created on Fri Apr 22 14:29:38 2016

  4. @author: DJ

  5. """

  6.  

  7. from __future__ import division

  8.  

  9. import hycohanz as hfss

  10.  

  11. raw_input('Press "Enter" to connect to HFSS.>')

  12.  

  13. [oAnsoftApp, oDesktop] = hfss.setup_interface()

  14.  

  15. raw_input('Press "Enter" to create a new project.>')

  16.  

  17. oProject = hfss.new_project(oDesktop)

  18.  

  19. raw_input('Press "Enter" to save the project.>') 

  20.  

  21. hfss.save_as_project(oDesktop,"E:/dj/test/microstrip_antenna.hfss")

  22.  

  23. raw_input('Press "Enter" to insert a new DrivenModal design named HFSSDesign1.>')

  24.  

  25. oDesign = hfss.insert_design(oProject, "HFSSDesign1", "DrivenModal")

  26.  

  27. raw_input('Press "Enter" to set the active editor to "3D Modeler" (The default and only known correct value).>')

  28.  

  29. oEditor = hfss.set_active_editor(oDesign)

  30.  

  31. raw_input('Press "Enter" to draw a ground plane>')

  32.  

  33. ground = hfss.create_rectangle(

  34.     oEditor,   

  35.     "-45mm", 

  36.     "-45mm", 

  37.     0,

  38.     "90mm", 

  39.     "90mm",

  40.     Name='ground',

  41.     Transparency=0.8)

  42.  

  43. raw_input('Press "Enter" to assign a PerfectE boundary condition on the ground.>')

  44. ground_faceid=[]

  45. ground_faceidnum = hfss.get_face_by_position(oEditor, ground, 0, 0, 0)

  46. print ground_faceidnum

  47. ground_faceid.append(ground_faceidnum)

  48. hfss.assign_perfect_e(oDesign, "ground", ground_faceid)

  49.     

  50. raw_input('Press "Enter" to insert some substrate properties into the design.>')

  51.  

  52. hfss.add_property(oDesign, "w", hfss.Expression("80mm"))

  53. hfss.add_property(oDesign, "h", hfss.Expression("5mm"))

  54.  

  55. raw_input('Press "Enter" to draw a substrate using the properties.>')

  56.  

  57. substrate = hfss.create_box(

  58.     oEditor,   

  59.     -hfss.Expression("w")/2, 

  60.     -hfss.Expression("w")/2, 

  61.     0,

  62.     hfss.Expression("w"), 

  63.     hfss.Expression("w"),

  64.     hfss.Expression("h"),

  65.     Name='substrate',

  66.     Transparency=0.8)

  67.     

  68. raw_input('''Press "Enter" to change the substrate's material to Rogers 4003>''')

  69.  

  70. hfss.assign_material(oEditor, [substrate], MaterialName="Rogers RO4003 (tm)")

  71.  

  72. raw_input('Press "Enter" to insert some patch properties into the design.>')

  73.  

  74. hfss.add_property(oDesign, "w_p", hfss.Expression("31.0mm"))

  75. hfss.add_property(oDesign, "l_p", hfss.Expression("41.4mm"))

  76.  

  77. raw_input('Press "Enter" to draw a patch>')

  78.  

  79. patch = hfss.create_rectangle(

  80.     oEditor,   

  81.     -hfss.Expression("w_p")/2, 

  82.     -hfss.Expression("l_p")/2, 

  83.     hfss.Expression("h"),

  84.     hfss.Expression("w_p"), 

  85.     hfss.Expression("l_p"),

  86.     Name='patch',

  87.     Transparency=0.8)

  88.  

  89. raw_input('Press "Enter" to assign a PerfectE boundary condition on the patch.>')

  90. patch_faceid=[]

  91. print hfss.Expression("h")

  92. patch_faceidnum = hfss.get_face_by_position(oEditor, patch, 0, 0, 0.005) #hardcode!!

  93. #print ground_faceidnum

  94. patch_faceid.append(patch_faceidnum)

  95. hfss.assign_perfect_e(oDesign, "patch", patch_faceid)

  96.  

  97. raw_input('Press "Enter" to draw a Coaxial core>')

  98.  

  99. Coaxial_core = hfss.create_cylinder(

  100.     oEditor,   

  101.     "9.5mm", 

  102.     0, 

  103.     0,

  104.     "0.5mm", 

  105.     "5mm",

  106.     Name='Coaxial_core',

  107.     Transparency=0.8)

  108.     

  109. raw_input('''Press "Enter" to change the Coaxial_core's material to copper>''')

  110.  

  111. hfss.assign_material(oEditor, [Coaxial_core], MaterialName="copper")

  112.  

  113. raw_input('Press "Enter" to draw a Signal transmission port>')

  114.  

  115. port = hfss.create_circle(

  116.     oEditor,   

  117.     "9.5mm", 

  118.     0, 

  119.     0,

  120.     "1.5mm", 

  121.     Name='port',

  122.     Transparency=0.8)

  123.  

  124. raw_input('Press "Enter" to subtract the transmission port from the ground.>')

  125.  

  126. hfss.subtract(oEditor, [ground], [port], KeepOriginals=True)

  127.  

  128. raw_input('Press "Enter" to draw an air box>')

  129.  

  130. air = hfss.create_box(

  131.     oEditor,   

  132.     '-80mm', 

  133.     '-80mm', 

  134.     0,

  135.     '160mm', 

  136.     '160mm',

  137.     '75mm',

  138.     Name='air',

  139.     Transparency=0.8)

  140.     

  141. raw_input('Press "Enter" to assign a Radiation boundary condition for the air box.>')

  142. air_objectid=[]

  143. air_objectidnum = hfss.get_object_id_by_name(oEditor, "air")

  144. #print ground_faceidnum

  145. air_objectid.append(air_objectidnum)

  146. print air_objectid

  147. hfss.assign_radiation(oDesign, objectname=['air'], Name='Air')

  148.  

  149. raw_input('Press "Enter" to assign a lumped port on the port.>')

  150.  

  151. port_faceid=[]

  152.  

  153. port_faceidnum = hfss.get_face_by_position(oEditor, port, "9.5mm", 0, 0) #hardcode!!

  154. #print port_faceidnum

  155. port_faceid.append(port_faceidnum)

  156. hfss.assign_lumpedport_multimode(oDesign, "port", port_faceid,["10mm","0mm","0mm"],["11mm","0mm","0mm"])

  157.  

  158. raw_input('Press "Enter" to insert analysis setup.>')  

  159.  

  160. setuplist=[]

  161.  

  162. setupname = hfss.insert_analysis_setup(oDesign, 2.45)

  163.  

  164. setuplist.append(setupname) 

  165.  

  166. raw_input('Press "Enter" to insert frequency sweep.>')  

  167.  

  168. hfss.insert_frequency_sweep(oDesign,

  169.                             setupname,

  170.                             "Sweep1",

  171.                             1.5,

  172.                             3.5,

  173.                             0.1,

  174.                             IsEnabled=True,

  175.                             SetupType="LinearStep",

  176.                             Type="Discrete",

  177.                             SaveFields=True,

  178.                             ExtrapToDC=False)

  179.  

  180. raw_input('Press "Enter" to solve the setup.>') 

  181.  

  182. hfss.solve(oDesign,setuplist)

  183.  

  184. raw_input('Press "Enter" to quit HFSS.>')

  185.  

  186. hfss.quit_application(oDesktop)

  187.  

  188. del oEditor

  189. del oDesign

  190. del oProject

  191. del oDesktop

  192. del oAnsoftApp


欢迎射频微波雷达通信工程师关注公众号



中国最纯粹的射频微波雷达通信工程师微信技术群,欢迎您的加入,来这里一起交流和讨论技术吧!进群记得备注方向和公司名称哦,我们将邀请您进细分群!

用手指按住就可以加入微信技术群哦!



电子万花筒平台自营:Xilinx ALTERA ADI TI ST NXP 镁光 三星 海力士内存芯片 等百余品牌的电子元器件,可接受BOM清单,缺料,冷门,停产,以及国外对华禁运器件业务!


欢迎大家有需求随时发型号清单,我们将在第一时间给您呈上最好的报价,微信(QQ同号):1051197468 也希望您把我们的微信推荐给采购同事,感谢对平台的支持与信任!


与我们合作,您的器件采购成本将相比原有供应商降低10%以上!!不信?那您就来试试吧!!欢迎来撩!!




电子万花筒 电子万花筒,每个电子工程师都在关注的综合型技术与行业服务平台!
评论
  •         近日,广电计量在聚焦离子束(FIB)领域编写的专业著作《聚焦离子束:失效分析》正式出版,填补了国内聚焦离子束领域实践性专业书籍的空白,为该领域的技术发展与知识传播提供了重要助力。         随着芯片技术不断发展,芯片的集成度越来越高,结构也日益复杂。这使得传统的失效分析方法面临巨大挑战。FIB技术的出现,为芯片失效分析带来了新的解决方案。它能够在纳米尺度上对芯片进行精确加工和分析。当芯
    广电计量 2025-02-28 09:15 116浏览
  • 一、VSM的基本原理震动样品磁强计(Vibrating Sample Magnetometer,简称VSM)是一种灵敏且高效的磁性测量仪器。其基本工作原理是利用震动样品在探测线圈中引起的变化磁场来产生感应电压,这个感应电压与样品的磁矩成正比。因此,通过测量这个感应电压,我们就能够精确地确定样品的磁矩。在VSM中,被测量的样品通常被固定在一个震动头上,并以一定的频率和振幅震动。这种震动在探测线圈中引起了变化的磁通量,从而产生了一个交流电信号。这个信号的幅度和样品的磁矩有着直接的关系。因此,通过仔细
    锦正茂科技 2025-02-28 13:30 100浏览
  • 在物联网领域中,无线射频技术作为设备间通信的核心手段,已深度渗透工业自动化、智慧城市及智能家居等多元场景。然而,随着物联网设备接入规模的不断扩大,如何降低运维成本,提升通信数据的传输速度和响应时间,实现更广泛、更稳定的覆盖已成为当前亟待解决的系统性难题。SoC无线收发模块-RFM25A12在此背景下,华普微创新推出了一款高性能、远距离与高性价比的Sub-GHz无线SoC收发模块RFM25A12,旨在提升射频性能以满足行业中日益增长与复杂的设备互联需求。值得一提的是,RFM25A12还支持Wi-S
    华普微HOPERF 2025-02-28 09:06 143浏览
  • 1,微软下载免费Visual Studio Code2,安装C/C++插件,如果无法直接点击下载, 可以选择手动install from VSIX:ms-vscode.cpptools-1.23.6@win32-x64.vsix3,安装C/C++编译器MniGW (MinGW在 Windows 环境下提供类似于 Unix/Linux 环境下的开发工具,使开发者能够轻松地在 Windows 上编写和编译 C、C++ 等程序.)4,C/C++插件扩展设置中添加Include Path 5,
    黎查 2025-02-28 14:39 140浏览
  • 在2024年的科技征程中,具身智能的发展已成为全球关注的焦点。从实验室到现实应用,这一领域正以前所未有的速度推进,改写着人类与机器的互动边界。这一年,我们见证了具身智能技术的突破与变革,它不仅落地各行各业,带来新的机遇,更在深刻影响着我们的生活方式和思维方式。随着相关技术的飞速发展,具身智能不再仅仅是一个技术概念,更像是一把神奇的钥匙。身后的众多行业,无论愿意与否,都像是被卷入一场伟大变革浪潮中的船只,注定要被这股汹涌的力量重塑航向。01为什么是具身智能?为什么在中国?最近,中国具身智能行业的进
    艾迈斯欧司朗 2025-02-28 15:45 221浏览
  • 更多生命体征指标风靡的背后都只有一个原因:更多人将健康排在人生第一顺位!“AGEs,也就是晚期糖基化终末产物,英文名Advanced Glycation End-products,是存在于我们体内的一种代谢产物” 艾迈斯欧司朗亚太区健康监测高级市场经理王亚琴说道,“相信业内的朋友都会有关注,最近该指标的热度很高,它可以用来评估人的生活方式是否健康。”据悉,AGEs是可穿戴健康监测领域的一个“萌新”指标,近来备受关注。如果站在学术角度来理解它,那么AGEs是在非酶促条件下,蛋白质、氨基酸
    艾迈斯欧司朗 2025-02-27 14:50 400浏览
  • 美国加州CEC能效跟DOE能效有什么区别?CEC/DOE是什么关系?美国加州CEC能效跟DOE能效有什么区别?CEC/DOE是什么关系?‌美国加州CEC能效认证与美国DOE能效认证在多个方面存在显著差异‌。认证范围和适用地区‌CEC能效认证‌:仅适用于在加利福尼亚州销售的电器产品。CEC认证的范围包括制冷设备、房间空调、中央空调、便携式空调、加热器、热水器、游泳池加热器、卫浴配件、光源、应急灯具、交通信号模块、灯具、洗碗机、洗衣机、干衣机、烹饪器具、电机和压缩机、变压器、外置电源、消费类电子设备
    张工nx808593 2025-02-27 18:04 120浏览
  • 振动样品磁强计是一种用于测量材料磁性的精密仪器,广泛应用于科研、工业检测等领域。然而,其测量准确度会受到多种因素的影响,下面我们将逐一分析这些因素。一、温度因素温度是影响振动样品磁强计测量准确度的重要因素之一。随着温度的变化,材料的磁性也会发生变化,从而影响测量结果的准确性。因此,在进行磁性测量时,应确保恒温环境,以减少温度波动对测量结果的影响。二、样品制备样品的制备过程同样会影响振动样品磁强计的测量准确度。样品的形状、尺寸和表面处理等因素都会对测量结果产生影响。为了确保测量准确度,应严格按照规
    锦正茂科技 2025-02-28 14:05 134浏览
  • RGB灯光无法同步?细致的动态光效设定反而成为产品客诉来源!随着科技的进步和消费者需求变化,电脑接口设备单一功能性已无法满足市场需求,因此在产品上增加「动态光效」的形式便应运而生,藉此吸引消费者目光。这种RGB灯光效果,不仅能增强电脑周边产品的视觉吸引力,还能为用户提供个性化的体验,展现独特自我风格。如今,笔记本电脑、键盘、鼠标、鼠标垫、耳机、显示器等多种电脑接口设备多数已配备动态光效。这些设备的灯光效果会随着音乐节奏、游戏情节或使用者的设置而变化。想象一个画面,当一名游戏玩家,按下电源开关,整
    百佳泰测试实验室 2025-02-27 14:15 137浏览
  •           近日受某专业机构邀请,参加了官方举办的《广东省科技创新条例》宣讲会。在与会之前,作为一名技术工作者一直认为技术的法例都是保密和侵权方面的,而潜意识中感觉法律有束缚创新工作的进行可能。通过一个上午学习新法,对广东省的科技创新有了新的认识。广东是改革的前沿阵地,是科技创新的沃土,企业是创新的主要个体。《广东省科技创新条例》是广东省为促进科技创新、推动高质量发展而制定的地方性法规,主要内容包括: 总则:明确立法目
    广州铁金刚 2025-02-28 10:14 103浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦