Моделирование нестабильного мультивибратора
В данном примере будет продемонстрировано моделирование нестабильного мультивибратора.
Нестабильный мультивибратор — это автоколебательная схема, генерирующая непрерывные прямоугольные импульсы. Она не имеет устойчивых состояний и автоматически переключается между двумя транзисторами, создавая периодический сигнал.
Мультивибраторы могут применяться для генерации тактовых сигналов в различных системах.
Математическое описание
Длительность импульсов и пауз определяется RC-цепями в базовых цепях транзисторов.
Длительность состояния "ON" для каждого транзистора:
Общий период колебаний (при симметричной схеме):
Частота сигналов:
Схема модели:

Определение функции для загрузки и запуска модели:
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
Запуск симуляции
start_model_engee();
Запись данных симуляции в переменные:
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[:]
Визуализация данных
using Plots
Визуализация напряжения коллектор-эмиттер на обоих транзисторах:
plot(t, V_left, linewidth=2)
plot!(t, V_right, linewidth=2)
Визуализация тока на резисторах, соединённых с коллекторами транзисторов:
plot(t, I_R1, linewidth=2)
plot!(t, I_R4, linewidth=2)
Обработка результатов симуляции:
Запуск библиотеки статистики:
using Statistics
Определение функции для нахождения частоты и периода колебаний напряжения:
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
Применение функции к вектору значений напряжения (могут быть подставлены любые сигналы):
calculate_oscillation_properties(collect(t)[:,1], collect(V_left)[:,1])
Выводы:
В данном примере мы рассмотрели модель нестабильного мультивибратора, где ключевыми элементами, определяющими частоту и период колебаний, являются базовые резисторы (R2, R3) и конденсаторы, формирующие времязадающие RC-цепи. Коллекторные резисторы (R1, R4) не оказывают влияния на частоту сигнала — их роль сводится к ограничению тока через транзисторы и формированию амплитуды выходного напряжения.