QUBIT-Driver 1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qubit_driver-1.0/LICENSE +21 -0
- qubit_driver-1.0/PKG-INFO +40 -0
- qubit_driver-1.0/QUBIT_Driver.egg-info/PKG-INFO +40 -0
- qubit_driver-1.0/QUBIT_Driver.egg-info/SOURCES.txt +16 -0
- qubit_driver-1.0/QUBIT_Driver.egg-info/dependency_links.txt +1 -0
- qubit_driver-1.0/QUBIT_Driver.egg-info/entry_points.txt +2 -0
- qubit_driver-1.0/QUBIT_Driver.egg-info/requires.txt +1 -0
- qubit_driver-1.0/QUBIT_Driver.egg-info/top_level.txt +1 -0
- qubit_driver-1.0/README.md +18 -0
- qubit_driver-1.0/qubit/CY_10DA.py +434 -0
- qubit_driver-1.0/qubit/CY_6DA.py +432 -0
- qubit_driver-1.0/qubit/CY_6DADC.py +425 -0
- qubit_driver-1.0/qubit/CY_AD.py +535 -0
- qubit_driver-1.0/qubit/CY_SYNC.py +143 -0
- qubit_driver-1.0/qubit/__init__.py +0 -0
- qubit_driver-1.0/setup.cfg +7 -0
- qubit_driver-1.0/setup.py +27 -0
qubit_driver-1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) [2025] [heguoyang]
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: QUBIT_Driver
|
|
3
|
+
Version: 1.0
|
|
4
|
+
Summary: Drive adapted for the quantum control system of the Beijing Quantum Institute
|
|
5
|
+
Home-page:
|
|
6
|
+
Author: He Guo Yang
|
|
7
|
+
Author-email: 2060817247@qq.com
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Requires-Dist: numpy==1.14.4
|
|
14
|
+
Dynamic: author
|
|
15
|
+
Dynamic: author-email
|
|
16
|
+
Dynamic: classifier
|
|
17
|
+
Dynamic: description
|
|
18
|
+
Dynamic: description-content-type
|
|
19
|
+
Dynamic: license-file
|
|
20
|
+
Dynamic: requires-dist
|
|
21
|
+
Dynamic: summary
|
|
22
|
+
|
|
23
|
+
# QUBIT_Driver
|
|
24
|
+
|
|
25
|
+
Drive adapted for the quantum control system of the Beijing Quantum Institute
|
|
26
|
+
|
|
27
|
+
'QUBIT_Driver'是一个驱动库
|
|
28
|
+
|
|
29
|
+
### 使用方式
|
|
30
|
+
|
|
31
|
+
### 安装
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
$ pip install QUBIT_Driver
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
### License
|
|
39
|
+
|
|
40
|
+
[MIT]
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: QUBIT_Driver
|
|
3
|
+
Version: 1.0
|
|
4
|
+
Summary: Drive adapted for the quantum control system of the Beijing Quantum Institute
|
|
5
|
+
Home-page:
|
|
6
|
+
Author: He Guo Yang
|
|
7
|
+
Author-email: 2060817247@qq.com
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Requires-Dist: numpy==1.14.4
|
|
14
|
+
Dynamic: author
|
|
15
|
+
Dynamic: author-email
|
|
16
|
+
Dynamic: classifier
|
|
17
|
+
Dynamic: description
|
|
18
|
+
Dynamic: description-content-type
|
|
19
|
+
Dynamic: license-file
|
|
20
|
+
Dynamic: requires-dist
|
|
21
|
+
Dynamic: summary
|
|
22
|
+
|
|
23
|
+
# QUBIT_Driver
|
|
24
|
+
|
|
25
|
+
Drive adapted for the quantum control system of the Beijing Quantum Institute
|
|
26
|
+
|
|
27
|
+
'QUBIT_Driver'是一个驱动库
|
|
28
|
+
|
|
29
|
+
### 使用方式
|
|
30
|
+
|
|
31
|
+
### 安装
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
$ pip install QUBIT_Driver
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
### License
|
|
39
|
+
|
|
40
|
+
[MIT]
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
setup.cfg
|
|
4
|
+
setup.py
|
|
5
|
+
QUBIT_Driver.egg-info/PKG-INFO
|
|
6
|
+
QUBIT_Driver.egg-info/SOURCES.txt
|
|
7
|
+
QUBIT_Driver.egg-info/dependency_links.txt
|
|
8
|
+
QUBIT_Driver.egg-info/entry_points.txt
|
|
9
|
+
QUBIT_Driver.egg-info/requires.txt
|
|
10
|
+
QUBIT_Driver.egg-info/top_level.txt
|
|
11
|
+
qubit/CY_10DA.py
|
|
12
|
+
qubit/CY_6DA.py
|
|
13
|
+
qubit/CY_6DADC.py
|
|
14
|
+
qubit/CY_AD.py
|
|
15
|
+
qubit/CY_SYNC.py
|
|
16
|
+
qubit/__init__.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
numpy==1.14.4
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
qubit
|
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
import socket
|
|
3
|
+
import time
|
|
4
|
+
from waveforms import Waveform
|
|
5
|
+
from dev.common import (BaseDriver, QBool, QInteger, QList, QOption, QReal,Quantity,
|
|
6
|
+
QVector, get_coef)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Driver(BaseDriver):
|
|
11
|
+
support_models = ['CY_10DA']
|
|
12
|
+
|
|
13
|
+
CHs_num = 8 #8通道
|
|
14
|
+
CHs = [9, 10, 11, 12,13,14,15,16]
|
|
15
|
+
default_triggertime = 200 # us
|
|
16
|
+
trigger_source = 1 # 0:外部触发,1:内部触发
|
|
17
|
+
sock =None
|
|
18
|
+
sockSync = None
|
|
19
|
+
freq = []
|
|
20
|
+
|
|
21
|
+
quants = [
|
|
22
|
+
#通道9
|
|
23
|
+
QReal('TriggerDelay', value=0, ch=9, unit='ns',),
|
|
24
|
+
QReal('rdAtt', value=0, ch=9, unit=' ',),
|
|
25
|
+
QInteger('CAWWave', value=[3], ch=9),#value = [频率、相位、波形选择(1-载波 0-任意波)]
|
|
26
|
+
QInteger('Waveform', value=[], ch=9),
|
|
27
|
+
|
|
28
|
+
QInteger('TrigType', value=0, ch=9),#1-内触发、0-同步机触发
|
|
29
|
+
QInteger('TrigType', value=0, ch=9),
|
|
30
|
+
Quantity('Coefficient', value=None, ch=9),
|
|
31
|
+
|
|
32
|
+
#通道10
|
|
33
|
+
QReal('TriggerDelay', value=0, ch=10, unit='ns',),
|
|
34
|
+
QReal('rdAtt', value=0, ch=10, unit=' ',),
|
|
35
|
+
QInteger('Waveform', value=[3], ch=10),#value = [频率、相位、波形选择(1-载波 0-任意波)]
|
|
36
|
+
|
|
37
|
+
#通道11
|
|
38
|
+
QReal('TriggerDelay', value=0, ch=11, unit='ns',),
|
|
39
|
+
QReal('rdAtt', value=0, ch=11, unit=' ',),
|
|
40
|
+
QInteger('waveform', value=[3], ch=11),#value = [频率、相位、波形选择(1-载波 0-任意波)]
|
|
41
|
+
|
|
42
|
+
#通道12
|
|
43
|
+
QReal('TriggerDelay', value=0, ch=12, unit='ns',),
|
|
44
|
+
QReal('rdAtt', value=0, ch=12, unit=' ',),
|
|
45
|
+
QInteger('Waveform', value=[3], ch=12),#value = [频率、相位、波形选择(1-载波 0-任意波)]
|
|
46
|
+
|
|
47
|
+
#通道13
|
|
48
|
+
QReal('TriggerDelay', value=0, ch=13, unit='ns',),
|
|
49
|
+
QReal('rdAtt', value=0, ch=13, unit=' ',),
|
|
50
|
+
QInteger('Waveform', value=[3], ch=13),#value = [频率、相位、波形选择(1-载波 0-任意波)]
|
|
51
|
+
|
|
52
|
+
#通道14
|
|
53
|
+
QReal('TriggerDelay', value=0, ch=14, unit='ns',),
|
|
54
|
+
QReal('rdAtt', value=0, ch=14, unit=' ',),
|
|
55
|
+
QInteger('waveform', value=[3], ch=14),#value = [频率、相位、波形选择(1-载波 0-任意波)]
|
|
56
|
+
|
|
57
|
+
#通道15
|
|
58
|
+
QReal('TriggerDelay', value=0, ch=15, unit='ns',),
|
|
59
|
+
QReal('rdAtt', value=0, ch=15, unit=' ',),
|
|
60
|
+
QInteger('waveform', value=[3], ch=15),#value = [频率、相位、波形选择(1-载波 0-任意波)]
|
|
61
|
+
|
|
62
|
+
#通道16
|
|
63
|
+
QReal('TriggerDelay', value=0, ch=16, unit='ns',),
|
|
64
|
+
QReal('rdAtt', value=0, ch=16, unit=' ',),
|
|
65
|
+
QInteger('waveform', value=[3], ch=16),#value = [频率、相位、波形选择(1-载波 0-任意波)]
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
def __init__(self, addr, **kw):
|
|
74
|
+
super().__init__(addr, **kw)
|
|
75
|
+
self.model = 'CY_10DA'
|
|
76
|
+
self.srate = 10e9
|
|
77
|
+
|
|
78
|
+
def open(self):
|
|
79
|
+
#建立连接
|
|
80
|
+
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
81
|
+
self.sock.connect((self.addr, 4196))
|
|
82
|
+
self.sock.settimeout(40)
|
|
83
|
+
#与同步机连接
|
|
84
|
+
self.sockSync = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
85
|
+
self.sockSync.connect(('192.168.2.100',4196))
|
|
86
|
+
self.sockSync.settimeout(40)
|
|
87
|
+
#复位
|
|
88
|
+
self.set('*RST')
|
|
89
|
+
# time.sleep(1)
|
|
90
|
+
#同步
|
|
91
|
+
|
|
92
|
+
#外触发
|
|
93
|
+
self.set(':TRIG:TYPE',0)
|
|
94
|
+
# time.sleep(1)
|
|
95
|
+
#触发模式:7044同步
|
|
96
|
+
self.set(':TRIG:CTRL',0)
|
|
97
|
+
# time.sleep(1)
|
|
98
|
+
#同步机发一个触发信号
|
|
99
|
+
self.set_SYNC_TrigCycle(self.sockSync,1)
|
|
100
|
+
time.sleep(1)
|
|
101
|
+
self.set_SYNC_TrigCycle(self.sockSync,1)
|
|
102
|
+
time.sleep(1)
|
|
103
|
+
self.set_SYNC_TrigCycle(self.sockSync,1)
|
|
104
|
+
time.sleep(1)
|
|
105
|
+
|
|
106
|
+
#触发模式:多通道同步
|
|
107
|
+
self.set(':TRIG:CTRL',1)
|
|
108
|
+
# time.sleep(1)
|
|
109
|
+
#通道同步复位
|
|
110
|
+
self.set(':TRIG:CHLS')
|
|
111
|
+
# time.sleep(1)
|
|
112
|
+
#同步机发一个触发信号
|
|
113
|
+
self.set_SYNC_TrigCycle(self.sockSync,1)
|
|
114
|
+
|
|
115
|
+
#触发模式:波形触发模式
|
|
116
|
+
self.set(':TRIG:CTRL',2)
|
|
117
|
+
# time.sleep(1)
|
|
118
|
+
#设置奈奎斯特区间为2区
|
|
119
|
+
self.set('::AWG:NYZONE',2)
|
|
120
|
+
# time.sleep(1)
|
|
121
|
+
self.ChlSel(0)
|
|
122
|
+
att = 0
|
|
123
|
+
# time.sleep(1)
|
|
124
|
+
self.set(':READ:ATT',att)
|
|
125
|
+
delay_ns = 0
|
|
126
|
+
# time.sleep(1)
|
|
127
|
+
self.set(':READ:DELAY',delay_ns)
|
|
128
|
+
# time.sleep(1)
|
|
129
|
+
|
|
130
|
+
return
|
|
131
|
+
|
|
132
|
+
def close(self, **kw):
|
|
133
|
+
return super().close(**kw)
|
|
134
|
+
|
|
135
|
+
def write(self, name: str, value, **kw):
|
|
136
|
+
ch = kw.get('ch', 9)
|
|
137
|
+
self.config[name][ch]['value'] = value # 更新到config
|
|
138
|
+
|
|
139
|
+
if name in ['TriggerDelay',]:
|
|
140
|
+
# self.config['TriggerDelay'][ch]['value'] = value
|
|
141
|
+
self.rd_Delay( ch, value)
|
|
142
|
+
elif name in ['rdAtt',]:
|
|
143
|
+
self.rd_Att(ch, value)
|
|
144
|
+
elif name in ['Waveform',]:
|
|
145
|
+
if isinstance(value, Waveform):
|
|
146
|
+
value = value.sample(self.srate)
|
|
147
|
+
# elif isinstance(value, tuple):
|
|
148
|
+
# value = self.dist(*value)
|
|
149
|
+
else:
|
|
150
|
+
print('type error')
|
|
151
|
+
return
|
|
152
|
+
assert len(np.nonzero(value)[0]) <= int(
|
|
153
|
+
50e-6 * self.srate), 'Wave is too long!'
|
|
154
|
+
# freq = value[0]
|
|
155
|
+
# data_0, t_0 = self.GenWave_Cos(freq,65*32*4, self.srate)
|
|
156
|
+
# print('实验波形数据:',value)
|
|
157
|
+
self.download_AWG_waveData(value,ch)
|
|
158
|
+
elif name in ['CAWWave',]:
|
|
159
|
+
self.Generate_Caw_Wave(value,ch)
|
|
160
|
+
elif name in ['Coefficient',]:
|
|
161
|
+
self.set_Coefficient(value)
|
|
162
|
+
|
|
163
|
+
else:
|
|
164
|
+
return super().write(name, value, **kw)
|
|
165
|
+
|
|
166
|
+
return value
|
|
167
|
+
|
|
168
|
+
def read(self, name: str, **kw):
|
|
169
|
+
# mode = self.config[name][ch]['value']
|
|
170
|
+
|
|
171
|
+
# if mode == "raw":
|
|
172
|
+
# return self.getTrace()
|
|
173
|
+
# elif mode == 'alg':
|
|
174
|
+
# return self.get_FPGA_IQ_new()
|
|
175
|
+
ch = kw.get('ch', 1)
|
|
176
|
+
if name in ['TraceIQ']:
|
|
177
|
+
return self.getTrace()
|
|
178
|
+
elif name in ['algIQ']:
|
|
179
|
+
return self.getsingleIQ()
|
|
180
|
+
elif name in ['IQ']:
|
|
181
|
+
return self.get_FPGA_IQ_new()
|
|
182
|
+
# return self.getsingleIQ()
|
|
183
|
+
else:
|
|
184
|
+
return super().read(name, **kw)
|
|
185
|
+
|
|
186
|
+
# *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*# user defined #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
|
|
187
|
+
|
|
188
|
+
def socket_query(self,sock, cmd_name, params = 0, buffer_size=1024):
|
|
189
|
+
self.send_command(self.sock, cmd_name, params)
|
|
190
|
+
# 循环接收直到获取所有数据(示例:假设响应以 b'END' 结尾)
|
|
191
|
+
response = b''
|
|
192
|
+
num = 0
|
|
193
|
+
while True:
|
|
194
|
+
chunk = self.sock.recv(buffer_size)
|
|
195
|
+
# print(chunk)
|
|
196
|
+
num = num + 1
|
|
197
|
+
if not chunk:
|
|
198
|
+
break # 连接关闭
|
|
199
|
+
response += chunk
|
|
200
|
+
if num == 1:
|
|
201
|
+
break # 达到结束标志
|
|
202
|
+
return response
|
|
203
|
+
|
|
204
|
+
def send_command(self,sock, cmd_name, params,a = 0):
|
|
205
|
+
"""
|
|
206
|
+
发送带参数的程控指令
|
|
207
|
+
:param sock: 已连接的socket对象
|
|
208
|
+
:param cmd_name: 指令名称(如"SET_FREQ")
|
|
209
|
+
:param params: 可变参数(如频率值、通道号等)
|
|
210
|
+
"""
|
|
211
|
+
|
|
212
|
+
# 1. 拼接指令字符串(例如:"SET_FREQ,100000 1;" 表示设置通道1的频率为100000Hz)
|
|
213
|
+
if params != None:
|
|
214
|
+
# param_str = ",".join(map(str, params)) # 将参数转换为字符串并拼接
|
|
215
|
+
param_str = str(params)
|
|
216
|
+
cmd_str = f"{cmd_name} {param_str};" # 组合成完整指令(带结束符)
|
|
217
|
+
else:
|
|
218
|
+
cmd_str = f"{cmd_name};" # 组合成完整指令(带结束符)
|
|
219
|
+
|
|
220
|
+
# 2. 转换为字节流(socket传输必须是bytes类型)
|
|
221
|
+
cmd_bytes = cmd_str.encode('utf-8')
|
|
222
|
+
|
|
223
|
+
# 3. 发送指令
|
|
224
|
+
if len(cmd_bytes)>1472:
|
|
225
|
+
#分片处理
|
|
226
|
+
for i in range(0,len(cmd_bytes),1472):
|
|
227
|
+
self.sock.sendall(cmd_bytes[i:i+1472])
|
|
228
|
+
else:
|
|
229
|
+
self.sock.sendall(cmd_bytes)
|
|
230
|
+
# print(f"已发送指令:{cmd_str}")
|
|
231
|
+
|
|
232
|
+
def set(self,name, value=None):
|
|
233
|
+
# sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
234
|
+
# sock.connect((self.addr, 4196))
|
|
235
|
+
# sock.settimeout(10)
|
|
236
|
+
self.socket_query(self.sock, name, value)
|
|
237
|
+
return self.sock
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
##########################################################################################################
|
|
241
|
+
def ChlSel(self,chl,name = ':AWG:CHLSEL'):
|
|
242
|
+
chl = chl -1
|
|
243
|
+
self.set(name,chl)
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def rd_Delay(self, chl, delay_ns):
|
|
247
|
+
self.ChlSel(chl)
|
|
248
|
+
self.set(':READ:DELAY',delay_ns)
|
|
249
|
+
return
|
|
250
|
+
def rd_Att(self, chl, att):
|
|
251
|
+
self.ChlSel( chl)
|
|
252
|
+
self.set(':READ:ATT',att)
|
|
253
|
+
return
|
|
254
|
+
def Generate_Caw_Wave(self,value,chl):
|
|
255
|
+
# self.ChlSel(chl)
|
|
256
|
+
# delay_ns =800
|
|
257
|
+
# self.set(':READ:DELAY',delay_ns)
|
|
258
|
+
# value[0] = 6500
|
|
259
|
+
# value[1] = 90
|
|
260
|
+
# value[2] = 1 # 波形选择:1-载波 0-任意波
|
|
261
|
+
|
|
262
|
+
freq = value[0]
|
|
263
|
+
self.set(':CAW:FREQ',freq)
|
|
264
|
+
self.set(':CAW:PHA',90)
|
|
265
|
+
self.set(':CAW:ONLY',1)
|
|
266
|
+
|
|
267
|
+
# def set_Connect_Sync(self,ip,port):
|
|
268
|
+
# #与同步机建立连接
|
|
269
|
+
# sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
270
|
+
# addr_ip = ip #使用方给的网段
|
|
271
|
+
# sock.connect((addr_ip, port))
|
|
272
|
+
# sock.settimeout(10)
|
|
273
|
+
# #同步机通道使能
|
|
274
|
+
# # time.sleep(0.1)
|
|
275
|
+
# # self.send_command(sock,'GLOB:SELC',6)
|
|
276
|
+
# # time.sleep(0.1)
|
|
277
|
+
# # self.send_command(sock,'GLOB:CHLO',"ON")
|
|
278
|
+
# socket_Sync = sock
|
|
279
|
+
# return socket_Sync
|
|
280
|
+
def set_SYNC_TrigCycle(self,sock,trigNum):
|
|
281
|
+
|
|
282
|
+
#同步机循环触发
|
|
283
|
+
Trig_interv_s = 0.02 # 触发间隔 单位:s
|
|
284
|
+
Trig_loop = trigNum # 触发次数 【0:无限循环】
|
|
285
|
+
time.sleep(0.1)
|
|
286
|
+
self.send_command(sock,'GLOB:TRIGS CYCLE',None)
|
|
287
|
+
time.sleep(0.1)
|
|
288
|
+
self.send_command(sock,'GLOB:SPAC',Trig_interv_s)
|
|
289
|
+
time.sleep(0.1)
|
|
290
|
+
self.send_command(sock,'GLOB:LOOP',Trig_loop)
|
|
291
|
+
|
|
292
|
+
return
|
|
293
|
+
|
|
294
|
+
##############################################################
|
|
295
|
+
def set_Coefficient(self,coef_info):
|
|
296
|
+
self.freq = [kw['Delta'] for kw in coef_info['wList']]
|
|
297
|
+
return
|
|
298
|
+
#########################下发任意波数据#################################################
|
|
299
|
+
# ------------------------------------------------------------------------
|
|
300
|
+
# 功能说明: 【载波】 *用于任意波形数据下发
|
|
301
|
+
# 输入参数:波形数据
|
|
302
|
+
#
|
|
303
|
+
# 返回值: 无
|
|
304
|
+
# ------------------------------------------------------------------------
|
|
305
|
+
def AWG_Data_Download(self,waveData):
|
|
306
|
+
# handle.query(':AWG:SEQLEN {}'.format(len(waveData)))
|
|
307
|
+
#建立连接
|
|
308
|
+
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
309
|
+
sock.connect((self.addr, 4196))
|
|
310
|
+
sock.settimeout(10)
|
|
311
|
+
#下发波形数据
|
|
312
|
+
self.ChlSel(9)
|
|
313
|
+
len_once = 100000
|
|
314
|
+
m_Len_bytes = len(waveData)%len_once
|
|
315
|
+
m_Len_count = len(waveData)//len_once
|
|
316
|
+
if m_Len_count != 0:
|
|
317
|
+
for k in range(m_Len_count):
|
|
318
|
+
self.set(':AWG:SEQLEN',len_once)
|
|
319
|
+
start = k * len_once # 计算当前块的起始偏移量(整数)
|
|
320
|
+
end = start + len_once # 计算当前块的结束偏移量
|
|
321
|
+
current_block = waveData[start:end] # 通过切片获取当前块数据(bytes 类型)
|
|
322
|
+
sock.sendall(current_block)
|
|
323
|
+
time.sleep(0.03)
|
|
324
|
+
# print("10DA手动延时0.01秒")
|
|
325
|
+
if m_Len_bytes != 0:
|
|
326
|
+
self.set(':AWG:SEQLEN',m_Len_bytes)
|
|
327
|
+
start = len_once*m_Len_count # 计算当前块的起始偏移量(整数)
|
|
328
|
+
end = start + m_Len_bytes # 计算当前块的结束偏移量
|
|
329
|
+
current_block = waveData[start:end] # 通过切片获取当前块数据(bytes 类型)
|
|
330
|
+
sock.sendall(current_block)
|
|
331
|
+
time.sleep(0.03)
|
|
332
|
+
# print("10DA手动延时0.01秒")
|
|
333
|
+
return
|
|
334
|
+
# ------------------------------------------------------------------------
|
|
335
|
+
# 功能说明: 量化float数据 并转bytes 【用于转换任意波形数据】
|
|
336
|
+
# 输入参数:
|
|
337
|
+
# data:【数据类型: ndarray或list】
|
|
338
|
+
# 【取值范围: 0~1】
|
|
339
|
+
# 【参数意义: 待处理的float数据数组或列表】
|
|
340
|
+
# 输出参数:
|
|
341
|
+
# data_bytes:【数据类型: bytes】
|
|
342
|
+
# 【数据说明: 每16位为一组, 范围: 0~0xFFFF, 低14位有效】
|
|
343
|
+
# 【参数意义: 转换后的生成的bytes数据】
|
|
344
|
+
# 返回值: data_bytes
|
|
345
|
+
# ------------------------------------------------------------------------
|
|
346
|
+
def float2bytes(self,data):
|
|
347
|
+
# 如果为list格式,则转为array进行处理
|
|
348
|
+
if isinstance(data,list):
|
|
349
|
+
data = np.array(data).reshape(1,-1)
|
|
350
|
+
else:
|
|
351
|
+
# 转换为1维数组
|
|
352
|
+
data = data.reshape(1,-1)
|
|
353
|
+
|
|
354
|
+
len_data = np.size(data)
|
|
355
|
+
# 是否为偶数个元素,如果不是,补1个0
|
|
356
|
+
if len_data % 2 != 0:
|
|
357
|
+
np.append(data,0)
|
|
358
|
+
len_data = len_data +1
|
|
359
|
+
# -------- 元素两个一组,每组前后对调 -----------------
|
|
360
|
+
data_uint16 = np.uint16(data*(pow(2,15)-1))
|
|
361
|
+
#####################
|
|
362
|
+
# data_uint16 = np.bitwise_or(data_uint16,1)
|
|
363
|
+
##################
|
|
364
|
+
data_bytes = data_uint16.tobytes()
|
|
365
|
+
return data_bytes
|
|
366
|
+
|
|
367
|
+
# 函数功能: zAWG 波形数据量化
|
|
368
|
+
# 参数说明: z_coffe: 数据量化系数: 0~1[满量程]
|
|
369
|
+
# Data_chl0、Data_chl1、Data_chl2、Data_chl3
|
|
370
|
+
# 需为list类型
|
|
371
|
+
def z_GenData(self,z_coffe, Data_chl0):
|
|
372
|
+
reData_array = np.array(Data_chl0).reshape(-1,1)
|
|
373
|
+
z_data_bytes = self.float2bytes(z_coffe*reData_array)
|
|
374
|
+
print("下发波形数据长度为:",len(z_data_bytes),"字节")
|
|
375
|
+
return z_data_bytes
|
|
376
|
+
|
|
377
|
+
def download_AWG_waveData(self,data,chl = 9):
|
|
378
|
+
# self.ChlSel(chl)
|
|
379
|
+
# delay_ns =800
|
|
380
|
+
# self.set(':READ:DELAY',delay_ns)
|
|
381
|
+
# with np.printoptions(threshold=np.inf):
|
|
382
|
+
# print('实验波形数据:',data) # 仅在该上下文中完整显示
|
|
383
|
+
z_coeff = 0.4 # 数据量化系数: 0~1[满量程]
|
|
384
|
+
waveData = self.z_GenData(z_coeff, data)
|
|
385
|
+
#波形模块使能复位
|
|
386
|
+
self.ChlSel(0)
|
|
387
|
+
self.set(':AWG:BDOWNLC')
|
|
388
|
+
#波形下发与控制
|
|
389
|
+
self.AWG_Data_Download(waveData)
|
|
390
|
+
|
|
391
|
+
waveType = 0
|
|
392
|
+
self.set(':CAW:ONLY',waveType)# 波形选择:1-载波 0-任意波
|
|
393
|
+
playMode = 1
|
|
394
|
+
self.set(':AWG:SEQNUM',playMode)# 波形循环播放次数:0-循环播放,1-单次播放
|
|
395
|
+
#通道输出打开
|
|
396
|
+
self.ChlSel(0)
|
|
397
|
+
self.set(':AWG:SWITCH','ON')
|
|
398
|
+
# #触发:
|
|
399
|
+
# #与同步机连接
|
|
400
|
+
# sockSync = self.set_Connect_Sync('192.168.2.100',4196)
|
|
401
|
+
# #同步机发一个触发信号
|
|
402
|
+
# self.set_SYNC_TrigCycle(self.sockSync,1)
|
|
403
|
+
# time.sleep(20)
|
|
404
|
+
#外触发
|
|
405
|
+
self.set(':TRIG:TYPE',0)
|
|
406
|
+
#触发模式:波形触发模式
|
|
407
|
+
self.set(':TRIG:CTRL',2)
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
# ------------------------------------------------------------------------
|
|
411
|
+
# 功能说明: 余弦数据生成
|
|
412
|
+
# 输入参数:
|
|
413
|
+
# f0_cos:【数据类型: float】
|
|
414
|
+
# 【参数意义: 频率, 单位:Hz】
|
|
415
|
+
# cycle: 【数据类型: int】
|
|
416
|
+
# 【取值: 需根据数据长度计算】
|
|
417
|
+
# 【参数意义: 周期数】
|
|
418
|
+
# fs_cos: 【数据类型: float】
|
|
419
|
+
# 【参数意义: 采样率, 单位:Hz】
|
|
420
|
+
# *参数示例: fs_cos = 1.2e9, f0_cos = 50e6, cycle = 10
|
|
421
|
+
# 输出参数:
|
|
422
|
+
# y_cos.tolist():【数据类型: list】
|
|
423
|
+
# 【取值范围: 0~1】
|
|
424
|
+
# 【参数意义: 余弦幅度值】
|
|
425
|
+
# t_cos: 【数据类型: ndarray】
|
|
426
|
+
# 【参数意义: 时间轴坐标】
|
|
427
|
+
# 返回值: y_cos.tolist(), t_cos
|
|
428
|
+
# ------------------------------------------------------------------------
|
|
429
|
+
def GenWave_Cos(self,f0_cos, cycle, fs_cos):
|
|
430
|
+
T_cos = abs(cycle/f0_cos)
|
|
431
|
+
N = round(T_cos*fs_cos)
|
|
432
|
+
t_cos = np.linspace(0,T_cos-1/fs_cos,N)
|
|
433
|
+
y_cos = np.cos(2*np.pi*f0_cos*t_cos)
|
|
434
|
+
return y_cos.tolist(), t_cos
|