emoestudio / eEEExplore-2023

电子工程相关技术交流讨论repo-2023年限定
GNU General Public License v3.0
19 stars 1 forks source link

[仪器仪表]PyBode:基于PyVisa的波特图脚本,兼容不同的信号源/示波器 #3

Open OliverKung opened 1 year ago

OliverKung commented 1 year ago

波特图是电路分析常用的工具,但是常见的利用VNA扫描波特图的方法频率上限较高(50GHz~)但是下限较低。这对于低频电路的测试来说并不合适,而且VNA的输入阻抗为50Ω,对于很多的应用场景来说并不合适。使用示波器配合信号源可以较为轻松实现低频(<100MHz)的波特图的测量,而且相对来说较为灵活。 一些比较新的示波器都自带有波特图的功能,例如普源的MSO5000,鼎阳的SDS2000X-Plus,是德的DSOX1000G等等。其中鼎阳的相对来说较为合理,可以直接配合鼎阳自己的信号源进行扫描,使得波特图分析的频率范围不再受限于示波器本身。而其他的型号往往只集成了25MHz左右的信号源,使得其频率范围被自身限制。而且关键,要是机器自己的信号源寄了,这功能不就没得了(比如我的MSO5000 CH1的信号源就寄了,然后这破示波器还只能用CH1扫频,可恶啊)。 因此想要基于PyVisa配合示波器/信号源去写一个用于波特图分析的脚本,来进行这个分析。暂时这个东西处于脑补阶段。等我有时间写个beta版给各位康康

alwaysmy commented 1 year ago

另外提一句,鼎阳的不仅可以外接自己的信号源,而且也有方法可以转接其他的信号源,https://github.com/4x1md/sds1004x_bodehttps://github.com/sq6sfo/espBode

OliverKung commented 1 year ago

一个SDG2000X的写好的驱动 https://github.com/tinylabs/pysdg2000x

Floyd-Fish commented 1 year ago

很有建设性的想法!我之前也想过用示波器配合信号源同步触发扫频+测量来实现bode图测试功能,理论上来说这样的组合方式可以将测试范围延伸到极低频率,而上限则取决于示波器和信号源的带宽。 一般支持LXI连接的示波器/信号源可以通过LAN或者USB连接到PC,通过PyVISA or LabView等方式写控制代码去控制仪器动作,收集测量数据;不过这个方法有一个比较麻烦的点可能在于幅度自动调节的联动关系,可以预想这是个复杂的工作。算法的话似乎还挺好写,把幅度数据取出来一除就是增益,输入输出波形相位差即是该频点的相位~

OliverKung commented 1 year ago

确实,我已经搞定了一个简单的版本,明天先发上来看看😂

OliverKung 电子科技大学 四川省成都市郫都区西源大道2006号

---- 回复的原邮件 ---- | 发件人 | @.> | | 日期 | 2023年07月10日 00:59 | | 收件人 | @.> | | 抄送至 | @.>@.> | | 主题 | Re: [emoestudio/eEEExplore-2023] [仪器仪表]PyBode:基于PyVisa的波特图脚本,兼容不同的信号源/示波器 (Issue #3) |

很有建设性的想法!我之前也想过用示波器配合信号源同步触发扫频+测量来实现bode图测试功能,理论上来说这样的组合方式可以将测试范围延伸到极低频率,而上限则取决于示波器和信号源的带宽。 一般支持LXI连接的示波器/信号源可以通过LAN或者USB连接到PC,通过PyVISA or LabView等方式写控制代码去控制仪器动作,收集测量数据;不过这个方法有一个比较麻烦的点可能在于幅度自动调节的联动关系,可以预想这是个复杂的工作。算法的话似乎还挺好写,把幅度数据取出来一除就是增益,输入输出波形相位差即是该频点的相位~

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

OliverKung commented 1 year ago

搞了一天ESD器件。晚上发上来康康,这个只写了简单的扫频的代码,更加深入的同步触发/噪声抑制/平均等功能都还没得。 目前考虑配合Plotly搞个小GUI看看,应该还挺好。 然后这一版现在扫描速度相当慢,扫一个频率点差不多需要3.6s-4s,时间略长,后面考虑把每次的Auto改成对自适应的缩放,Auto的操作还是比较占用时间的。 https://github.com/OliverKung/PyBode

OliverKung commented 1 year ago

芜湖,把Auto改成了根据频率缩放时基。扫描点数从3.66秒/点加速到1.5点/秒。带来了高达5倍的速度提升

Floyd-Fish commented 1 year ago

挖藕,频率可以固定,但是幅度如何自动扫描呢?在youtube上看RS示波器的bode图好像是幅度一个档位一个档位地扫过去,如果这样的话速度瓶颈就在示波器测量Vpp的速度和接口通信速率上了?

OliverKung commented 1 year ago

挖藕,频率可以固定,但是幅度如何自动扫描呢?在youtube上看RS示波器的bode图好像是幅度一个档位一个档位地扫过去,如果这样的话速度瓶颈就在示波器测量Vpp的速度和接口通信速率上了?

这个确实是个问题。普源的操作看起来是试探性的缩放。我感觉可以写一个简单的判决算法去确定幅度的占比。比如先测一次幅度,如果幅度小于示波器量程的2/3,那么就自动计算一个接近的量程这样。逐个量程扫描的方式怕不是和我直接一句Auto设置也差不多了。顺便示波器测量Vpp的速度确实有些慢,这个感觉也没有啥很好的办法 而且还有一个很大的Bug,示波器对于相位的测量不是基于FFT的,而是基于沿变化的。在低信号幅度下,示波器的相位测量抖动很猛,而且示波器的相位测量会出现很离谱的NaN的数值。

Floyd-Fish commented 1 year ago

感觉幅度缩放可以用二分法来实现,或者用SAR算法(确信 Well,测量速度这个只能寄希望于示波器的算力提升了...可以看看日狗的DHO系列计算速度怎么样,我试用的时候感觉还可以。。至于相位测量这个,在小信号下要保证稳定触发,12-bit低底噪示波器具有天然优势:),日狗DHO的小信号档位最低到500uV/div,200uV/div的时候会自动打开20M带宽限制,damedame

OliverKung commented 1 year ago

200uV/div的时候会自动打开20M带宽限制,damedame

这个200uV/div的带宽限制可以强制关闭么,不然感觉有些难受。其实如果DHO的LAN口增强了的话,可以直接回传两个通道的数据然后用FFT去计算相位。

Floyd-Fish commented 1 year ago

200uV/div的时候会自动打开20M带宽限制,damedame

这个200uV/div的带宽限制可以强制关闭么,不然感觉有些难受。其实如果DHO的LAN口增强了的话,可以直接回传两个通道的数据然后用FFT去计算相位。

切到这个档位的时候,带宽限制调节选项就灰掉了。。可能是日狗测试发现200uV/div的时候底噪会导致不可用,或者不好看,所以给锁上了,不知道通过SCPI指令能不能强行打开。 实时回传数据算相位,感觉...是不是可以在数字域里相干解调呢 LY~KZ}E8F%%}TB09HPQ_P_0 唔,时钟同步不太好做,还是大力出奇迹吧(逃

OliverKung commented 1 year ago

带宽限制关掉了那比较难顶了。 其实这个时钟同步可能还好,比如我们直接拉第三个通道传时钟过来(

OliverKung commented 1 year ago

幅度问题搞定, 我直接测两次。第一次测量差不多的值,第二次把满量程幅度直接设置到第一次测量值的2倍,这样正好可以利用50%的量程。损失是扫频的速度从1.5点/秒降低到了1.6秒/点。

OliverKung commented 1 year ago

赶DDL屁滚尿流的半夜来更新一下 完成了基本的扫频功能,幅度自动设置下,扫频的速度从1.6秒/点提升到了1.2秒/点。感觉这个速度已经差不多了。 然后发现如果可以的话,建议引入第三个通道专门用于触发信号。这一路触发信号最好是一路方波。这样虽然会使得测量频率上限被方波限制,但是可以换来低得多的增益噪声和相位测量噪声。下面是对比的图片。 首先是只使用两个通道触发的,可以看到增益测量还是比较稳定没啥噪声的,但是相位的波动相当的大。实际时域上来看,波形的触发并不稳定一直在抖动 image 之后是用CH1和CH2测量,CH3单独用方波触发的。可以看到相位的抖动已经小了很多了 image

此时我们在上面的基础上,再开启平均采样,平均长度32. image 可以看到相当平坦,相位的噪声小的亲妈都看不出来 最后是项目的Repo:https://github.com/OliverKung/PyBode

Floyd-Fish commented 1 year ago

tql!这就白嫖) 不过这个地方用相位噪声这个词似乎有些混淆233,应该说是相位测量不确定性/误差更好么

OliverKung commented 1 year ago

啊对的,这个表述更合理。相位噪声确实有些怪😂

---- 回复的原邮件 ---- | 发件人 | @.> | | 日期 | 2023年07月19日 15:04 | | 收件人 | @.> | | 抄送至 | @.>@.> | | 主题 | Re: [emoestudio/eEEExplore-2023] [仪器仪表]PyBode:基于PyVisa的波特图脚本,兼容不同的信号源/示波器 (Issue #3) |

tql!这就白嫖) 不过这个地方用相位噪声这个词似乎有些混淆233,应该说是相位测量不确定性/误差更好么

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

OliverKung commented 1 year ago

image 由于某些原因,DDL开摆了,更新下代码。 加上了直接命令行配置动作的代码。使用的话只需要 python pyBode.py -h 就可以查看使用的基本教程了,最简单的设置方法只需要配置信号源和示波器的IP即可。暂时只支持SDG2000X和MSO5000 当然理论上讲,普源的全系列示波器和鼎阳的全系列信号源应该有着相同的兼容的编程Visa代码,但是我没测试其他的组合,我不好说 更新的repo地址:https://github.com/OliverKung/PyBode

OliverKung commented 1 year ago

之前的额外通道同步下的频率范围被方波限制的问题解决了。 对于同步触发来说,频率为f的信号,可以同时捕获2f,3f等整数倍频的信号。那么我们对于频率为f的信号来说,也可以使用f/2,f/3等频率触发。因此我们只要f反复除2,直到频率低于方波的最大频率,就可以完成更宽范围内的同步采样测量。 但是测量的结果有点怪。出现了一些奇怪的增益的跳动。暂时还在考虑为啥。比如对于30M到50MHz的扫频,其结果如下: image 可以看到在这个频率点处发生了一个奇怪的5dB的骤降,不好说是因为啥,但是感觉不太对劲

Floyd-Fish commented 1 year ago

这个点的频率是多少呢,可以拿到精确的值么? 或者尝试重复3次扫频实验,看塌陷的频点是不是同一点,如果是同一点可以怀疑是示波器/信号源内部某种时钟同步问题? (btw,大概33.333M那个频点也有个塌陷,这个是DUT特性么

OliverKung commented 1 year ago

8AYJ32)_7320@KPS{Y2LAN3 今天简单的加了个PyQt的GUI。只能说我理解为啥软件都喜欢里面丢个浏览器了,忽略资源的情况下,Web是一个相当相当好的GUI设计平台,可以调用的东西很多还可以猛猛的缝合

BellssGit commented 11 months ago

如果仪器只有USB接口的话,会考虑支持吗

OliverKung commented 11 months ago

考虑后面添加,其实没啥太大的难度应该

---- 回复的原邮件 ---- | 发件人 | @.> | | 日期 | 2023年10月04日 20:33 | | 收件人 | @.> | | 抄送至 | @.>@.> | | 主题 | Re: [emoestudio/eEEExplore-2023] [仪器仪表]PyBode:基于PyVisa的波特图脚本,兼容不同的信号源/示波器 (Issue #3) |

如果仪器只有USB接口的话,会考虑支持吗

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

Floyd-Fish commented 11 months ago

今天试了下用我的DG4102和DHO914(DHO924)来扫bode,发现日狗和鼎阳的SCPI指令集还不兼容。。准确来说是鼎阳有点。。畸形? 查了DG4000的编程手册后,其实只需要把指令修改一下就可以用DG系列源了~ 新建一个DG4000.py文件,内容基本照搬现有鼎阳的代码,修改SCPI命令即可,如何在pybode.py中修改信号源引用和声明。DG4000.py代码参考如下:

# DG4000 Series AWG python vxi11 lib.
import vxi11
from enum import Enum
from typedef import channel_number,waveform_type

class DG4000:
    def __init__(self,addr,model):
        self.addr=addr
        self.model=model
        self.instr=vxi11.Instrument(self.addr)
        self.instr.write("SYST:BEEP ON")
        print(self.instr.ask("*IDN?"))
        self.instr.write("SYST:BEEP OFF")
    def set_freq_amp(self,freq,amplitude,channel:channel_number):
        if(channel == channel_number.ch1):
            channel_Str=":SOURce1"
        else:
            channel_Str=":SOURce2"
        self.instr.write(channel_Str+":VOLTage "+str(amplitude))
        self.instr.write(channel_Str+":FREQuency "+str(freq))

    def set_waveform_type(self,channel:channel_number,waveform:waveform_type):
        if(channel == channel_number.ch1):
            channel_Str=":SOURce1"
        else:
            channel_Str=":SOURce2"
        self.instr.write(channel_Str+":APPLy "+waveform.value)

    def setChannelOutputState(self,channel:channel_number,state):
        if(channel == channel_number.ch1):
            self.instr.write(":OUTPut1 "+"ON" if state==1 else "OFF")
        else:
            self.instr.write(":OUTPut2 "+"ON" if state==1 else "OFF")

    def setChannelLoadImpedance(self,channel:channel_number,loadimpedance):
        if(channel == channel_number.ch1):
            self.instr.write(":OUTPut1:LOAD "+loadimpedance)
        else:
            self.instr.write(":OUTPut2:LOAD "+loadimpedance)

if __name__=="__main__":
    my_dsg=DG4000("192.168.3.136","DG4000")
Floyd-Fish commented 11 months ago

另,DG4000和SDG2000的波形类别在SCPI指令集中不一致: 这个是SDG2000的:

V28NXN 5R@GU186~J2%`ODB

这个是DG4000的

P~2`RF{84(~U`G{6Z()0MND

所以用DG4000且需要变更波形类型的时候,请注意上面的程序需要修改

Floyd-Fish commented 8 months ago

发现2个功能上的bug:

  1. 低频测试时,DHO容易卡住,表现为读MEAS超时,有时候完全卡死,拧时基直接没反应了;
  2. 高频测试时,由于切换速度过快可能导致错误数据(尖峰、凹陷等),建议设置一个最低等待时间,实测0.4s的效果还可以