al_fuhrmann (al_fuhrmann) wrote,
al_fuhrmann
al_fuhrmann

Category:

gEDA - простая модель симистора

В этой части мы создадим еще одну схему в отдельном файле. Поскольку встроенной в SPICE модели тиристора или симистора не существует, то нам придется заменить его схемой из других имеющихся. Наша простая схема не учитывает всей динамики и особенностей поведения симисторов, мы симулируем только ток удержания. Мы не собираемся делать старинный электровоз или подводную лодку восьмидесятых годов. Нам нужен симистор для управления лампочкой, ток через которую не превысит 1А. Имея две схемы, мы получим их списки узлов и будем объединять результаты, готовя общую схему к симуляции.

Создадим новый файл, скажем, triac.sch, в том же самом каталоге, что и прежний. Поскольку эта схема у нас для печати явно не предназначена, удалим рамку оформления. Только удобнее сделать это сразу, до вставки каких-либо элементов. Рамка окажется выделенной только если взять ее в выделение целиком, кликами по ней она не выделяется. Выделенную рамку удаляем.

Найдем в библиотеке модели диода, резистора, конденсатора и источника напряжения. Нажмем клавишу I и пишем в фильтре: ca - выбираем символ capacitor-1.sym, re - выбираем символ resistor-2.sym (привычный нам европейский символ резистора), dio - выбираем диод, и vd - выбираем источник напряжения vdc-1.sym.

Теперь выберем управляемый напряжением ключ. Пишем в фильтре: spice*sw - и выбираем единственный в библиотеке spice voltage controlled switch. Звездочка - это подстановочный символ. Я не помню точного названия этого элемента, помню только, что он относится к элементам для симуляции, почему я и обратился к библиотеке spice, и что это ключ. Поэтому воспользовался регулярным выражением и сэкономил время на ручной поиск путем раскрывания и прокрутки списков библиотек.

Найдя нужные элементы, строим из них следующую схему:



Я специально постарался сделать ее как можно проще. Диоды D1 и D2 имитируют управляющий электрод. Он работает от импульсов любой полярности и создает ток, который можно регистрировать на амперметре Vg. Это такая фишка в ngspice: поскольку, как мы знаем из теоретической электротехники, идеальный источник напряжения имеет бесконечно малое сопротивление, то это будет идеальным амперметром. Алгоритм работы симулятора ngspice таков, что он рассчитывает токи для всех источников напряжения. Поэтому источником с нулевым напряжением можно смело измерять ток.

Источник B1 является зависимым источником напряжения. Электрически он никак не связан с Vg (за исключением земли, но об этом чуть позже). Однако, имеет связь с ним через математическое выражение, записанное под ним. Он управляет ключами S1 и S2 по некоторым условиям.

Главная цепь проходит через собственно ключи, диоды, которые представляют модель открытых переходов в симисторе, и еще один амперметр.

"Оборванный" провод возле R4 в действительности совсем не оборван. Он подключен к выводу 1 источника B1, поскольку данный узел имеет имя ctl. По умолчанию, все узлы нумеруются, но при желании любому из них можно присвоить любое допустимое имя.

Теперь о земле. Земля - она же точка с нулевым потенциалом - обязательно должна присутствовать в любой схеме, предназначенной для симуляции. Без нее симулятор наотрез откажется выполнять какие-либо расчеты. Выбор ее совершенно произволен, но она должна быть. Любой контур должен иметь связь с землей, прямо или через другую цепь. Земля является глобальным символом и видна отовсюду в любой иерархии подсхем. Поэтому не стоит беспокоиться о том, что мы использовали "неучтенную" землю в схеме. Этот контур - независимый, касающийся схемы только в одной общей точке. В самом ключе управляющая часть никак не связана электрически с управляемой. Это такая же поведенческая модель как и B. Она нигде и никогда не "коротнет".

Теперь займемся генерацией нетлистов. В том каталоге, где у нас находятся схемы ltimer.sch и triac.sch откроем терминал, и выполним две одинаковые команды (для каждого из файлов):



Третьей командой я просто подшил оба файла в общий, с именем ltimer.cir Этот файл мы и будем симулировать, но сначала надо привести его в порядок, убрать лишнее и добавить недостающее.

Это обычный текстовый файл. Вот его листинг:

* gnetlist -g spice-sdb -o triac.net triac.sch
*********************************************************
* Spice file generated by gnetlist                      *
* spice-sdb version 4.28.2007 by SDB --                 *
* provides advanced spice netlisting capability.        *
* Documentation at http://www.brorson.com/gEDA/SPICE/   *
*********************************************************
*==============  Begin SPICE netlist of main design ============
D2 4 G dg 
R4 ctl 6 2  
C2 0 6 1u  
R3 3 5 1k  
D4 3 5 dac 
S2 A 5 6 0 swpwr 
Vm 3 K DC 0
Vg 4 K DC 0V
Rg 4 G 1k  
D1 G 4 dg 
R1 ctl 2 2  
C1 0 2 1u  
B1 ctl 0 V=I(Vg)*40+ abs(I(Vm)) > 0.015 ? 1 : 0 
R2 3 1 1k  
D3 1 3 dac 
S1 A 1 2 0 swpwr 
.end
* gnetlist -g spice-sdb -o ltimer.net ltimer.sch
*********************************************************
* Spice file generated by gnetlist                      *
* spice-sdb version 4.28.2007 by SDB --                 *
* provides advanced spice netlisting capability.        *
* Documentation at http://www.brorson.com/gEDA/SPICE/   *
*********************************************************
*==============  Begin SPICE netlist of main design ============
VS a 0 3 triac
R1 2 3 1 k  
V1 2 0 pulse 0 1 10n 10n 100n 1u 2u
V2 1 0 sin 0 1 1meg
Rlamp a 1 1 k  
.end

Звездочка, если она стоит в начале строки, означает комментарий, до конца строки. Многострочных комментариев в SPICE нет. Так как звездочка еще может быть использована в контексте оператора умножения, то для комментариев в конце строк предусмотрены точка с запятой или знак доллара.

Правку начнем с удаления шапок. Обязательно удалим первый .end - он недвусмысленно завершает файл с кодом spice. Оставим только последний. Код из файла triac.net мы превратим в подсхему (subcircuit). Обращение к этой подсхеме уже есть в главной схеме, нам нужно только правильно оформить обращение к ней. Тут есть некоторая аналогия с вызовом функции в языках программирования. Например, мы не можем себе позволить перепутать выводы компонента. Мы должны знать, в каком порядке они идут.

Надо немного понимать, что такое нетлист вообще. Принципиальная схема - это граф. Его вершинами являются либо компоненты, начиная с одиночных выводов и заканчивая микросхемами с сотнями выводов, либо узлы - точки с одинаковым потенциалом. Ребрами графа является множество всех пар отношений "быть подключенными" между узлами. С точки зрения математики, компоненты и узловые точки соединений это все, один хер, вершины, но мы должны делать различия, и разбить все множество вершин на два класса эквивалентностей. Отделить мух от котлет. Поэтому будем называть компоненты (элементы, радиодетали ебена мать) компонентами, а узлы - узлами, и это никогда не будет одним и тем же.

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

Поэтому существует атрибут refdes (reference designator) описывающий "канонический", естественный порядок следования выводов компонента. Кроме того, один и тот же компонент может выпускаться в разных корпусах с разным расположением выводов. Поэтому есть атрибут pinnumber. И наконец, для мнемоники есть атрибут pinname.

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

Давайте посмотрим на атрибуты refdes компонента triac из библиотек gschem. Это нетрудно сделать. Откроем схему ltimer.sch и выделим симистор. Правой кнопкой мыши вызовем контекстное меню. Выберем команду Down Symbol. Мы попадем в редактор символов. Выделим любой пин и посмотрим его свойства:



Поставим в строках refdes галочки visible. Имена показывать не нужно. Это будет выглядеть так:




Теперь можно использовать контекстную команду Up и подняться наверх, в исходную схему. Но можно и просто закрыть окно из менеджера: P,M и кликнуть "закрыть страницу":



При закрытии gschem спросит нас о сохранении изменений. Ответим: нет, Close without saving. Кстати, это и бесполезно, благодаря правам доступа только на чтение. (Если вы конечно работаете не как root, что было бы довольно неразумно.)

Поскольку ошибки с пинами совершаются нередко и ведут к производственному браку, давайте пометим и нашу главную схему. Нам не удалось отредактировать сам элемент (потом я подскажу, как прикрутить пользовательские библиотеки, сейчас не будем отвлекаться), но добавить подписи текстом прямо на схему можно всегда. Для этого есть команда A,T (Add Text). Появится окно с ясной подсказкой. Размер и цвет текстовых элементов легко можно изменять выделением и командой из контекста. Можно сделать любые таблицы и рамки, например, для печати спецификаций и документов в ЕСКД.

В общем, с подписями атрибутов refdes картина будет выглядеть так:



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

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

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

* ltimer.cir
*
* Простая модель симистора
*

*===== модели используемых элементов ==============
* ключ
.model swpwr sw(vt=0.645 vh=0.1 ron=0.5 roff=2meg)

* диоды
.model dac d(is=3e-12 cjo=5pf)
.model dg  d(is=1e-16 cjo=50pf rs=5)
*==================================================

.subckt triac A K G
D2 4 G dg 
R4 ctl 6 2  
C2 0 6 1u  
R3 3 5 1k  
D4 3 5 dac 
S2 A 5 6 0 swpwr 
Vm 3 K
Vg 4 K
Rg 4 G 1k  
D1 G 4 dg 
R1 ctl 2 2  
C1 0 2 1u  
B1 ctl 0 V=I(Vg)*40+abs(I(Vm))>0.015 ? 1 : 0 
R2 3 1 1k  
D3 1 3 dac 
S1 A 1 2 0 swpwr 
.ends

* ============ основная схема =====================

XVS a 0 3 triac
R1 2 3 1k  
V2 1 0 sin 0 311 50
Rlamp a 1 600  

*            v1 v2 td    rt   ft   pw    per
V1 2 0 pulse 0  1  0.021 100n 100n 0.052 0.12

* директивы симулятору
.tran 100u 0.12 ;шаг времени и длительность

* управление работой симулятора
.control
	run
	plot v(a) V(2)*100
.endc
.end

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

Для обращения к подсхеме всегда следует использовать префикс X. Это правило языка SPICE. Поэтому у нас триак обозначен как XVS, а не просто VS, как в схеме. Подсхема обязательно должна заканчиваться строкой .ends - только так симулятор поймет, что подсхема кончилась, даже, если она хранится в отдельном файле.

Сопротивление R1 ограничивает ток в цепи управляющего электрода. Источник V2 представляет обычную розетку. В ней 220 вольт (амплитуда этого напряжения получается умножением на квадратный корень из двух, отсюда и 311). Частота 50 Гц. А первый нолик, после sin, обозначает величину постоянной составляющей напряжения. Сопротивление в нагрузке 600 ом, это соответствует приблизительно лампочке 75 ватт. Ток должен быть 0.35 А (это навскидку).

Источник V1 формирует импульс включения симистора. Его параметры: v1 - нижний уровень, v2 - верхний уровень, td (time delay) - время задержки от начала симуляции, rt (rise time) - время нарастания, ft (fall time) - время спада, pw (pulse width) - ширина импульса, per (period) - период. Время разумеется в секундах, остальное в соответствующих единицах.

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

Еще две директивы. Одна из них, .tran (транзиентный анализ, анализ переходных процессов, анализ во временной области) определяет, что именно нужно проделать симулятору. В таком режиме симулятор работает подобно осциллографу. Временной шаг составляет 100 мкс, а общее время 0.12 секунд - ровно 6 периодов сетевого напряжения.

Директива .control выполняет команды после загрузки данных. Команда run запускет процесс вычислений, а plot - строит графики, в данном случае, напряжения на аноде и напряжения на "генераторе". Теперь все готово к запуску симулятора.

Но, поскольку пост получился не слишком маленький, то остальное будет продолжено в следующем.

Дальше
Tags: geda, моделирование схем
Subscribe

  • Рисование с помощью макросов

    Различного рода документы иногда включают иллюстрации, которые сложно изобразить простыми средствами. Возьмем хотя бы обычную школу. Одна Марьиванна…

  • Xcircuit - 1

    Хочу рассказать о хорошем редакторе приципиальных схем. Как видно из названия, этот редактор сделан для X (только не надо путать это с десяткой), и…

  • Снайперский прицел (+бонус)

    Для поиска в интернете. Дикая вещь!! Пригодится всем, кто ищет информацию. Без всякой рекламной херни и гнилых ссылок. Однако, как говорил один мой…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 1 comment