Документация Engee
Notebook

Моделирование нестабильного мультивибратора

В данном примере будет продемонстрировано моделирование нестабильного мультивибратора.

Нестабильный мультивибратор — это автоколебательная схема, генерирующая непрерывные прямоугольные импульсы. Она не имеет устойчивых состояний и автоматически переключается между двумя транзисторами, создавая периодический сигнал.

Мультивибраторы могут применяться для генерации тактовых сигналов в различных системах.

Математическое описание

Длительность импульсов и пауз определяется RC-цепями в базовых цепях транзисторов.

Длительность состояния "ON" для каждого транзистора:

$$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) не оказывают влияния на частоту сигнала — их роль сводится к ограничению тока через транзисторы и формированию амплитуды выходного напряжения.