自动记录超导腔调谐器压电陶瓷迟滞曲线

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# Program Name: auto record piezo frequency curves
# Author: Liu Ming
# Created Time: 8/17/2024 21:34 pm
# Descption: auto record piezo frequency curves and plot

import pyvisa as visa
import csv
import time
import matplotlib.pyplot as plt

rm = visa.ResourceManager()
signal_generator = rm.open_resource('TCPIP0::127.0.0.1::inst0::INSTR')
spec_analyzer = rm.open_resource('TCPIP0::127.0.0.2::inst0::INSTR')


with open('frequency_data.csv', 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(['Voltage (V)', 'Frequency (Hz)'])

voltages = []
frequencies = []

for voltage in range(0, 41, 1):
voltage_value = voltage * 0.1
signal_generator.write("SOURce2:VOLTage:OFFset {}".format(voltage_value))
time.sleep(1)
spec_analyzer.write("CALC:MARK1:X?")
frequency = spec_analyzer.read()

voltages.append(voltage_value)
frequencies.append(float(frequency))

with open('frequency_data.csv', 'a', newline='') as file:
writer = csv.writer(file)
writer.writerow([voltage_value, frequency])

for voltage in range(40, -1, -1):
voltage_value = voltage * 0.1
signal_generator.write("SOURce2:VOLTage:OFFset {}".format(voltage_value))
time.sleep(1)
spec_analyzer.write("CALC:MARK1:X?")
frequency = spec_analyzer.read()

voltages.append(voltage_value)
frequencies.append(float(frequency))

with open('frequency_data.csv', 'a', newline='') as file:
writer = csv.writer(file)
writer.writerow([voltage_value, frequency])


plt.plot(voltages, frequencies)
plt.xlabel('Voltage (V)')
plt.ylabel('Frequency (Hz)')
plt.title('Frequency vs Voltage')
plt.grid(True)
plt.show()


signal_generator.close()
spec_analyzer.close()

程序介绍

本Python程序使用了PyVISA库来与仪器通信,具体来说,它连接了信号发生器(signal generator)和频谱分析仪(spectrum analyzer)。通过控制信号发生器的电压输出,然后使用频谱分析仪测量相应的频率,程序可以自动记录不同电压下的频率值,并将数据保存到名为frequency_data.csv的CSV文件中。

初始化

程序首先初始化了PyVISA的资源管理器(ResourceManager),然后打开了信号发生器和频谱分析仪的连接。接着,程序创建了一个CSV文件,并写入了数据表头[‘Voltage (V)’, ‘Frequency (Hz)’]。

调节Piezo驱动电压

随后,程序通过循环逐步改变电压值,并在每个电压值下测量对应的频率。然后将电压值和频率值添加到列表voltages和frequencies中,并将数据写入CSV文件。

保存数据

接着,程序以相反顺序再次循环改变电压值,并重复测量频率,将数据写入CSV文件。

绘制迟滞曲线

最后,程序使用Matplotlib库绘制了电压与频率的曲线图,并设置了横纵坐标的标签、标题以及网格线,并展示了绘制的图表。

最后,程序关闭了信号发生器和频谱分析仪的连接。

总结

这个Python程序实现了自动记录压电频率曲线并绘制图表的功能,可以帮助工程师或研究人员快速获取和分析压电元件在不同电压下的频率响应。通过该程序,用户可以轻松地进行实验数据的记录和可视化分析。

代码逐行解读

以下是逐行代码解读的示例:

  1. import pyvisa as visa: 导入PyVISA库并将其命名为visa,用于与仪器通信。

  2. import csv: 导入CSV库,用于读写CSV文件。

  3. import time: 导入时间库,用于添加延迟等待。

  4. import matplotlib.pyplot as plt: 导入Matplotlib库中的pyplot模块,用于绘制图表。

  5. rm = visa.ResourceManager(): 创建PyVISA的资源管理器对象rm

  6. signal_generator = rm.open_resource('TCPIP0::127.0.0.1::inst0::INSTR'): 打开连接到IP地址为127.0.0.1的信号发生器。

  7. spec_analyzer = rm.open_resource('TCPIP0::127.0.0.2::inst0::INSTR'): 打开连接到IP地址为127.0.0.2的频谱分析仪。

  8. with open('frequency_data.csv', 'w', newline='') as file:: 打开名为frequency_data.csv的CSV文件,以写入模式,并创建一个CSV写入对象writer

  9. writer.writerow(['Voltage (V)', 'Frequency (Hz)']): 写入CSV文件的表头。

  10. voltages = []frequencies = []: 创建空列表用于存储电压和频率值。

  11. for voltage in range(0, 41, 1):: 循环遍历电压值从0到40,步长为1。

  12. voltage_value = voltage * 0.1: 计算实际电压值。

  13. signal_generator.write("SOURce2:VOLTage:OFFset {}".format(voltage_value)): 设置信号发生器的电压输出。

  14. time.sleep(1): 程序暂停1秒,等待仪器响应。

  15. spec_analyzer.write("CALC:MARK1:X?"): 发送指令给频谱分析仪,获取频率值。

  16. frequency = spec_analyzer.read(): 读取频谱分析仪返回的频率值。

  17. voltages.append(voltage_value)frequencies.append(float(frequency)): 将电压值和频率值添加到对应的列表中。

  18. with open('frequency_data.csv', 'a', newline='') as file:: 以追加模式打开CSV文件。

  19. plt.plot(voltages, frequencies): 绘制电压与频率的曲线图。

  20. plt.xlabel('Voltage (V)')plt.ylabel('Frequency (Hz)')plt.title('Frequency vs Voltage')plt.grid(True): 设置图表的横纵坐标标签、标题和显示网格线。

  21. plt.show(): 显示绘制的图表。

  22. signal_generator.close()spec_analyzer.close(): 关闭信号发生器和频谱分析仪的连接。

通过逐行解读代码,读者可以更清晰地了解程序的执行流程和每行代码的作用。这种详细的解读可以帮助读者更好地理解代码,并有助于在实际应用中进行修改和扩展。