Embedded HandbookПриложения
Все разделы › XVI. Печатная плата
STM32F103 · уровень средний · 12 мин чтения
Открыть в интерактивном справочнике

132д. DipTrace: схема и плата вместе — иерархия, SPICE, спецификация, 3D

Схема и плата живут в двух программах, и главное, что между ними происходит, — синхронизация: правку схемы надо перенести на плату, а правку на плате — обратно. Этот раздел о связке «схема — плата» в DipTrace: обновление платы и обратная аннотация, иерархическая схема и копирование разводки между одинаковыми блоками, проверка электрических правил, встроенный SPICE-симулятор, правила в отдельном файле, обмен списками соединений, спецификация и 3D-модель платы.

Встроенный симулятор проверен по-настоящему: библиотеку ngspice из комплекта DipTrace запустили из Python без самой DipTrace и прогнали RC-цепь. Меню сверены с руководством к DipTrace 5.3 и строками интерфейса Schematic.exe и Pcb.exe. Сверяет _verify/dip132e_check.py.

Как это называется в документации

Оригинал Перевод
renew design from schematic обновить плату по схеме
hierarchy block, hierarchy connector иерархический блок и его вывод
global net глобальная цепь: общая для всех уровней иерархии
electrical rule check (ERC) проверка электрических правил схемы
SPICE model SPICE-модель: описание детали для симулятора
assembly variant вариант сборки
interactive BOM интерактивная спецификация: таблица, связанная с платой

132д.1 Схема → плата и обратно

Обновить плату по схеме — File / Renew Design from Schematic в PCB Layout. Три режима:

Режим Как находит пары «деталь схемы — корпус на плате» Условие
By Components по скрытым идентификаторам схема нарисована в DipTrace; обозначения могут различаться
By RefDes по позиционным обозначениям обозначения на плате и в схеме совпадают
Related Schematic как By Components, но из связанного файла схемы какой файл связан — видно в File / Layout Information

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

Обратная аннотация — File / Back Annotate в схеме: выбрать файл платы, и в схему перейдут переименования деталей, имена и классы цепей. Пример руководства: на плате PCB_2.dip конденсаторы C8 и C10 переименовали в C28 и C30 — после обратной аннотации так же они называются и в Schematic_2.dch. Но новые цепи и детали обратная аннотация не добавит — поэтому она для мелких правок, а не для работы «от платы».

Синхронизация: правки идут из схемы на плату через Renew Design from Schematic, обратно Back Annotate переносит только переименования вроде C8 в C28 и классы цепей — новые детали и цепи добавляют в схеме


132д.2 Иерархическая схема

Иерархия — способ нарисовать повторяющийся узел один раз и вставить его в схему несколько раз: канал усилителя, ячейку памяти, силовой ключ.

  1. Edit / Add Sheet — новый лист; Edit / Sheet Type / Hierarchy Block — сделать его блоком.
  2. На листе блока — Objects / Hierarchy / Place Connector: выводы блока. Их расположение и поворот — это расположение выводов блока на главном листе. На обычный лист такие выводы не ставятся.
  3. Objects / Hierarchy / Place Block — вставить блок; блоки вставляются и друг в друга, уровней сколько угодно.

Петли запрещены. Вставить блок в самого себя или замкнуть цепочку блоков DipTrace позволит, но это ошибка: её находит Verification / Check Hierarchy, а плата предупреждает при открытии такой схемы.

Глобальные цепи. Выводы на разных уровнях одной цепью не соединить — только глобальной цепью, которая существует на всех уровнях сразу. Одинаковые порты цепи (например, GND) где угодно в схеме автоматически сливаются в одну цепь, в иерархии — глобальную. Для обычной цепи — свойства → Global Net for Hierarchy и Connect Nets by Name.

На плате. Детали блока получают обозначение из схемы плюс номер блока, а в свойствах — путь по иерархии. Route / Hierarchy показывает все вставленные экземпляры блоков. В примере руководства лист 3 вставлен дважды в каждый из двух блоков листа 2 и ещё раз прямо в главную схему: 2 × 2 + 1 = 5 экземпляров. Дальше:

Иерархия: лист 3 вставлен 2 × 2 + 1 = 5 раз, на плате один экземпляр разводят вручную, а Copy Placement and Routing повторяет его на остальных четырёх


132д.3 Проверка электрических правил

Verification / Electrical Rule Setup — таблица «тип вывода × тип вывода»: щелчком в клетке выбирают, что такое соединение — норма, предупреждение или ошибка. Что проверять:

Галочка Что ищет
Pin Type запрещённые сочетания типов выводов из таблицы
Not Connected Pins неподключённые выводы
Pin Superimposing выводы, лежащие друг на друге
Only One Pin in Net, Nets With Single Pin цепи из одного вывода — бессмысленные
Short Circuit соединение цепей питания и земли (их указывают ниже)

Запуск — Verification / Electrical Rule Check (ERC). На Schematic_2.dch из примеров руководство получает одно предупреждение о соединении двунаправленного вывода с выходом и много неподключённых выводов.

Вывод, который нарочно оставлен свободным, помечают: правый щелчок → Not Connected. Снимать галочку Not Connected Pins целиком хуже — тогда программа перестанет замечать и забытые выводы.


132д.4 SPICE: встроенный ngspice

В схеме — Tools / SPICE Simulator. У каждой детали должна быть SPICE-модель: правый щелчок → SPICE Model. У конденсатора достаточно типа Capacitor и ёмкости; у транзистора есть вкладка Model — текст модели или файл от производителя (Load). Get Spice Model from Library берёт настройки из другой библиотеки, Apply to Other Parts раздаёт их одинаковым деталям.

Пример руководства — мультивибратор Astable_Flip_Flop_Spice.dch: у батареи нет модели, ей задают источник PULSE() с V2 = 5 В, PW = 20 с, PER = 30 с — 20 секунд напряжение есть, 10 секунд нет. Моделирование — вкладка Transient, результат — токи через два светодиода, которые загораются по очереди. Для цифровых схем есть вкладка Digital (пример RS-trigger.dch на моделях Digital:Nand), шины можно показывать шестнадцатеричным числом.

Список соединений для внешнего симулятора — File / Export / Spice Netlist с командой вроде .TRAN 0s 30s 0.1s.

Что внутри. В папке DipTrace лежит ngspice64/ngspice-41_64.dll — обычная разделяемая библиотека ngspice 41 со стандартным программным интерфейсом. Её можно вызвать и без DipTrace (_verify/dip132e/dtspice.py):

os.environ["SPICE_SCRIPTS"] = os.path.dirname(DLL)
ng = C.CDLL(DLL)
ng.ngGet_Vec_Info.restype = C.POINTER(VecInfo)
ng.ngSpice_Init(PRINT, STAT, EXIT, None, None, None, None)


def run(lines):
    arr = (C.c_char_p * (len(lines) + 1))(*[l.encode() for l in lines], None)
    ng.ngSpice_Circ(arr)
    ng.ngSpice_Command(b"run")

RC-цепь 10 кОм · 100 нФ, τ = 1 мс:

Замер Симулятор DipTrace Теория
напряжение через τ после ступеньки 5 В 3,1607 В 5 · (1 − 1/e) = 3,1606 В
частота среза −3 дБ 159,2 Гц 1 / (2π · 1 мс) = 159,2 Гц

Переходный процесс и АЧХ RC-цепи 10 кОм · 100 нФ, посчитанные ngspice из комплекта DipTrace

Библиотека отвечает строкой «ngspice-41 shared library». То есть SPICE внутри DipTrace — тот же ngspice, что и в разделах о моделировании аналоговых схем (там — версия 39 в контейнере); модели и приёмы оттуда работают и здесь.


132д.5 Правила в файле и обмен списками соединений

Правила платы — слои, классы цепей, стили переходов, правила проверки — не обязательно настраивать заново:

Удобно держать .rul под каждый завод: его минимальные зазоры, стили переходов и стек слоёв.

Список соединений (netlist). Экспорт из схемы — File / Export / Netlist, импорт в плату — File / Import / Netlist; форматы Accel, Allegro, Mentor, OrCAD, PADS, P-CAD, Protel и Tango. При импорте у каждой детали должен найтись корпус: Assign All Patterns by Names подбирает по имени, остальные — вручную (Attach to Component); звёздочка у имени корпуса — «назначено вручную». Стандартные библиотеки лежат в Program Files\DipTrace\Lib, свои — в Документы/DipTrace/My Libraries.


132д.6 Спецификация

File / Export / Bill of Materials — в схеме и на плате; на плате возможностей больше.

Четыре способа выдать результат:

Способ Что получится
Place Table таблица на плате (слой Top Assembly), обновляется сама при правке платы
интерактивная спецификация окно-таблица: выбранная строка подсвечивает детали на плате
Export to File CSV или .bom с выбором разделителя и кавычек
Export HTML страница для браузера: спецификация рядом с платой, отметки «установлено»

В HTML-странице кнопки меняют группировку (по имени; имени и номиналу; имени и корпусу; всем трём), показывают верх, низ или обе стороны платы.


132д.7 3D-модель платы

Кнопка 3D в PCB Layout — окно Attached 3D Models: DipTrace проверяет, у всех ли деталей есть модели, и пытается подобрать недостающие. Детали без модели в 3D видны только как посадочные места. Стандартные 3D-библиотеки в установку не входят — их скачивают отдельно; по умолчанию они лежат в папке models3d внутри DipTrace.

Выгрузка — Export STEP или Export VRML (VRML 2.0). Для механического САПР руководство рекомендует STEP одним телом (Solid body). Отверстия в модели сильно замедляют выгрузку. Общие настройки маски для 3D-вида задаются в окне выгрузки Gerber.

Подбор моделей — Tools / 3D Preview / Patterns and Models Search: строгость сопоставления и папки поиска. А лучший момент подключить модель — когда делается корпус (раздел 132а).


132д.8 Грабли

Плату поправили, схему — нет, а потом обновили плату по схеме. Правка пропала. Любые изменения — сначала в схеме; на плате — только то, что перенесёт обратная аннотация (переименования, имена и классы цепей).

Обратная аннотация «не перенесла» новую деталь. Не умеет: новые цепи и детали только из схемы.

Обновление By RefDes перепутало детали. Обозначения в схеме и на плате разошлись. Для схем, нарисованных в DipTrace, — режим By Components.

Блок вставлен сам в себя. DipTrace это позволяет, но это ошибка — Verification / Check Hierarchy.

GND на разных листах — разные цепи. Соединяют порты цепи или глобальная цепь; провод «через уровень» не протянуть.

Скопированная разводка блока без внешних трасс. Так и задумано: трассы за пределы блока не копируются.

ERC засыпал «неподключёнными выводами». Нарочно свободные выводы пометить Not Connected, а не выключать проверку.

Симуляция не запускается. У какой-то детали нет SPICE-модели — как у батареи в примере руководства.

3D-вид пустой. Не установлены библиотеки 3D-моделей — их скачивают отдельно.


132д.9 Итоги

Полные исходники

dtspice.py — прогон RC-цепи через ngspice, встроенный в DipTrace.

# -*- coding: utf-8 -*-
"""Прогон схемы через ngspice, встроенный в DipTrace (ngspice64/ngspice-41_64.dll), без DipTrace.

    python dtspice.py
RC-цепь 10 кОм · 100 нФ: переходный процесс от ступеньки 5 В и частотная характеристика."""
import ctypes as C
import math
import os

DLL = r"C:\Program Files\DipTrace\ngspice64\ngspice-41_64.dll"

class VecInfo(C.Structure):
    _fields_ = [("name", C.c_char_p), ("type", C.c_int), ("flags", C.c_short),
                ("real", C.POINTER(C.c_double)), ("comp", C.c_void_p), ("length", C.c_int)]

OUT = []
PRINT = C.CFUNCTYPE(C.c_int, C.c_char_p, C.c_int, C.c_void_p)(lambda s, i, u: OUT.append(s.decode(errors="replace")) or 0)
STAT = C.CFUNCTYPE(C.c_int, C.c_char_p, C.c_int, C.c_void_p)(lambda s, i, u: 0)
EXIT = C.CFUNCTYPE(C.c_int, C.c_int, C.c_bool, C.c_bool, C.c_int, C.c_void_p)(lambda *a: 0)

os.environ["SPICE_SCRIPTS"] = os.path.dirname(DLL)
ng = C.CDLL(DLL)
ng.ngGet_Vec_Info.restype = C.POINTER(VecInfo)
ng.ngSpice_Init(PRINT, STAT, EXIT, None, None, None, None)


def run(lines):
    arr = (C.c_char_p * (len(lines) + 1))(*[l.encode() for l in lines], None)
    ng.ngSpice_Circ(arr)
    ng.ngSpice_Command(b"run")


def vec(name):
    v = ng.ngGet_Vec_Info(name.encode()).contents
    if v.real:
        return [v.real[i] for i in range(v.length)]
    z = C.cast(v.comp, C.POINTER(C.c_double))       # комплексный вектор: пары (Re, Im)
    return [complex(z[2 * i], z[2 * i + 1]) for i in range(v.length)]


R, Cf = 10e3, 100e-9
TAU = R * Cf                                      # 1 мс
run(["* rc step", "V1 in 0 PULSE(0 5 0 1n 1n 1 2)", "R1 in out 10k", "C1 out 0 100n",
     ".tran 1u 5m", ".end"])
t, v = vec("time"), vec("out")
at = lambda T: min(range(len(t)), key=lambda i: abs(t[i] - T))
v_tau = v[at(TAU)]

run(["* rc ac", "V1 in 0 AC 1", "R1 in out 10k", "C1 out 0 100n", ".ac dec 200 10 100k", ".end"])
f = [x.real for x in vec("frequency")]
mag = [abs(x) for x in vec("out")]
k = next(i for i in range(len(mag)) if mag[i] < 1 / math.sqrt(2))   # первая точка ниже −3 дБ
u = (mag[k - 1] - 1 / math.sqrt(2)) / (mag[k - 1] - mag[k])          # между k−1 и k — по логарифму частоты
f3 = math.exp(math.log(f[k - 1]) + u * (math.log(f[k]) - math.log(f[k - 1])))

ver = next((l for l in OUT if "ngspice-" in l.lower()), "")
print("версия:", ver.strip())
print("tau = %.3f мс; v(tau) = %.4f В (теория %.4f)" % (TAU * 1e3, v_tau, 5 * (1 - math.exp(-1))))
print("f_-3dB = %.1f Гц (теория %.1f)" % (f3, 1 / (2 * math.pi * TAU)))

# журналы для рисунка 132д.4 — только если задана папка DT_OUT
out_dir = os.environ.get("DT_OUT")
if out_dir:
    with open(os.path.join(out_dir, "rc_tran.csv"), "w", encoding="utf-8", newline="\n") as fo:
        for i in range(0, len(t), max(1, len(t) // 250)):
            fo.write("%.6e,%.5f\n" % (t[i], v[i]))
    with open(os.path.join(out_dir, "rc_ac.csv"), "w", encoding="utf-8", newline="\n") as fo:
        for i in range(0, len(f), 4):
            fo.write("%.4e,%.4f\n" % (f[i], 20 * math.log10(mag[i])))

Дальше: раздел 133 «Altium Designer» — проект, правила и выпуск файлов.

Открыть в интерактивном справочнике