Пробуем симулятор электронных схем ngSpice
kayo — Ср, 11/03/2015 - 00:03
При разработке электронных устройств практически постоянно возникает необходимость как-то верифицировать идеи перед применением. Если в программинге прототипирование — вещь несложная. То прототипирование в железе отнимает существенно больше времени и сил. Я уже некоторое время изучаю и применяю симуляторы электронных схем, вроде gnucap и ngspice. В этой статье мы будем работать с последним ввиду того, что с первым у меня были некоторые проблемы с работой моделей от вендоров.
Введение
Если вкратце, то всё просто: симулятор ngspice принимает описание схемы и позволяет проводить анализ её работы. Анализ производится путём вычисления напряжений и токов по правилам Густава Кирхгофа.
Нам доступны следующие виды анализа:
- DC-анализ, то есть анализ работы схемы на постоянном токе, при котором не происходит никаких переходных процессов, а значит все индуктивности считаются короткозамкнутыми, а все ёмкости просто исключаются из схемы.
- AC анализ малых сигналов, то есть анализ работы схемы на переменном токе при заданной частоте или наборе частот. Этот тип анализа аналоггичен DC-анализу, кроме того, что у индуктивностей появляется сопротивление, а ёмкости начинают проводить ток.
- Анализ переходных процессов в схеме. Это расширенный DC-анализ для выбранного промежутка времени с указанным шагом.
- Другие типы анализа, как-то: анализ чувствительности, искажений, шумов. Они интересны конкретным специалистам.
Схема задаётся списком цепей, пример которого мы видим ниже:
V1 AC1 GND PULSE(-2.7V 2.7V 0 5uS 5uS 15uS 40uS) R1 OUT GND 10 C1 IN GND 470u C2 OUT GND 100u C3 OUT GND 100n D1 AC1 IN SS26 X1 GND OUT IN LD1117
Каждая строка содержит элемент схемы, первым идёт обозначение элемента. По историческим причинам сопротивления обозначаются как R1, R2, …, Rn, емкости как C1, C2, …, Cn, индуктивности — L1, L2, …, Ln, диоды — D1, D2, …, Dn, транзисторы — Q1, Q2, …, Qn, и так далее. Кроме того, в схему можно включать подсхемы, которые обозначают как X1, X2, …, Xn. На схеме один источник питания (V1), один резистор (R1), три конденсатора (C1-3), один диод (D1) и одна подсхема (X1).
Далее идёт описание подключения выводов элемента, так резистор R1 подключен между землёй (GND) и выходом (OUT), можно догадаться, что это — нагрузка. Число выводов зависит от типа элемента: для источников питания, сопротивлений, ёмкостей, индуктивностей и диодов их два, для транзисторов — три. Подсхемы вообще никак не ограничены в числе выводов.
Мы увидим далее, что применение подсхем намного более широкое, чем может показаться, поскольку многие сложные электронные модули реализуют именно как подсхемы. Многие производители электронных компонентов выкладывают модели своих устройств в формате spice, которые если не в исходном виде то с некоторыми изменениями мы можем использовать.
Конечно, мы не будем вручную писать наши схемы, ибо это чревато ошибками. Многие электронные CAD-ы умеют экспортировать списки цепей из нарисованных в них схем в формат spice. Я использовал редактор схем EEschema из пакета KiCAD. Он позволяет также задать блоки текста, которые будут экспортированы перед и после списка цепей.
Примеры
Дабы развеять туман в голове, давайте уже что-нибудь попробуем симулировать. Для начала что-то простое, я взял выпрямитель и линейный регулятор.
Схема абсолютно тупая, ибо наша цель её проанализировать. Конечно, я был несколько ленив и неаккратен, ибо не использовал общепринятые условные графические обозначения например для источника пульсирующего напряжения. Но это всё на результат не влияет, так что прошу меня извинить.
Здесь я разместил текстовые блоки, которые начинаются с —pspice и +pspice. В этих блоках расположены команды, которые будут вставлены до и после списка цепей соответственно. До списка цепей я добавил команды подключения (.include) файлов описания компонентов LD1117 и ss14. Это что-то вроде библиотек.
А после списка цепей я добавил блок .control, который описывает, что собственно мы хотим добиться от симулятора. Вот что делает каждая строчка:
.control * открываем блок * отключаем разбивку выводимых данных на страницы options nopage * вывод значений напряжения в точках in и out я временно закомментил *print v(in) v(out) > project.sim * симуляция переходных процессов с шагом в 1 микросекунду на интервале до 1 миллисекунды с началом в 0 миллисекунд tran 1uS 1mS 0mS * переключил вывод в png, чтобы потом вставить полученную картинку в этот блог set gnuplot_terminal=png * используем gnuplot для вывод графиков напряжений в точках ac1, in и out gnuplot project v(ac1) v(in) v(out) .endc * закрываем блок
Это в принципе всё, что нам нужно, чтобы начать симуляцию. В EEschema надо при экспорте списка цепей выбрать экспорт в spice:
На выходе у меня получился файл project.cir вот с таким содержимым:
* EESchema Netlist Version 1.1 (Spice format) creation date: Вт 10 мар 2015 22:00:26 * To exclude a component from the Spice Netlist add [Spice_Netlist_Enabled] user FIELD set to: N * To reorder the component spice node sequence add [Spice_Node_Sequence] user FIELD and define sequence: 2,1,0 .include LD1117.prm .include ss14.txt *Sheet Name:/ R1 OUT GND 10 X1 GND OUT IN LD1117_33 V1 AC1 GND PULSE(-2.7V 2.7V 0 5uS 5uS 15uS 40uS) C1 IN GND 470u C2 OUT GND 100u X2 AC1 IN SS14 C3 OUT GND 100n .control options nopage *print v(in) v(out) > project.sim tran 1uS 1mS 0mS set gnuplot_terminal=png gnuplot project v(ac1) v(in) v(out) .endc .end
В качестве источника питания я использовал генератор прямоугольных импульсов. Это примерно соответствует вторичной обмотке трансформаторов импульсных блоков питания. Вот как он определён в ngspice:
PULSE (напряжение нуля, напряжение импульса, начальная задержка, время нарастания, время спада, длительность импульса, период импульсов)
В нагрузку я просто поставил резистор на 10 Ом, что-бы получить примерно 1 Ватт мощности на 3.3 Вольтах (3.3^2/10).
Мы можем получить значения напряжений и токов в точках функциями v(имя цепи) и i(имя цепи) соответственно. Кроме того, чтобы получить разность потенциалов между двумя цепями можно указать два значения в функции, например v(одна цепь, другая цепь). Можно даже производить вычисления.
Теперь осталось запустить симулятор командой: ngspice -b project.cir (просим его выполнить команды в фоновом режиме). Естественно у нас должны быть все подключенные файлы модулей. На просторах сети я нашел диод шоттки SS14 и библиотеку линейных регуляторов LD1117 от серьёзных вендоров, которым можно доверять.
Вот какой график я получил:
Забавно? Я тоже так думаю ^_^
Давайте не отходя от кассы поэкспериментируем, редактируя параметры прямо в полученном project.cir. Мы хотели бы получить на выходе как минимум 3.3V, а из результата симуляции сразу видно, что входного напряжения недостаточно. Зададим амплитуду 5.2V вместо 2.7V и повторим симуляцию:
Теперь совсем другое дело.
А теперь давайте немного изменим схему:
Я заменил диод мостом и убрал входную ёмкость. Также увеличил нагрузку до 2 Ватт. Затем увеличил масштаб времени симуляции, и добавил график напряжения в точке ac0.
Вот что получилось:
А теперь давайте попробуем по-другому. Предположим, что трансформатор выдаёт импульсы амплитудой всё те же 2.5V, то есть на одном выводе относительно другого имеем импльсы +2.5V и -2.5V. Изменим конструкцию выпрямителя так, чтобы получить 5V, использовав два диода и два конденсатора:
Повторим симуляцию, и посмотрим графики:
Как видим, получили именно то, что было нужно. А теперь посмотрим на графики напряжений относительно точки AC0:
Исходники искать в репозитории: bitbucket.org:kayo/voltage_regulator, каждый вариант схемы в отдельной ветке.
На этом пока закончим. В следующий раз симулируем более интересную схему — детектор нуля сетевого напряжения с гальванической развязкой.

Очень интересно, спасибо!
Гость (не проверено) — Сб, 07/07/2018 - 19:56Отправить комментарий