al_fuhrmann (al_fuhrmann) wrote,
al_fuhrmann
al_fuhrmann

Category:

gEDA - как улучшить работу с проектом

Займемся лучшей организацией. Если в теперешнем состоянии понадобится изменить схему, то сделать это будет также сложно, как и в первый раз. В редакторе gschem есть все, чтобы поместить в файл sch все необходимое для последующего преобразования, не только в нетлист, но и файл схемы для передачи ngspice. Кроме того, мы можем написать shell-скрипты, использовать perl, python и тому подобное для обработки данных. Все это поможет автоматизировать рутинные действия до пары нажатий на клавиши. И меняй схему как хочешь.

Во-первых, в нашем распоряжении есть великая вещь: возможность включения файлов. И сделать это можно прямо из редактора схем. Во-вторых, простой скрипт для оболочки сделает сначала файл cir, а затем вызовет для него ngspice. И, таким образом, исправление схемы никоим образом не будет тормозить нашу работу. А при разработке схем, не только исследование уже созданной, но и постоянное внесение изменений в существующую, обычное дело. Технические прибамбасы и лишние манипуляции, будут, конечно, отнимать время и раздражать.

Прежде всего, давайте сделаем библиотеку из нашего файла ltimer.cir. Можно просто получить копию: cat ltimer.cir > library.lib (имена и способ получения копии это целиком на ваше усмотрение). Затем отредактируем этот файл:

* library.lib
*
* Библиотека моделей и подсхем
*

*===== модели используемых элементов ==============
* ключ
.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

Как видите, все очень просто. Мы имели почти готовую библиотеку.

А теперь маленький трюк. Для добавления пути в наш блок переменных окружения я использую простую фишку: PATH=$(pwd):$PATH в самом обычном файле p. И вам не надо добавлять точку со слешем, чтобы запустить команду из текущего каталога. Этот экземпляр блока переменных окружения сохраняется до конца текущего сеанса терминала.



Заодно я делаю все остальное, т.е. создаю файл sim с командами и делаю его исполняемым. Чтобы изменить переменную окружения PATH, мне не надо выписывать всю команду в командную строку, достаточно поставить точку, пробел (обязательно, чтобы bash не подумал, что это скрытый файл .p) и указать имя файла. Текущий каталог будет добавлен к переменным окружения.

Теперь можно открыть ltimer.sch в редакторе gschem. В схему нужно добавить два особых элемента (в фильтре их легче всего найти набрав spice). Эти "кирпичи" нужно инициализировать значениями: SPICE include - file = library.lib и SPICE directive - value = .tran 10u 0.12

Это, как вы понимаете, то, что должно входить в файл схемы. Кроме того, надо переименовать VS в X... элемент, ибо это подсхема. Ну, допустим, X_VS. Параметры источников также должны быть явно указаны в редакторе схем. За исключением источника B1 из подсхемы триака. Он уже в библиотеке. В результате мы получаем следующую картину:



Все готово к запуску, но сначала заглянем в новый список узлов, который сделает gnetlist:

* gnetlist -g spice-sdb -o ltimer.cir 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/   *
*********************************************************
*vvvvvvvv  Included SPICE model from library.lib vvvvvvvv
* library.lib
*
* Библиотека моделей и подсхем
*

*===== модели используемых элементов ==============
* ключ
.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
*^^^^^^^^  End of included SPICE model from library.lib ^^^^^^^^
*
*==============  Begin SPICE netlist of main design ============
.tran 10u 0.12
.INCLUDE library.lib
X_VS a 0 g triac
R1 2 g 1k  
V1 2 0 pulse 0 1 0.021 100n 100n 0.052 0.12
V2 1 0 sin 0 311 50
Rlamp a 1 600  
.end

Похоже, что все будет работать. Правда, тут нет секции .control но из gschem ее вставить не получится. Она должна располагаться в конце файла. Пристроить ее туда можно из отдельного файла, но это потребует некоторой возни с последней строкой .end А можно поступить и гораздо проще:

*
* ltimer.cir - таймер для лампочки
*
.include ltimer.net
.control
	run
	plot . . .
.endc
.end

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

После команды sim у вас должно все получиться. Теперь вы понимаете принцип создания иерархических схем в ngspice. Чтобы исчезли последние вопросы я еще раз покажу на конкретном примере.

Собираем схему:



Здесь надо пояснить лишь несколько моментов (остальное вам уже понятно). C2 - это только вариант символа. Для spice по барабану, полярный конденсатор или нет. Если, конечно, нам не вздумается построить модель для его симуляции. D2 - cтабилитроны надо искать в фильтре библиотеки по ключу zener. F1 - это чисто графический символ. spice его игнорирует. Но он может оказаться полезным для pcb, поэтому, чтобы ngspice не ругался, добавим элементу F1 атрибут graphical = 1. Ключ S1 имеет атрибуты: model-name = swctl и value = sw vt=1 vh=0 ron=1 roff=10meg То есть, его нет ни в какой библиотеке, он целиком находится в схеме.

В библиотеку добавим модель стабилитрона. Это такой же диод, но с параметрами, свойственными стабилитрону. Вот новая версия библиотеки:

* library.lib
*
* Библиотека моделей и подсхем
*

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

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

* стабилитроны
.model zen12 d(is=3e-12 cjo=30pf rs=4 bv=12)
*==================================================

.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
.model swpwr sw(vt=0.645 vh=0.1 ron=0.5 roff=2meg)
.ends

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

Ключ swctl, вернее, его модель, записана сюда на всякий случай, если не получится подцепить модель в качестве параметра. Для этого можно провести отдельный эксперимент.

Остальные файлы, сначала sim:

#!/bin/bash
gnetlist -g spice-sdb -o ltimer.net ltimer.sch
ngspice ltimer.cir

Затем ltimer.cir:

.include ltimer.net

.control
	run
	plot v(test)
	plot vitest#branch
.endc
.end

Вся цепочка должна быть понятна: gschem создает схему в собственном формате, затем она передается из sim в программу gnetlist. gnetlist делает файл ltimer.net и затем ngspice читает файл ltimer.cir из которого ltimer.net виден благодаря директиве .include

Цель нарисованной схемы - получить питание для электроники платы. Земля теперь перенесена на минусовую шину платы. Плюсовая шина называется test и мы хотим посмотреть на ее нагрузочную способность. Для этого мы повесили в нагрузку резистор Rtest в 100 Ом. Этого маловато, но с чего-то надо начать. Обратите внимание: время симуляции теперь 7 секунд, а отсчеты мы делаем каждые 10 миллисекунд. Это оптимально на данный момент. Посмотрим на напряжение и ток на шине +12 В:



Чего-то подобного и следовало ожидать. Увеличим сопротивление rtest пропорционально, т.е. раз в 5. (Используем alter и перезапустим ngspice.) Новые результаты выглядят получше.



Пусть теперь сопротивление нагрузки 1k. Снова смотрим:



Неудачный скриншот, ток оказался закрыт другим окном, но он меньше, чем был до этого. Фактически, схема таймера будет потреблять меньше, чем 10 мА, но нам сейчас важно вообще определить нагрузочную способность источника и его коэффициент пульсаций. Допустим, нас устроил вариант с 500 омами минимального сопротивления нагрузки. Смотрим пульсации:



Чтобы увидеть размах "бороды" используем курсорное измерение, проводим мышкой по бороде и получаем 0.64 В. Мы можем в ngspice легко выбраться в оболочку и запустить калькулятор, например bc. Считаем, получаем результат: 6.25% (хотя это и так ясно, но надо показать, как это делается, что все у нас рядом). Из калькулятора в оболочку выходим с помощью клавиш Ctrl-D и затем из оболочки в ngspice еще раз теми же клавишами (управляющий символ EOF, конец файла). Еще раз отдельно:



Поскольку ток через стабилитрон протекает тот же самый, что и через Rtest, то никаких лишних амперметров нам не нужно. Следует подбирать стабилитрон с аналогичными данными, лучше с некоторым запасом. Но уточнения еще впереди, а пока проведем тест, сделав включение "лампочки". Посмотрим, как это повлияет на цепь 12 В. Очевидно, что надо увеличить параметр v2 в pulse источника Vctl до той величины, которая включит S1. Заодно не забудем изменить в схеме сопротивление Rtest на 500 омное: будем считать, что это нас пока устраивает. Для "подключения щупов" к лампочке - резистору Rlamp просто добавим к его концам имена узлов a и b.

Исправим, кстати, и ошибку в уравнении для B1 в подсхеме симистора. Там установлено два диода для работы управляющего электрода как от положительных, так и отрицательных импульсов. Тем не менее, симистор будет работать только при положительных управляющих импульсах. Исправим ошибку:

B1 ctl 0 V=abs(I(Vg))*40+abs(I(Vm))>0.015 ? 1 : 0

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

Новая версия ltimer.cir:

.include ltimer.net

.control
	run
	let igate = vi#branch
	let ilamp = vpwr#branch
	let itest = vitest#branch
	plot v(test) itest*1000
	plot igate
	plot ilamp
.endc
.end

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



Здесь мы можем сразу увидеть потребляемый ток в цепи питания управления, он показан синим, напряжение на нем, красного цвета, ток в цепи управляющего электрода, и ток в цепи нагрузки. Когда нагрузка включается, напряжение в цепи "12 В" немного падает. Главным недостатком схемы является заметный ток, пожираемый условной схемой управления, ведь он жрется круглосуточно. Давайте приблизительно прикинем мощность. Как это сделать, мы уже знаем: надо измерить размах тока, когда нагрузка отключена. А затем:



Итого почти 8 кВт*ч в месяц. Сколько это по вашему тарифу?

На самом деле, из-за неполных данных мы не можем сейчас сказать сколько съест устройство. Часть тока - реактивная, домашний счетчик за нее не платит. Активная часть тока греет стабилитрон, D3 и резистор R4. Если схема таймера будет работать при небольшом токе, резистор R4 можно увеличить, или уменьшить емкость конденсатора C3. Тут есть множество соображений по оптимизации. Например, может возникнуть дизайнерская идея подсвечивать матовую полупрозрачную кнопку выключателя красными светодиодами, чтобы ее было видно в темноте. Тогда придется потратить экономию на красоту.

В общем, пока хватит. А в следующий раз займемся схемой и моделью самого таймера 555.

Дальше
Tags: #branch, geda, gschem
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 

  • 0 comments