Engee 文档
Notebook

不稳定多谐器建模

本例将演示不稳定多频振荡器的建模。

不稳定多频振荡器是一种能产生连续矩形脉冲的自动振荡电路。它没有稳定状态,会在两个晶体管之间自动切换,产生周期性信号。

多频振荡器可用于在各种系统中产生时钟信号。

数学描述

脉冲和暂停的持续时间由晶体管基极电路中的 RC 电路决定。

每个晶体管 "导通 "状态的持续时间:

$$t = 0.69 \cdot R \cdot C$$

总振荡周期(对称电路): $$T = 2 \cdot t = 1.38 \cdot R \cdot C$$

信号频率 $$f = \frac{1}{T} = \frac{1}{1.38 \cdot R \cdot C}$$

模型示意图

novator1_2_1741865268001.png

定义加载和运行模型的函数:

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]:
start_model_engee (generic function with 1 method)

运行模拟

In [ ]:
start_model_engee();
Building...
Progress 0%
Progress 5%
Progress 11%
Progress 16%
Progress 21%
Progress 27%
Progress 32%
Progress 37%
Progress 43%
Progress 48%
Progress 54%
Progress 59%
Progress 65%
Progress 70%
Progress 75%
Progress 81%
Progress 86%
Progress 92%
Progress 97%
Progress 100%
Progress 100%

将模拟数据写入变量:

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]:
WorkspaceArray{Float64}("Resistor 4.i").value

数据可视化

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]:
calculate_oscillation_properties (generic function with 1 method)

将函数应用于电压值矢量(任何信号均可替代):

In [ ]:
calculate_oscillation_properties(collect(t)[:,1], collect(V_left)[:,1])
Out[0]:
"Частота колебаний: 461.73240656747765 Гц. Период колебаний: 0.002165756584931969 с."

结论

在本示例中,我们考虑了一个不稳定多频振荡器模型,其中决定振荡频率和周期的关键因素是基极电阻器(R2、R3)和构成延时 RC 电路的电容器。集电极电阻(R1、R4)不影响信号的频率,其作用仅限于限制通过晶体管的电流和形成输出电压的振幅。