不稳定多谐振荡器的仿真
本例将演示不稳定多谐振荡器的仿真。
不稳定多谐振荡器是产生连续矩形脉冲的自振荡电路。 它没有稳定的状态,并在两个晶体管之间自动切换,产生周期性信号。
多纤颤器可用于在各种系统中生成时钟信号。
数学描述
脉冲和暂停的持续时间由晶体管基极电路中的RC电路决定。
每个晶体管的"ON"状态的持续时间:
总振荡周期(对称方案):
信号的频率:
模型图:
定义加载和运行模型的函数:
In [ ]:
function start_model_engee()
try
engee.close("npn_transistor", force=true) # закрытие модели
catch err # в случае, если нет модели, которую нужно закрыть и engee.close() не выполняется, то будет выполнена её загрузка после catch
m = engee.load("$(@__DIR__)/astable_multivibrator.engee") # загрузка модели
end;
try
engee.run(m, verbose=true) # запуск модели
catch err # в случае, если модель не загружена и engee.run() не выполняется, то будут выполнены две нижние строки после catch
m = engee.load("$(@__DIR__)/astable_multivibrator.engee") # загрузка модели
engee.run(m, verbose=true) # запуск модели
end
end
Out[0]:
运行模拟
In [ ]:
start_model_engee();
将仿真数据写入变量:
In [ ]:
t = simout["astable_multivibrator/правый"].time[:]
V_right = simout["astable_multivibrator/правый"].value[:]
V_left = simout["astable_multivibrator/левый"].value[:]
I_R1 = simout["Resistor 1.i"].value[:]
I_R4 = simout["Resistor 4.i"].value[:]
Out[0]:
数据可视化
In [ ]:
using Plots
两个晶体管上集电极-发射极电压的可视化:
In [ ]:
plot(t, V_left, linewidth=2)
plot!(t, V_right, linewidth=2)
Out[0]:
连接到晶体管集电极的电阻上的电流可视化:
In [ ]:
plot(t, I_R1, linewidth=2)
plot!(t, I_R4, linewidth=2)
Out[0]:
加工仿真结果:
启动统计资料库:
In [ ]:
using Statistics
用于查找电压波动频率和周期的函数的定义:
In [ ]:
function calculate_oscillation_properties(time::Vector{T}, x::Vector{T}) where T <: Real
# Проверка длины векторов
if length(time) != length(x)
error("Векторы времени и сигнала должны быть одинаковой длины")
end
n = length(time)
n < 2 && return (NaN, NaN) # Недостаточно данных
# Находим среднее значение сигнала
avg = sum(x) / n
# Ищем моменты пересечения среднего значения снизу вверх
up_crossings = T[]
for i in 2:n
if x[i-1] < avg && x[i] >= avg
# Линейная интерполяция для точного определения времени пересечения
t = time[i-1] + (time[i] - time[i-1]) * (avg - x[i-1]) / (x[i] - x[i-1])
push!(up_crossings, t)
end
end
# Проверка достаточного количества пересечений
length(up_crossings) < 2 && return (NaN, NaN)
# Расчёт периодов (в единицах времени)
periods = diff(up_crossings)
mean_period = mean(periods)
frequency = 1 / mean_period
return "Частота колебаний: $frequency Гц. Период колебаний: $mean_period с."
end
Out[0]:
将函数应用于电压值向量(任何信号都可以替换):
In [ ]:
calculate_oscillation_properties(collect(t)[:,1], collect(V_left)[:,1])
Out[0]:
结论:
在这个例子中,我们考虑了一个不稳定的多谐振荡器模型,其中决定振荡频率和周期的关键因素是形成延时RC电路的基本电阻(R2,R3)和电容。 集电极电阻(R1,R4)对信号的频率没有影响-它们的作用仅限于限制通过晶体管的电流并形成输出电压的幅度。