Python计算RC电路响应

前言

Python具备强大的数据计算功能,用来做电路的仿真当然不成问题。近日在网上看到有人用Python做电路数值计算的相关工作,正好符合我最近将Python应用到硬件技术各个领域的主题,就算把文章转译过来,让大家了解一下,自己也借机学习一下。
尊重作者权益,先放上原文链接,大家也可以直接去原文链接直接看到更多的信息:
https://arachnoid.com/BiQuadDesigner/index.html

今天就抽取这篇文章的一部分,简要地介绍一下如何使用Python计算RC电路的阶跃响应,并展示了当输入为正弦波时,RC低通滤波电路的输出。

一、基本的理论

下图是一个典型的RC电路和它的阶跃响应


8635278-a16170b90653feb8.jpg

在这个简单电路中流动的瞬时电流与电阻两端的电压成正比,电容器电压变化的速率也与电流成正比。在零时,电容两端的电压为零,因此电阻的电压和电路的电流最大。 随着时间的推移,电容器两端的电压增加,导致电阻器的电压下降。这意味着电路的电流下降,导致电容器的电压变化率下降。换一句话说,电容器电压接近电源电压的速率与电容器和电源之间的剩余电压差逐步下降。

在零时刻,输出电压等于0:

在以后的任意时刻,1A的电流会导致1F电容以1V/s的速率改变电压。我们用差分方程形式来表示这一计算:
vi(n)=vi(n−1)+(v−vi(n−1))*tc

其中v是系统输入电压,tc为时间常数,它表示了相邻时刻的电压变化。输入电压与输出电压的压差乘以时间常数tc就是充电量。tc计算式为:
tc = 1.0 / (r * c * sample_rate)

二、阶跃响应的计算

RC电路的参数是10K和100uF。我们用4k的采样率来对模拟信号进行抽样。初始时刻电路输出电压为0,以后的任意时刻用上面的差分方程来计算。差分方程在程序中的具体形式是这样的:
vi += (v-vi) * tc
这一点应该不难理解。

对于一个阶跃信号,其Pyhon 源码如下:

import pylab

sample_rate = 4000.0

ta = []
da = []
db = []

# resistor value, ohms
r = 10e3

# capacitor value, farads
c = 100e-6

# time constant
tc =  1.0 / (r * c * sample_rate)

vi = 0 # integration variable

for n in range(-int(sample_rate),int(sample_rate) * 5):
    t = n / sample_rate
    ta.append(t)
    # generate the test step function
    v = (0,1)[t > 0]
    da.append(v)
    # perform the filtering function
    vi += (v-vi) * tc
    db.append(vi)

pylab.plot(ta,da)
pylab.plot(ta,db)

pylab.show()

运行结果如下:


8635278-c8f38e822459f0bd.jpg
阶跃响应

三、正弦型号的输出

当我们给RC电路输入正弦信号的时候,计算过程和阶跃函数其实样的,只要把阶跃函数的输出电压替换成正弦信号即可,源码如下:

import math, pylab

# samples per second
sample_rate = 40000.0

# data lists for plotting
ta = []
da = []
db = []

# resistor value ohms
r = 1e3

# capacitor value farads
c = 0.5e-6

# time constant
tc =  1.0 / (r * c * sample_rate)

# integration variable
vi = 0

# signal frequency
f = 440

for n in range(int(sample_rate / 200)):
    # t = time, seconds
    t = n / sample_rate
    ta.append(t)
    # generate the test signal
    v = math.sin(2 * math.pi * f * t)
    da.append(v)
    # perform the filtering function
    vi += (v-vi) * tc
    db.append(vi)

pylab.plot(ta,da)
pylab.plot(ta,db)

pylab.show()

运行结果如下:


8635278-543a7e84c465d1ef.jpg

其中黄色线是输出信号。

后记

使用Pyhon可以完成一些电路计算,当然这需要你对电路的原理和数学形式有很深的了解,并且需要你有足够好的编程能力对这些计算进行实现。当然现在,很多软件都已经完成各种形式的电路仿真计算,应该有很多以前的代码可以借鉴。原文的作者用这种方式进行滤波器的设计,有兴趣的读者可以去了解下。

进入我的主页,你可以看到Pyhon是如何在MCU和FPGA上应用的,甚至你能看到使用Python来进行硬件描述语言的编程。关注我你可以看到更多Pyhon在硬件领域的应用,希望能给你的工作带来帮助。

猜你喜欢

转载自blog.csdn.net/weixin_33696822/article/details/87622424