使用MATLAB进行简单的电路仿真

短学期有一门比较奇怪的课:《电子实习》,内容是根据要求设计几个简单的电路(包括原理图和PCB),然后搭建并验证功能,貌似是所有电类的学生都要上的,讲道理我等电信学子上这门课也就算了,毕竟模电自控什么的都学过,隔壁计算机什么的也要学这门课也是挺怪的。不过本学期课程都转为线上了,就只能改成使用软件仿真了。

本来是在用Altidum Designer自带的仿真功能,但是这东西貌似用的人不多,不太受重视,所以挺难用的,比如说找不到把波形图导出的地方所以只能手动截图、默认的颜色极其辣眼睛以及仿真失败却没有报错等等。所以我主要用的是立创EDA,虽然应该和AD一样是基于SPICE的所以功能都差不多:暂态分析、交流分析、静态工作点之类的,但是奇奇怪怪的问题确实少很多。不过两者都缺乏自动化能力,比如带通滤波器输入不同频率的信号,然后根据信号周期设置不同的仿真时长和步长,最后自动在输出波形的标题后标注频率。其实手动做这些也行,但是折腾的快乐是无法取代的。

之所以选择使用MATLAB是因为这个学期里的自控实验和信号与系统实验都用到了,也算是挺熟悉的,搜了一下发现可以用Simulink里面的Simscape做到,注意是"scape"而非"space",一开始关键词输错了导致出来的结果比较少。

本文将以一个带通滤波器为例,绘制它的伯德图(幅频响应和相频响应),以及在分别输入f=3kHz, 5kHz, 10kHz, 40kHz及200kHz的正弦波时的输出波形。

搭建电路  

需要用的的元器件都在 Simscape/Foundation Library/Eletrical 下。简单拖拖拽拽,效果如下:

电路图

需要讲解的是Solver Configuration(就是那个f(x)=0),这东西我也不懂是干什么的,也没有用上过,但是必须要有,直接接地就行了。

然后还有左边和右边两个Voltage Sensor,相当于电压表,+-自然就是输出的正负极,而V的符号则代表输出的电压信号,它会将测量到的电压值作为物理信号(PS: Psycial Singal)输出,你可能也注意到了图上有黑色和蓝色两种模块,黑色的是普通的Simulink模块,例如Mux, Scope等,而蓝色的则是电子元件,两者是不能直接连接的,需要通过Voltage Sensor这类元件将电信号转化为物理信号,然后再使用PS-Simulink Converter把物理信号转到Simulink。

另外还有一个和正弦信号Input通过Simulink-PS Converter相连的Controlled Voltage Source,跟上面的Voltage Sensor类似,只不过那个是输出这个是输出。

搭建完毕后就可以直接运行了,但是默认时间好像是10秒,输出波形直接被压缩成一条直线了,一开始还以为是自己哪里搞错了。

频率响应  

参考官方文档,找到顶部的LINEARIZATION栏,选中一条Simulink的线(即黑线),然后添加闭环或开环输出/输出,点击Model Linearizer即可。

Bode图

程序化操作  

首先通过find_system函数列出所有模块,然后再使用get_param获取参数名称,再直接用set_param设置参数,最后直接用sim运行。

for f = [3e3 5e3 10e3 40e3 200e3]
    w = 2*pi*f;
    T = 1/f;
    stopTime = 10*T;
    stepTime = T/1e3
    % 获取参数示例
    % find_system("system") 
    % get_param("fdemo/Input", "DialogParameters")
    set_param("fdemo/Input", "Frequency", num2str(w));
    set_param("fdemo", "FixedStep", num2str(stepTime));
    set_param("fdemo", "StopTime", num2str(stopTime));
    figure;
    plot(sim("fdemo.slx").yout{1}.Values);
    title(["Frequency = " num2str(f) "Hz"]);
end