1 实习要求
老师给我们每个二人小组发了一个实验平台,上面自带示波器、任意信号发生器、面包板、可编程电源、频谱分析仪。要求为:四天内搭建一个较为复杂的电路(老师原话:不能只搭一个RC滤波),实现电路的功能,并自行阅读文档和Help文件编写自动化测试脚本,自动生成测试报告。
2 电路设计
之前从没有电子设计竞赛经验的我们在询问了某竞赛大佬之后,决定做一个最为简单的滤波电路。希望能够达到的功能是从幅值5V频率1KHz方波中滤出1KHz的正弦波,也就是我们需要滤掉其他谐波。我们首先用手头有的元器件设计了一个最为简单的二阶带通滤波电路:
透过频谱仪我们发现3KHz的谐波相比1KHz基波还是过大,于是我们又加入了一个一阶低通滤波器。
这时,频谱仪上,3KHz谐波已经基本湮没在了噪声中,但是我们的1KHz的幅值也因为两次滤波从原本的5V衰减至20mV,由于一开始没有发运放,我们只能做到这个地步。
3 电路改进
后来,开放了元器件的使用,我们能够拿到合适的元器件。于是我们重新对电路进行了改进和设计,放弃了之前的电解电容换用适合滤波的瓷片电容,并加入了两级放大电路。在测试后我们发现即便两次滤波还是不能得到完美的波形,于是我们降低了难度,将输入信号的5V、1KHz方波替换为5V、1KHz三角波,这样两次滤波就可以得到完美的1KHz正弦波。
4 测试结果
我们在二阶带通滤波经过放大电路之后加入了第一个测试点,并在电路最后的输出波形处加入了第二个测试点,他们的频谱、时域波形和幅值如下图所示:
第一个测试点的频谱:
第一个测试点的时域波形:
第一个测试点只经过了一个二阶带通滤波器,频域1KHz基波4.7V,3KHz谐波0.25V,谐波已经被抑制得很好了,但是时域上我们还是可以看出有一些失真。
#############################################################
第二个测试点的频谱:
第二个测试点的时域波形:
第二个测试点经过两次滤波、放大,得到了比较纯净的1KHz正弦波,波形比较完美。其中,1KHz基波幅值4.7V,3KHz谐波已经衰减到0.1V左右。
#############################################################
两个测试点波形对比:
对比后我们能比较明显地看出只经过一次二阶带通滤波的的波形还是不完美的,有些失真。
4 自动化测试脚本代码
function doScopeWavegen(){
print("Running Scope and Wavegen script");
Wavegen1.Channel1.Mode.text = "Simple";
Wavegen1.Channel1.Simple.Type.text = "Triangle";//设置为三角波
Wavegen1.Channel1.Simple.Offset.value = 0;//设置偏置电平为0
Wavegen1.Channel1.Simple.Frequency.value = 1000;//设置频率为1KHz
Wavegen1.Channel1.Simple.Amplitude.value = 5;//设置幅值为5V
Scope1.Trigger.Trigger.text = "Repeated";//设置触发方式
Wavegen1.run();//启动信号发生器
Scope1.run();//启动示波器
for(var idx = 0; wait(1) && idx < 10; idx++){//测试10组数据
if(!Scope1.wait()){
return;
}
//第一个测试点
var middle1 = Scope1.Channel1.measure("Middle");//测量中心值
var average1 = Scope1.Channel1.measure("Average");//测量平均值
var peaktopeak1 = Scope1.Channel1.measure("Peak2Peak");//测量峰峰值
var frequency1 = Scope1.Channel1.measure("Frequency");//测量频率
var period1 = Scope1.Channel1.measure("Period");//测量周期
//第二个测试点
var middle2 = Scope1.Channel2.measure("Middle");
var average2 = Scope1.Channel2.measure("Average");
var peaktopeak2 = Scope1.Channel2.measure("Peak2Peak");
var frequency2 = Scope1.Channel2.measure("Frequency");
var period2 = Scope1.Channel2.measure("Period");
//打印&输出
print(idx+" Middle1: "+middle1+" V"+" Average1: "+average1+" V"+" Peak2Peak1: "+peaktopeak1+" V\r\n");
FileAppend("C:\\Users\\circle\\Desktop\\data.txt",idx+" Middle1: "+middle1+" V"+" Average1: "+average1+" V"+" Peak2Peak1: "+peaktopeak1+" V\r\n");//路径中需要用"\\"转义,且要用Append函数,"\r\n"追加数据,否则会覆盖
print(" "+" Middle2: "+middle2+" V"+" Average2: "+average2+" V"+" Peak2Peak2: "+peaktopeak2+" V\r\n");
FileAppend("C:\\Users\\circle\\Desktop\\data.txt"," "+" Middle2: "+middle2+" V"+" Average2: "+average2+" V"+" Peak2Peak2: "+peaktopeak2+" V\r\n");
print(" "+" Frequecy1: "+frequency1+" Hz"+" Period1: "+period1+" s\r\n");
FileAppend("C:\\Users\\circle\\Desktop\\data.txt"," "+" Frequecy1: "+frequency1+" Hz"+" Period1: "+period1+" s\r\n");
print(" "+" Frequecy2: "+frequency2+" Hz"+" Period2: "+period2+" s\r\n");
FileAppend("C:\\Users\\circle\\Desktop\\data.txt"," "+" Frequecy2: "+frequency2+" Hz"+" Period2: "+period2+" s\r\n");
}
}
if(!('Wavegen1' in this) || !('Scope1' in this)) {
throw("Please open a Scope and a Wavegen instrument");//要在软件中启动示波器和任意信号发生器之后才能使用
}
doScopeWavegen();//主函数
5 后记
十分开心我们四天的付(hua)出(shui)得到了老师的认可。虽然最后闹了个小乌龙,但是我们还是拿了班级第一,得到了一个小开发板哈哈哈哈!
PS:致谢和我配合默契的雪糕!以及某不愿透露姓名的竞赛大佬书记!