Введение

Так уж сложилось, что моя профессиональная деятельность связана с разными областями науки и техники. Отчасти это произошло из-за того, что я преподаю в железнодорожном вузе, на старших курсах, и в дисциплинах, которые ставят мне в нагрузку, сходятся разные области наук. Специальные дисциплины вообще во многом междисциплинарные, как по духу, так и по содержанию.

Среди того, что мне приходилось вести есть такой курс: "Электронная и преобразовательная техника электрического транспорта железных дорог". Специалисту понятно - речь идет о силовой электронике, в самых радикальных её проявлениях. Конечно, для того чтобы не объяснять материал на пальцах, да и для проведения лабораторных работ, в дело идут симуляторы электронных схем. До недавнего времени я использовал LTSpice, однако теперь это невозможно. Но на мое счастье, благодаря vv_kuznetsov, воскрес из мертвых симулятор Qucs, пережив реинкарнацию в виде Qucs-S. Название подчеркивает совместимость с идеологией spice-моделирования электронных схем. Надо сказать что проект мне понравился, я пел, пою и буду петь дифирамбы данному проекту, ибо более достойной альтернативы (да еще и open source!) я не находил.

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

Что же, остается один выход - создавать такие модели самому. Благо симулятор Qucs-S имеет массу инструментов для интеграции spice-моделей, чему даже посвящена отдельная статья. Вооружившись этой статьей, тщательно разобравшись в ней, мне удалось засунуть в симулятор произвольный силовой диод (да, это довольно просто). Но вот с IGBT-транзисторами меня ждал облом. В сети есть масса пространных описаний моделей этих приборов, но толкового рабочего решения не нашлось. Deepseek навел на след модели Хефнера, и даже предложил реализацию, которая в Qucs-S не заработала с ходу.

Ну что же, делать нечего. Придеться погрузиться в самую глубину вопроса - что есть SPICE, как его использовать. Читатель может сказать - да полно документации. Конечно, по симулятору ngspice, являющимся основным бэкэндом Qucs-S, документация исчерпывающая до жути. Правда построена она на принципе описания, а не на принципе освоения от простого к сложному. А последнее и хочется иметь для обучения, но увы... А раз так, то если уж я решился погрузиться в эту тему, то сам напишу такую документацию, в виде серии статей. Сяду на своего любимого коня - осваиваю сам - делюсь с окружающими. Такой формат моих статей привычен моим читателям. Так что, поехали!

1. Закон Ома для участка цепи

Пойдем "от сохи" - забудем на время про Qucs-S, а обратимся к его бэкнэнду - Ngspice. Взять его можно тут, вместе с упомянутой документацией в формате PDF. Для винды - устанавливается простой распаковкой архива, но желательно прописать путь к папке bin дистрибутива в переменной %PATH%, дабы запускать модели из произвольной точки файловой системы. Для линкусов и того проще - читайте мануалы к своим дистрибутивам, наверняка данный продукт есть в репозитории.

Установив Ngspice, нарисуем схему. В прямом смысле, руками, карандашом на бумаге. Вот такую

Простейшая цепь - источник с ЭДС равной E, нагрузка в виде резистора с сопротивлением R1. Пускай это будут конкретные значения, E = 100 В, R1 = 20 Ом. Добавим в схему узлы. Позвольте, какие узлы? Здесь же нет узлов! Узлов в понимании классического курса ТОЭ тут нет, а вот точки соединения компонентов схемы - есть! Поэтому добавим узлы, нумеруя их с нуля, вот так

Нулевой узел обязательно необходим в схеме. Дело в том, что современные численные методы расчета схем основывается на методе узловых потенциалов. А для его применения необходимо обозначить узел схемы, потенциал которого равен нулю. Именно узел с номером "0" и выполняет роль такого узла в схеме.

Задача состоит в том, чтобы определить ток, который течет в этой цепи. Ответ, разумеется очевиден - I = E / R1 = 100 / 20 = 5 А. Теперь поставим задачу рассчитать этот ток перед Ngspice.

Для этого нам нужно составить описание схемы, с указанием формы и метода расчета. Требуется написать так называемый netlist схемы. Что ж, в любом текстовом редакторе набираем следующие заклинания

*
* Анализ простейшей цепи на постоянном токе
*

.title Ohm's law demo

* Описание схемы
V1 1 0 DC 100 ; Источник напряжения
R1 1 0 20 ; Нагрузка - резистор сопротивлением 20 Ом

* Метод анализа
.op ; Расчет рабочей точки (статический режим на постоянном токе)

.end ; Конец описания схемы

Сохраняем это в файл с именем, ну например dc_simple.cir. Далее, в консоли перейдем в этот каталог и вызовем

E:\work\Projects\ngspice>ngspice_con dc_simple.cir

запуская консольный вариант симулятора. Симулятор загрузит схему, сообщив

Warning: can't find the initialization file spinit.
******
** ngspice-45.2 : Circuit level simulation program
** Compiled with KLU Direct Linear Solver
** The U. C. Berkeley CAD Group
** Copyright 1985-1994, Regents of the University of California.
** Copyright 2001-2025, The ngspice team.
** Please get your ngspice manual from https://ngspice.sourceforge.io/docs.html
** Please file your bug-reports at https://ngspice.sourceforge.io/bugrep.html
** Creation Date: Sep  6 2025   16:39:28
******
Warning: no graphics interface!
 You may use command 'gnuplot'
 if GnuPlot is installed.

Note: No compatibility mode selected!


Circuit: Ohm's law demo

ngspice 1 ->

Симулятор, после сообщения что мы чего-то там не настроили, перечисления копирайтов, и что не выбран режим совместимости с другими spice-симуляторами (ох уж эти стандарты...), говорит нам что загружена схема Ohm's law demo, а это именно то что мы писали после .title. И более того - приглашает нас ввести новую команду. Занятно. Идем дальше и даем команду

ngspice 1 -> listing

Команда требует выдать листинг загруженной схемы. Ок, если все правильно, мы его получаем

ngspice 1 -> listing
        Ohm's law demo

     1 : ohm's law demo
     2 : .global gnd
     7 : v1 1 0 dc 100
     8 : r1 1 0 20
    10 : .op
    12 : .end
ngspice 2 ->

Прошу обратить внимание на то, что если листинга нет, то мы получим список ошибок, допущенных нами при составлении netlist. Если же листинг есть, как в примере выше, то он лишен комментариев. Многострочные комментарии помечаются звездочкой, однострочные - точкой с запятой, думаю внимательный читатель обратил на это внимание.

Итак, листинг выдан, проверяем его всегда. И если все в порядке даем следующую команду

ngspice 2 -> run

И...

ngspice 2 -> run
Doing analysis at TEMP = 27.000000 and TNOM = 27.000000

Using SPARSE 1.3 as Direct Linear Solver
 Reference value :  0.00000e+00
No. of Data Rows : 1
ngspice 3 ->

нам сообщили что проведен некий анализ, при этом температура среды 27 градусов по Цельсию (стандартно для западной электроники) и... что? Где результаты? А их нужно вывести. Что мы хотим? Ток? Ну хорошо знать как, и козырять эффектом послезнания, но я все же рискну, оставив объяснения на потом. Даем команду напечатать нам ток, текущий через источник напряжения V1

ngspice 3 -> print i(V1)

и получаем....

ngspice 3 -> print i(V1)
i(v1) = -5.00000e+00
ngspice 4 ->

Ура! Мы получаем 5 ампер... минус пять ампер...? Ах, да, я кое что забыл. А забыл вот это

Да, указать полярность на источнике. Положительным направлением протекания тока считается направление от "+" к "-". Стрелкой на источнике показано направление протекания тока в нагрузку - так же точно от "+" к "-". Но меряя ток на источнике, а именно этим мы и занимались, мы попросили померять ток на нашем источнике, забывая, что направление тока у измерителя получиться обратным. Ведь он думает что ток течет снизу вверх в плюс. а он течет сверху в низ, по факту. Вот и минус нарисовался. Но модуль тока рассчитан верно, что не может нас не радовать. Мы решим эту проблему но чуть позже, а пока....

2. А что это было?

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

V1 1 0 DC 100 ; Источник напряжения

Описание состоит из лексем, разделенных пробелами. Итак

  1. V1 - V - всегда означает источник напряжения. То что следует после, любая буквенно-цифровая последовательность, имеет отношение к уникализации данного объекта в схеме. Итак, источник напряжения. Далее номера узлов 1 и 0. Первый узел - всегда анод, то есть "+". Плюс источника на узле 1. Второй - катод, то есть минус. Минус на узле "0". Далее "DC" означает что источник постоянного тока. Ну а число потом - величина ЭДС источника. Правда просто?

  2. Источники могут содержать более сложное описание, но то что перечислено - главное.

Второй компонент схемы - резистор. Одним выводом он подключен к плюсу источника, другим к минусу. Поэтому мы и написали

R1 1 0 20 ; Нагрузка - резистор сопротивлением 20 Ом

Где

  1. R - резистор. Дальнейшее, без пробелов лишь маркер данного резистора, определяющее его уникальное имя.

  2. Второе число - узел с высоким потенциалом. В данном случае, и это очевидно, он подключен к узлу 1 источника, что и указано.

  3. Второе число - узел с низким потенциалом, нулевой узел, минус источника.

  4. Третье число - величина сопротивления, в данном случае 20 Ом.

Итак, общий синтаксис описания источников таков

VXXXXXX +n -n DC Voltage

А резисторы так

RYYYYYY +n -n Resistance

n +/- - номер узла с высоким и низким потенциалом. Но если бы все было так просто, я бы и ни писал ничего. Но оставим нюансы для следующих встреч, а пока, уверен, объяснил я понятно.

Идем дальше. После описания схемы идет директива

.op ; Расчет рабочей точки (статический режим на постоянном токе)

Что сие значит? А значит оно указание симулятору обсчитать схему на постоянном токе с определение рабочей точки. В данном случае оно говорит - посчитай статический установившийся режим. Подели 100 на 20, грубо говоря.

И да, еще раз скажу о том, что многострочные комментарии предваряются звездочкой, а однострочные - точкой с запятой.

3. А почему минус?

А потому, что мы попались в ловушку. помните как говорил нам преподаватель по ТОЭ. "Если вы указали в схеме направление тока, но получили минус, значит вы не угадали. Все Ок".

Все это верно, но. В данной простой схеме все понятно - есть узел с нулевым потенциалом и направление тока очевидно. Давайте решим эту проблему. Для этого модернизируем нашу схему и netlist. Схему -так

Мы добавили новый источник
Мы добавили новый источник

Мы добавили источник с напряжением равным нулю. А в месте с ним новый узел схемы, номер 2. что ж, учтем это в нетлисте

*
* Анализ простейшей цепи на постоянном токе
*

.title Ohm's law demo

* Описание схемы
Vmeas 2 1 0; Пустой источник-измеритель
V1 2 0 DC 100 ; Источник напряжения
R1 1 0 20 ; Нагрузка - резистор сопротивлением 20 Ом

* Метод анализа
.op ; Расчет рабочей точки (статический режим на постоянном токе)

.end ; Конец описания схемы

Загрузим это в симулятор, возражений у него это не вызывает

Circuit: Ohm's law demo

ngspice 1 -> listing
        Ohm's law demo

     1 : ohm's law demo
     2 : .global gnd
     7 : vmeas 2 1 0
     8 : v1 2 0 dc 100
     9 : r1 1 0 20
    11 : .op
    13 : .end
ngspice 2 ->

Запустим симуляцию

ngspice 2 -> run
Doing analysis at TEMP = 27.000000 and TNOM = 27.000000

Using SPARSE 1.3 as Direct Linear Solver
 Reference value :  0.00000e+00
No. of Data Rows : 1
ngspice 3 ->

Попробуем получить ток источника Vmeas

ngspice 3 -> print i(Vmeas)
i(vmeas) = 5.000000e+00
ngspice 4 ->

Да-да, наши честные 5 ампер.... Без минуса. Минус отсутствует потому, что наш источник-измеритель - пассивный элемент схемы. Он не вырабатывает ЭДС и даже род тока для него неопределен описанием (что допускается). По сему он работает по правилу - ток идет от "+" к "-", а описав его так

Vmeas 2 1 0; Пустой источник-измеритель

мы лишь у казали путь снятия тока в схеме оператором i(....). Если вы попытаетесь сделать аналогичное с другим пассивным элементом, а в нашей схеме это так, то...

ngspice 4 -> print i(R1)

Error: no such function as i,
    or i(R1) is not available.
ngspice 5 ->

у вас ничего не выйдет. В классике spice, по видимому, измерителями могут быть только активные элементы схемы.

Заключение

Это пилотная статья нового цикла. Ругайте, хоть обругайтесь. Но! Я хочу выразить огромное уважение Вадиму Кузнецову, который vv_kuznetsov за огромную работу по созданию свободного симулятора схем. И, мне, как заинтересованному лицу очень приятно, что недавно вышел новый релиз. Я уже освоил его, буду двигаться в плане освоения дальше.

В своем новом цикле хочу показать обратную сторону и Qucs-S тоже, думаю Вадим не обидится. Хочу заметить одну мысль - сложное познается из простого. В этом философия моих постов на данном ресурсе и вообще норма жизни.

Всех вам благ, мои читатели, и до новых встреч!

Комментарии (0)