gEDA - принципиальная схема устройства

Mar 26, 2017 09:06


В прошлом посте таймер оказался немного подгоревшим, подавать его к столу рановато. На моей кухне случился небольшой заеб, то есть, слишком много тем для одного материала. Я не стал его проверять как следует. Поэтому здесь мы начнем с исправления косяков, затем получим окончательную схему всего устройства. Будет кое-что в смысле улучшения работы с проектом. И в конце поговорим о, так сказать, стратегиях симуляций, чем немного закроем тему.
Начнем с общего обзора. Вот как выглядит каталог проекта:



В подкаталогах находятся библиотеки: analog и digsim - символы элементов, sktlib - подсхемы и модели. Таким образом, имея достаточный набор пользовательских данных, можно работать на любом компьютере, где есть возможность использовать набор приложений gEDA. Не знаю, получится ли это на системе Windows если там сначала установить cygwin, но попробовать можно. Вероятно, кому-то это покажется удобным. Мне гораздо удобнее держать просто раздел на диске, где установлена Windows, для игрушек и некоторых случаев, когда нужна именно эта ось. Когда я загружаю Windows, то мне кажется, что я увижу слой пыли с палец толщиной, так редко я там бываю.

Файл gafrc - это конфигурация для всех утилит geda, если он находится в каком-либо каталоге, то, как говорил Лева Задов: "кому Лева друг - у того девятка на руках". Вот содержимое это файла:

( source-library-search "." )
( component-library "digsym" "My Digsym" )
( component-library "analog" "My Analog" )
В первой строке - указание искать библиотеки во всех подкаталогах текущего каталога. Вторые две строки - это явное указание редактору схем gschem, чтобы тот поместил указанные библиотеки в свой список для команды выбора компонентов. Конечно, gschem должен быть запущен из текущего каталога.

Файл sim - это исполняемый скрипт bash. Мы уже знакомы с ним, но это его новая версия, заслуживающая пары слов для обсуждения:

#!/bin/bash

# Скрипт для симуляции иерархических проектов
# сделанных в редакторе gschem.
# Использование:

# $ sim <файл1> [ <файл2> ... ]

# Имя выходного файла: <файл1>.cir

m=${1%.*}

for i in $*
do
list=$list" "${1%.*}
shift
done

for i in $list
do
cat $i.sch | awk '
/^source/{ print "comment=stub"; next }
{ print $0 }' > $i.t~
done
gnetlist -g spice-sdb -o $m.cir $(ls *.t~)
rm *.t~

# Пишем свою шапку:

cat << END > t
* $1.cir
*
*
*
END

# Расставим квадратные скобки в файле .cir

cat $m.cir | awk '
/^A.*adc *$/||/^A.*dac *$/{
print $1" ["$2"] ["$3"] "$4; next }
/^A.*nand *$/||/^A.*nor *$/{ s = $1" ["
for( i=2; i> t
mv t $m.cir
Новым здесь является то, что мы выделяем главное имя - имя выходного файла, и составляем список всех файлов из командной строи, убрав расширение. Так что, если вы укажете: sim file.sch, это не будет ошибкой. С другой стороны, конечно, тут ожидаются файлы .sch, а не какие-нибудь другие. Смысл и основная функция скрипта сохраняется - быть оберткой для gnetlist, придающей утилите недостающую функциональность. sim используется для расстановки квадратных скобок для обозначения массивов выводов (векторов) в цифровых элементах.

Совсем новой штукой у нас является известная каждому, системному и не очень, программисту утилита make. Она с большущим успехом может применяться не только для компиляции программ на С/C++ или ассемблере, для чего в основном и юзается, но с ее помощью можно делать очень многие непростые вещи, обходясь простым текстовым редактором. Для этого достаточно иметь в рабочем каталоге текстовый файл, называющийся просто makefile. "Просто Мюллер. Категорично и со вкусом."



Принцип работы make очень прост. На примере данного файла: make понимает, что test.cir - это главная цель, то, что надо сделать. Главная цель зависит от следующих файлов: ne555.cir comp.cir gain.cir и еще двух схем в рабочем каталоге. make читает makefile дальше и видит новые цели, а это одна или несколько зависимостей главной цели. У каждой из целей второго уровня есть своя (свои) зависимости.

Например, пусть дата/время последнего изменения файла ne555.sch 12:30, а файл главной цели был изменен в 12:29 или вообще, на доли секунды раньше 12:30. Что это значит? Логика очевидная - главная цель уже не соответствует реальному положению вещей, она изменилась, и ее надо переделать. Но сначала переделываются цели второго уровня. Если это ne555.sch, то сначала выполняются команды под строкой 9, затем выполняются команды первого уровня для исправленных зависимостей. В конкретном случае последовательность номеров строк команд следующая: 10, 11, 12, 7, 8.

Кроме целей-файлов, могут быть цели-действия. Например, если мы запустим make (это делается просто: make) но файлы не изменялись, то make так и напишет: 'test.cir' is up to date. Для этого и предусмотрена цель-действие go (это имя можете выбрать сами). Если make сообщает, что цель актуальна, то пишем: make go и выполняются команды в строке 23. Если мы захотим почистить проект от временных ненужных файлов, то даем команду: make cleanup и выполняется строка 21, но остальное выполняться не будет.

В таймере была ошибка с логикой. Вместо элементов И-НЕ должны были использоваться ИЛИ-НЕ. Вот схемы рабочей версии:

Файл power.sch - источники питания, тестовых сигналов, всяких кирпичей с директивами и опциями:



Здесь есть источник питания таймера и источник, работающий подобно кнопке, его сигнал посылается по узлу с именем in. UIC - это User Initial Conditions, иы используем их для того, чтобы в начале симуляции конденсатор времязадающей цепи был заряжен до напряжения источника питания, директива: .ic v(tr)=5 В этот лист схемы также включен файл ne555.cir, мы рассмотрим его чуть позже. Оба файла открыты в gschem и переключаться между ними можно клавишами PgUp и PgDn или командами меню. Файл ctrl.txt содержит "сценарий" того, что должен делать ngspice после загрузки файла.

*
* Команды для симуляции
*
.control
run
plot v(tr) v(out) v(in)
.endc
В файле test.sch находится схема одновибратора, собранного на 555. Здесь все более-менее ясно:



Сделав правый клик по "корпусу" таймера, и выбирая нужную контекстную команду, можно попасть в его внутреннее устройство, где были исправлены ошибки:



Из этого файла включается все остальное, что необходимо для его работы. Стоит заметить, что библиотечные файлы lib приходится включать с указанием относительного пути к ним. Используемые подсхемы открываются прямо из основного каталога. Сейчас их нет, но их создаст gnetlist, вызванный из файла makefile. Достаточно просто открыть терминал в рабочем каталоге и сразу можно писать в командной строке make. Результат получается немедленно:



На графике видно, что таймер сработал почти точно в десятиминутном интервале. Номинал 100k для резистора, заряжающего конденсатор, является достаточно большим. Больше брать нельзя, так как утечки по плате при повышенной влажности будут влиять на время срабатывания, и вообще, сделают работу таймера неустойчивой. Емкость в 5000 мФ можно набрать, не покупая дорогого ионистора. Конечно, желательно брать качественные конденсаторы, а не набранные с радиопомойки. Но выбор комплектующих еще впереди.

Было бы интересно посмотреть на время, необходимое для разряда конденсатора и "взвода" таймера:



Отчего оно зависит? От сопротивления в цепи открытого транзистора. Его модель npn1 из файла analog.lib:

*
* ==== модели диодов и транзисторов ====
*

* модели транзисторов
.model npn1 npn(is=1p bf=100 rc=10)

* модели диодов
.model diode d(is=3p cjo=5p)
является очень упрощенной. Сопротивление в цепи коллектора составляет 10 Ом (сопротивление открытого транзистора). У реальных транзисторов оно может быть меньше, к тому же поддается измерению в самой микросхеме, если открыть транзистор разрядной цепи нужной комбинацией входных сигналов. Как бы там ни было, время разряда конденсаторов было рассчитано ка 0.2 сек, а нажатие на кнопку продолжается полсекунды. Вот видите, какие "мелочи" можно обнаружить в симуляторе еще до сборки самого первого образца схемы?

Изменяя схему, можно легко получать ответы на любые вопросы. Например, чтобы измерить ток разряда конденсатора, достаточно только изменить схему, возможно, и файл управления симулятором, сохранить файл test.sch и выполнить make. Все остальное сделается само собой:



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

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

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

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

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

Главный принцип при симуляции схем: получение наиболее точных данных при минимальных затратах времени и памяти. Это не всегда удается, но если специально не заботиться об этом, то неудаваться будет всегда.

Теперь к принципиальной схеме:



После всего сказанного, здесь практически нечего объяснять. Резистор R1 немного ограничивает ток, а кнопка S1 запускает таймер.

Эта схема может быть распечатана, но не только. Ее можно загрузить в редактор печатных плат pcb, чтобы без ошибок развести монтажные дорожки. Но это потребует кое-какой дополнительной информации и подготовки. Об этом в следующий раз. Мы вплотную подошли к теме печатных плат.


Дальше

geda, модель 555, использование makefile

Previous post Next post
Up