用 IT2806 源表录音+播放
视频:用喇叭来录音,把IT2800高端源表用成了VM该有的不正经样子
材料
USB 配置
进入Menu
-> System
-> Communication
配置 USB Type
为 Host
,如图:
![](https://verimake.com/assets/files/2023-05-16/1684231904-632541-usb-1.jpg)
配置完成后,就可以用前面板的 USB 口接 U 盘了。
录音
录音时,使用源表的 Recorder
功能
源表设为两线连接,把扬声器连接到源表的输出
配置
进入 Menu
-> Recorder
-> Setting
-> Advanced Setting
配置如下图 :
![](https://verimake.com/assets/files/2023-05-16/1684231923-234432-recorder-1.jpg)
Time
为 100us
,采样率 10kSaps
Recorder Mode
为 Once
,不循环采集
Point Number
为 99999
,录音约 10 秒
File Format
为 Csv
退回 Recorder
界面
![](https://verimake.com/assets/files/2023-05-16/1684231940-30212-recorder-2.jpg)
V Range
设为 200mV
V Set
设为 0
I Range
设为 1uA
打开电源输出,点 Run
开始采集波形。
录制结束后,从前面板接入 U 盘
进入 Menu
-> Recorder
-> Setting
-> Advanced Setting
选择 Export to Udisk
把录音波形导出到 U 盘。波形文件是一个 CSV 表格。
记住文件名,后面需要编辑这个文件。
![](https://verimake.com/assets/files/2023-05-16/1684231953-596108-recorder-3.jpg)
波形处理
文件模板
有了录音波形,我们还要把它适当放大,并转为扫描列表文件的格式。
首先我们要拿到扫描列表文件的格式模板:
进入Menu
-> Sweep
-> Setting
-> Common Setting
Mode
设置为 List
![](https://verimake.com/assets/files/2023-05-16/1684231966-878670-swe-temp-1.jpg)
点击 New File
新建电压扫描列表。
在扫描列表添加几个扫描点,电压值随意取。
![](https://verimake.com/assets/files/2023-05-16/1684231978-844668-swe-temp-2.jpg)
然后点击 Save
选择 USB
,把 扫描列表存到 U 盘里。
这也是一个 CSV 表格。记住文件名,后面需要编辑它。
![](https://verimake.com/assets/files/2023-05-16/1684232005-824894-swe-temp-3.jpg)
这样我们就获得了扫描列表的模板。
数据放大
- 把 U 盘插到电脑上
- 打开录音波形的数据表格,把
Volt(V)
(电压)一列适当放大(比如乘10000。)放到最后一列。(EXCEL 可以先复制单元格,用 Shift + Ctrl + ↓
全选再批量粘贴)
注意生成的波形幅值应该在 ±2V 之间(如果你清楚喇叭特性的话,也可以不注意 🙂 )。
最后一列就是我们播放用的扫描列表数据。
![](https://verimake.com/assets/files/2023-05-16/1684232019-874156-table-1.png)
- 再打开 扫描列表模板 的表格,把 Total Steps 改成 99999 (与录音对应,最大为99999点)
再把录音波形最后一列的数据批量粘贴到 扫描列表模板的 Voltage(V)
列中
然后构造列表序号:第二个序号开始,每个序号等于上一个序号加1,批量复制公式。(用 Ctrl + ↓
找到数据列表的底端,再 Shift + Ctrl + ↑
可全选序号区域)
![](https://verimake.com/assets/files/2023-05-16/1684232030-402784-table-2.png)
播放用的扫描列表就做好了,可以到列表末尾检查下序号数目,应为 99999
![](https://verimake.com/assets/files/2023-05-16/1684232044-109691-table-3.png)
- 把 扫描列表 保存到 U 盘上
播放
把 U 盘接到源表上
进入 Menu
-> Sweep
-> Setting
-> Common Setting
![](https://verimake.com/assets/files/2023-05-16/1684232061-967251-swe-temp-1.jpg)
Mode
设为 List
End Type
设为 OFF
Range
设为 Best
Open File
,打开 刚才编辑好的扫描列表,打开后左侧可以看到列表的部分数据
进入 Trigger Setting
页面
![](https://verimake.com/assets/files/2023-05-16/1684232084-937596-swe-2.jpg)
Start Trigger Source
设为 Immediate
Step Source
设为 Timer
Period
设为 100us
回到 Sweep
![](https://verimake.com/assets/files/2023-05-16/1684232096-239542-swe-3.jpg)
V Set
设为 0
,以防开启电源时烧毁扬声器
V Range
设置 2V
( 视扬声器功率和列表数据的幅值而定 )
I Set
视你的扬声器功率而定,建议先用小电流测试,以防烧毁扬声器
打开电源输出,按 Run
启动扫描,就能播放录音了。
如果音量过小或者有爆裂声,可能是 VRange
或 I Set
过小,可以自行谨慎地调节。
python + SCPI 命令控制录音
除了用源表界面控制录音之外,还可以用 PC 通过 SCPI 命令控制 IT2806 录音和播放。IT2806 可以通过 USB、以太网或 GPIB 接口连接 PC,接收 SCPI 命令。
通过 USB 连接比较方便。配置 USB 的方法:
进入 Menu
-> System
-> Communication
USB Type
设为 Device
USB Device
设为 VCP
(虚拟串口)
![](https://verimake.com/assets/files/2023-05-16/1684232110-994773-usb-2.jpg)
我们用 python 控制源表。要先安装 SCPI 库 PyVISA 和 PyVISA-py:
pip install -U pyvisa
pip install pyvisa-py
下面是实现录音播放功能的 python 代码:
# 适用于 IT2800 源表
import pyvisa
import time
resourceOrder = 0 # 源表在 resource 列表中的顺序,从 0 开始。例如 print(rm.list_resources()) 打印的第 2 个设备是源表,那么这里要填 1
record_time = 1 # 录制时间,单位为秒。
points = int(record_time * 1E4)
rm = pyvisa.ResourceManager()
print(rm.list_resources())
smu = rm.open_resource(rm.list_resources()[resourceOrder])
print(smu.query('*IDN?'))
# record
# 设置输出
smu.write('*RST')
smu.write('VOLT:RANG 0.2')
smu.write('VOLT 0.2')
smu.write('CURR:RANG 1E-6')
smu.write('CURR 1E-9')
smu.write('SENS:FORM:ELEM:SENS VOLT') # 设置 Trace 数据元素为电压
smu.write('SENS:FORM ASCII') # 设置 Trace 返回值类型为字符串
smu.write('SENS:REC:ACQ:INT:APER 1E-4') # 采样率 10K
smu.write('SENS:REC:APER MAX') # 孔径时间
smu.write('SENS:REC:DATA:NUMB ' + str(points)) # 采样长度
smu.write('SENS:REC:MODE ONCE') # 一次采样
smu.write('FUNC:TRIG:CONT 1') # 设置自动触发
smu.write('OUTPUT 1') # 输出
smu.write('SENS:RECORder:RUN') # 启动 recorder 功能
# 等待采集结束
cnt = 0
while(cnt < points):
cnt = int(smu.query('SENS:TRAC:POIN:ACT?'))
print('Recording : ' + '{:.1f}'.format(cnt/points*100) + '%')
print('Receiving,please wait.')
volts = smu.query('SENS:TRAC:DATA?').split(';') # 获取所有缓存数据
# 放大 10000 倍
for i in range(0, len(volts)):
volts[i] = '{:.4f}'.format(float(volts[i]) * 10000)
print(volts)
# play
smu.write('*RST')
# 设置输出
smu.write('OUTPUT 0')
smu.write('VOLT:RANG 20')
smu.write('VOLT 0')
smu.write('CURR:RANG 1')
smu.write('CURR 1')
# 扫描设置
smu.write('SOUR:SWE:FIN OFF') # 结束后关闭扫描
smu.write('SOUR:SWE:SPAC LIST') # 列表模式
smu.write('SOUR:SWE:TRIG:STEP:TIM 1E-4') # 扫描步进触发频率 1kHz
smu.write('SOUR:SWE:TRIG:STEP:SOUR TIM') # 扫描步进触发源为定时器
smu.write('SOUR:SWE:TRIG:STAR:SOUR BUS') # 总线触发扫描
smu.write('SOUR:LIST:VOLT:CLE') # 清除电压列表
print(smu.query('SOUR:LIST:VOLT:POIN?')) # 查询电压列表点数
end = int(points/20-1)
for i in range(0, end):
smu.write('SOUR:LIST:VOLT:APP '+','.join(volts[i*20:(i+1)*20]))
time.sleep(0.001)
if(i % 100 == 0):
print('Sending : '+'{:.1f}'.format(i/end * 100)+'%')
time.sleep(0.001)
smu.write('SOUR:LIST:CONF') # 令当前列表生效。若执行失败,源表会发出提示音
print(smu.query('SOUR:LIST:VOLT:POIN?')) # 查询电压列表点数
time.sleep(0.001)
smu.write('OUTPUT 1') # 输出
time.sleep(0.001)
smu.write('SOUR:SWE:INIT') # 开启扫描
time.sleep(0.001)
smu.write('*TRG') # 触发扫描
time.sleep(0.3)
# 等待扫描结束
while smu.query('SOUR:SWE:RST?') == 'RUN\n':
time.sleep(0.3)
print('Running')
print('End')
smu.write('SYST:LOC') # 源表回到本地模式