Altium Designer: что делать если проект стал сложным?

Приветствую! Думаю, любой инженер или просто радиолюбитель/DIYщик/мейкер, занимающийся разработкой электроники, старается развивать свои навыки, которые растут вместе со сложностью выполняемых проектов. В какой-то момент человек достигает уровня, когда ему кажется, что проекты стали очень сложными, займут много времени на разработку и надо что-то с этим делать — нужно оптимизировать свою работу. Сегодня я расскажу как в Altium Designer 18 (далее AD или AD18) повысить производительность своего интеллектуального труда и сэкономить время, нервы и деньги.

guzto50uwjuf0q39ju0n_fvxzg4.jpeg

Введение


Теперь немного информации для тех, кто не знает что такое Altium Designer. Это один из трех популярных профессиональных САПР, которые позволяют разрабатывать электронику практически любой сложности. Два оставшихся пакета — это Mentor Expedition (и PADS наверное) и Allegro Cadence. У каждого из этих 3-х пакетов есть свои плюсы и минусы, а так же условная специализация. Сегодня сравнений не будет, поэтому я лишь скажу почему выбрал Altium для себя:

  • Отличный дизайн и продуманный интерфейс данной программы просто вне конкуренции. Достаточно посмотреть на конкурентов и все становится ясно. Да, дизайн и удобство это важно, когда ты проводишь за работой по несколько часов ежедневно. Так же это облегчает процесс обучения новичков, ведь учиться в понятном и логичном САПРе намного проще;
  • Возможность напрямую работать с таким механическим «титаном» как SolidWorks. Мы можем просто открыть плату из AD в солиде и добавить ее как часть сборке без потери качества. Прощай конвертация через STEP. Для меня, да и наверняка для вас, это важно, т.к. электронное устройство — это не просто плата с компонентами, это почти всегда еще и корпус. Данная возможность позволяет легко сделать сборочную модель всего устройства и не допустить ошибок при проектирование и производстве пресс-форм по 3–5 тыс.$ каждая;
  • Наличие достаточно большого количества информации на русском языке, что обеспечивает достаточно низкий порог вхождения. Это основная причина, почему в СНГ главенствует именно Altium, а не что-то другое. Попробуйте найти что-то на русском по Mentor или Cadence, сразу расхотите учиться работать в них;
  • В СНГ и Азии большинство компаний работают в Altium, да и в Штатах у них большая доля рынка. В Европе очень любят SolidWorks PCB, который является как раз таки встроенным AD. Что это дает? Вы легко сможете найти работу, если надумаете работать в сфере разработки электроники.


Да да, я не рассказал о всяких возможностях симуляции, инструментах и прочем, но это и не нужно. Все 3 описанные выше САПР с технической стороны умеют примерно одно и тоже, просто с разной степенью удобства и костыльности.

Я хочу научиться работать в Altium, но он меня пугает


Когда-то, году так в 2011–2012, мне довелось впервые поработать в AD, он мне показался крутым, но страшным, т.к. в тот момент английский для меня был преградой и вообще было не понятно как в нем работать. Преодолеть свой страх перед огромным количеством инструментов и функционала мне помогли видео-ролики от тов. Сабунина (спасибо ему), которые есть на youtube на русском языке и описывают базовые простые вещи, позволившие сделать первые шаги в освоение. За прошедшие 6 лет информации по AD на русском стало еще больше, поэтому порог вхождения стал еще ниже, так что не бойтесь и учитесь.

Чтобы вам было легче осваивать Altium Designer предлагаю парочку «пряников» от себя:

  • Цикл обучающих видео-уроков — тут. Ролики имеют большую длительность, но содержат в себе исчерпывающую информацию по базовым функция (так говорят по крайней мере) и позволят любому школьнику без проблем спроектировать свое первое устройство;
  • Библиотеки для Altium Designer — тут. Тут вы найдете все пассивные компоненты (резисторы, конденсаторы и прочее), а так же большое количество популярных транзисторов, диодов и микросхем, включая МК и FPGA. Создание библиотек на старте занимает очень много времени, поэтому надеюсь, что сэкономлю вам не мало времени.


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

Когда проект становится сложным?


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

Из выше написанного можно сделать следующий вывод:

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


До какого-то момента вы можете конечно забить на все и «рисовать» на схеме что угодно и как угодно, например, как тут:
vdw2dq_hwfhik-wmtoqughhf3_4.png

Все сливается, схема выполнена неаккуратно и в конечном итоге это приведет к тому, что где-то криво или не туда провели дорожку, в этом хаосе сразу не заметили и в итоге режете проводники на платах и подпаиваете сопли.

Давайте посмотрим еще на один шедевр — схема arduino, выполненная в AD:
nmsyzah9v2a4utjzaknyirhrxbg.png

Как вам? Мне вот больно… Смотрю я на R2 и R3, вроде понятно что это подтяжки для I2C, но где этот I2C и около какого разъема они должны быть для меня загадка и тут приходится уже искать долго и нудно, при чем это схема с малым количеством компонентов и простая, а уже хаос.

Теперь как альтернатива — пример из своих произведений (кликабельно):
bjqa8npbvzuprpktybwldilk_zs.png

Смотрите на схему и я думаю вам сразу понятно как минимум где вход, а где выход — «стрелки» вам на это намекают, да и мы не арабы, читаем (в том числе и схемы) слева направо. Функция у модуля одна — трехфазный синфазный фильтр и ничего лишнего. Схема сделана аккуратно и занимаете 1 лист в документации. 1 лист — 1 функция.

На самом деле то о чем я написал выше — мелочи, важные и облегчающие жизнь, но все таки мелочи. Хотя я надеюсь общую идеологию вы уловили, давайте теперь подведем итог как же «надо» делать:

  • Принцип инкапсуляции применителен и в схемотехнике: каждый модуль выполняет единственную простую задачу. Модуль обычно это один лист в документации, например, А3 какой-нибудь;
  • Принципиальная схема должна выполняться в одном стиле и очень аккуратно. Аккуратность при работе в будущем окупится вам сполна. Да и когда вы на собеседовании покажите понятную, аккуратно выполненную схему о вас сразу же сложится хорошее впечатление. Рукожопов видят сразу и обычно не любят;
  • Не используйте листы больше А2, даже если у вас пару тысяч компонентов. Если хочется влепить А1, то что-то вы делаете не так. Вероятно вам на схеме нужно выделить какие-то модули и перенести на отдельный лист.


Критикуешь? Предлагай!


Теперь раскритиковав других необходимо предложить альтернативу «как надо делать». Стоит понимать, что описанное в статье лишь субъективное мнение автора, основанное на опыте работы и собственном взгляде на мир.

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

Создаем проект в Altium Designer. В нем для примера я изображу 6-ти фазный buck преобразователь DC/DC. У меня будет 6 силовых каналов и 1 МК для управления всеми фазами. Каждый силовой канал будет выглядеть следующим образом (кликабельно):

jxv09bgcfh7u5xrlw3ieaw1rumw.png

Сам канал силовой я изначально начертил правильно. Если посмотрите внимательно, то у меня на схеме есть входы сигнало — 2 ШИМа слева + VCCIN с GND, есть выход — VCC5V и GND. Сам модуль выполняет одну задачу — преобразует VCCIN в 5В. Дальше делаем плохо…

Тут мы натыкаемся на первое ограничение — один канал занимает практически весь лист А3, у нас их 6, следовательно если я увеличу лист до А2 все равно не уместится. Можно увеличить лист до А1 — отлично, пока что мы рукожопы неопытные разработчики и идем по такому пути и наблюдаем следующую картину (кликабельно):

ekwh6nzv6qis3ns0ee_gqw5mhfm.jpeg

Вроде как пока понятно — есть 6 каких то кусков схемы, есть МК внизу. Вот только это 30% схемы, что еще нужно? Обвязка МК + обратные связи? Конечно! Устройство должно общаться с внешним миром? Конечно, добавим RS485. Аааа, еще нужно питание для драйверов, то есть из VCCIN необходимо получить +12В и для этого добавим DC/DC! Еще же МК… ему надо еще 1 DC/DC и теперь добавив все это — смотрим (кликабельно):

vedt5s9enrmszzqgnkcvx2hpuhm.jpeg

Понятно что тут? А если бы я не сказал изначально о функционале устройства? А если вдобавок к этому еще и отдельные куски схемы рисовал коряво? А если УГО компонентов в библиотеках нарисованы изначально криво? Напугал? То-то же…

Что же делать?


Теперь давайте поразмышляем… В данном устройстве всего компонентов 150, в моих средних проектах связанных с силовой электроникой, их обычно от 1500 до 4000, то есть масштаб бедствия вы представляете, когда таких листов А1 как выше будет 10 штук и все они захламлены и забиты. Ошибки неизбежны!

Смотрим и думаем дальше. Первое что стоит сделать — сформировать модули. У меня они все сформированы, т.к. я их просто копировал с одной домашней поделки, но один модуль разбил — EEPROM память по I2C работающую. Я совершил ошибку такую же как в схеме ардуины, как стоит сделать:

myteuiwqvk4dwi6s8_uehdlodug.png

Как видите я собрал в одну «кучку» микросхему памяти, блокирующий конденсатор по питанию, который будет стоять около нее и подтяжки к +3.3В. Теперь мне не придется искать по схеме все компоненты, которые нужны для обвязки микросхемы памяти, они все уже в одном месте. Кстати не обязательно выделять отдельный лист под каждую мелкую микросхему, все таки EEPROM это не отдельный модуль, а скорее часть обвязки микроконтроллера. МК с обвязкой — вот это уже модуль достойный отдельного листа.

Идем дальше… У нас есть повторяющиеся части схемы, например, 2 абсолютно одинаковых канала для обратной связи на операционном усилителе (ОУ), еще 6 абсолютно одинаковых силовых каналов. Это можно оптимизировать тоже.

Еще одна светлая мысль — если все 6 каналов buck одинаковые, то и трассировка у них наверняка будет одинаковая. Этим надо воспользоваться. Может можно развести дороги для одного модуля, а потом оставшимся 5-ти сказать «а ну повтори»? Оказывается можно, AD позволяет нам очень сильно облегчить себе жизнь.

Давайте делать красиво!


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

zco3srognsucoj_w2aaclx9ngze.png

На листке уместился весь функционал нашего устройства. Во-первых, данная схема дает нам понять как устройство в принципе работает: есть силовая часть (Buck) 6-ти канальная, которой управляет МК (MCU), который для управления получается 2 сигнала обратной связи через ОУ (Amp.), а так же имеется парочка dc/dc для самопитания и интерфейс Modbus для связи с миром. Во-вторых, по схеме сразу видно готовые функциональные блоки.

Теперь нам необходимо создать в AD 5 листов А3 и в каждый перенести соответствующую часть схемы, но перед этим необходимо рассмотреть типы соединений и цепей, которые мы будем использовать в AD:

  • Power port
    c5mbitcaqsofvn-ufyayajxglzq.png
    Данный тип является глобальным по всему проекту. То есть если мы поставили такой порт на одном листе и на другом, то они объединятся в единую цепь с именем «VCC3V3». Соответственно дополнительно цепи питания на разных листах соединять не надо. Данным типом порта задают только цепи питания и землю (GND);
  • Net Lable
    uqqhygfvtvqpwecsopyvy0nqb4q.png
    Инструмент для присвоения имени конкретной цепи на схеме. Цепи с одинаковым именем (NetLable) объединяются как внутри одного листа, так и за его пределами. Мы будем использовать данный инструмент кошерно, то есть только для задания имен и соединения внутри одного листа;
  • Place Port
    5sewdiqhjjqltwansn6bn-uhcfc.png
    Инструмент для межмодульных соединений. В противоположность NetLable, который служит для соединения внутри модуля/листа, данный порт применяется для общения с «внешним миром». Им мы соединяем между собой модули, все цепи кроме питания и земли (GND).

Теперь нам необходимо задать с помощью Place Port сигналы, которые будут выходить за пределы модуля. Например, для модуля с операционным усилителем это будет выглядеть так:

rneigpk1jw6ug4opk96df6jsu9w.png

Теперь наш модуль превратился во вполне логичную часть схемы: у него есть вход (INPUT), есть выход (ADC-OUT) и есть 2 глобальных подключения (Power Port) — GND и VCC3V3. Ничего лишнего. Проделаем тоже самое для других модулей и сделаем автоматическое присвоение номеров условным обозначениям (designator), перейдя в Tools → Annotations → Annotate Schematics и нажав Update Changes List:

6pct5e8yygpyhzvg0uyfxyjrdja.png

Далее жмем Accept Changes и в открывшемся окне жмем Execute Changes:

l5vturkknxvohhatyk4viimvl-g.png

Закрываем лишние окна и видим, что нашим обозначения (D?, R?, C? и т.п.) получили уникальные номера. После проделанных действий мы получаем вот такой проект — PDF.

Ну как? Думаю никто не станет спорить — все аккуратно, понятно как работает с первого взгляда, нет помойки на схеме. Теперь осталось за малым — нам надо как-то из одного листа создать 6 каналов и вообще соединить все в кучу.

Для этого создадим новый лист, у меня он будет называться просто Main design, но имя может быть любое. В данном листе у нас будет располагаться блок схема, которую я ранее рисовал от руки. Для создания модуля идем Place → Sheet Symbol. Теперь зададим нашему элементу стилистику всего проекта, то есть шрифт (у меня ISOCPEUR), ширину и цвет рамки, обозначение (designator) и прочее, а так же пропишем имя листа с нашим модулем:

zjuv0w3hkefzuvnq8xc6dnmhcku.png

Теперь правой кнопкой мыши нажимает на наш модуль (оранжевый квадрат) и идем Sheet Symbol Actions → Synchronize Sheet Entries and Port и откроется окно:

frgsl3n9uo2xcqdhnrgpirshcjk.png

В нем мы видим список наших Place Port. Выбираем все и жмем Add Sheet Entries, устанавливаем в наш модуль и задаем общий тип шрифта, получаем такой модуль:

u18b-6hcubunivyggssoyyvw6-a.png

Теперь повторяем тоже самое для остальных 4-х модулей и на выходе получаем вот такую структуру:

5hkmo9yrrttkgr7xjqyedxsyuoi.png

Тут стоит обратить внимание на 2 момента:

  • 5-й лист (Page 5) с dc/dc при попытки синхронизации не обнаружит Place Port и если посмотрите на схему модуля, то их там действительно нет, только Power Port. НО! Вынести модуль для Page 5 нужно обязательно, иначе компоненты с данного листа просто не появятся на плате;
  • Обратите внимание, что у инструмента Place Port есть параметр направленности: input, output и bidirectional. Вам стоит правильно определять тип порта для вашего сигнала, например, порты PWM-H являются исходящими (output) для модуля MCU и входящими (input) для модуля Buck.

Клонируем


Теперь когда мы создали все модули необходимо увеличить их количество для того, чтобы получить 6 каналов для силовой части и 2 канала для операционных усилителей. Как говорится выхода всегда два, даже если тебя съели и данный случай не исключение. Я покажу оба способа:

  • Копирование в рукопашную
    Тут все просто — обычный копипаст. Выделяем наш модуль, Ctrl+C и Ctrl+V — получаем новый модуль. Остается просто сменить ему номер обозначения (designator) с M3 на M6. Дальше все соединяем и получаем промежуточный вариант схемы:

    sjz8-zjktmvg7pybeqcjcyuathe.png

    Я скопировал модуль ОУ, добавил пару разъем и шины GND и VCCIN, они теперь глобальные и подключаются сразу во всех модулях где встречаются. Тащить им отдельно Place Port в данном случае смысла нет. Так же я соединил все внешние цепи кроме модуля Buck, на нем продемонстрирую 2-й, более компактный, способ.

  • Копирование по-джедайски
    В противоположность предыдущему варианту тут все сложно для понимая, но проще в реализации и главное более грамотно. Создание нескольких каналов будет осуществляться с помощью директивы REPEAT. Для этого вместо обозначения (designator) M1 пишем команду REPEAT (BUCK, 1, 6). Данная команда создаст каналы с обозначениями (designator) от BUCK1 до BUCK6, то есть наши 6 штук. Жмем Enter и видим как AD создал необходимое число каналов:

    -osldyuu0iuv_x-zbtpij1vmybq.png

    Теперь необходимо соединить цепи. Начну с простого — наши выходы OUT-5V у всех каналов должны объединяться, т.к. все наши фазы работают как один преобразователь на общий выход. Для этого мы просто из Place Port выводит обычную цепь и подключаем ее на выходной разъем:

    e9hnn95pdp_ojpwm9yekqleigq0.png

    Теперь необходимо сказать AD, что наши порты PWM-H это не один порт/цепь, а 6 раздельных каналов. Для это кликаем по Place Port с именем PWM-H и в графу с именем пишем REPEAT (PWM-H), это создаст 6 разных цепей:

    rl8sfbllpq1iip970vwc_4y4xh8.png

    Теперь необходимо вывести обычную цепь (Ctrl+W) из Place Port с именем REPEAT (PWM-H) и дать этой цепи имя PWM-H с помощью инструмента NetLable. Затем из цепи необходимо вывести шину (Bus) и дать ей имя PWM-H[1…6]. Таким образом из одного порта мы вывели 6 разных цепей у которых будут имена PWM-H1, PWM-H2 и так далее:

    13w6akm1gjnn3pgt1gdvciyuyua.png

    Далее шину PWM-H[1…6] мы подключаем к выходу шины на модуле MCU для верхних транзисторов полумоста. Аналогичные процедуры так же необходимо провести для нижний транзисторов и так же прокинуть шину, в итоге мы будем иметь схему следующего вида:

    cfhamjkazr69f7wkvqken9jgbo4.png

    Теперь познав дзен давайте переделаем «по-джедайски» модуль с операционным усилителем, чтобы не оставлять костыль в виде копипасты. В результате получим финальную версию принципиальной схемы:

    lio6qs-imr6-dtzxjzqfwm3d3au.jpeg

На этому мы с принципиальной схемой закончим, финальный результат вот — PDF. Как видите схема вышла простейшая, всего пару полу-пустых листов А3, разобраться в ней сможет любой радиолюбитель с минимальными затратами времени и нервов.

Экономим десятки человеко-часов на трассировке


В современных реалиях, когда степень интеграции компонентов (микросхем) достаточно высокая, разработка принципиальной схемы занимает все меньше и меньше времени. Уже не так часто встретишь на 90% аналоговых монстров и это хорошо. «Слабым местом» в процессе разработки устройства остается проектирование печатной платы (PCB). Современные САПР предоставляют множество различных инструментов для сокращения трудозатрат на разработку платы и именно это было основной целью данной статьи.

Как я ранее указывал, в нашем устройстве есть несколько повторяющихся модулей: buck и ОУ. Если вы посмотрите на современные устройства, то во многих будет множество таких повторений, например, 4-х канальный осциллограф у которого все каналы идентичны. Мы можем конечно трассировать каждый канал руками, а можем и упростить себе жизнь.

Все, что ранее было описано в статье называется просто — многоканальная схема, звучит просто и со вкусом. Именно такую принципиальную схему мы создали и теперь она нам позволит сделать следующее — развести цепи для одного канала buck, а затем просто скопировать в оставшиеся 5 и расположение компонентов (компоновку) и все проводники. Для начала переносим все наши компоненты с принципиальной схемы в файл с печатной платой, жмем Design → Update PCB Document:

-smdvse1gmy6i_qrhjkyjyf_xck.png

Теперь жмем Execute Changes и в результате получаем вот такую печатную плату:

rhdizrfl3abzwrw7bdj6sos-bii.png

Как видите на плате появилось 6 красных зон, которые называются комнатами (Room). В каждой комнате находятся электронные компоненты для одного канала и ничего более. Теперь необходимо задать габариты комнаты, то есть указать какую конкретную площадь будут занимать компоненты нашего канала и сделать компоновку деталей. Выглядит это следующим образом:

b0e7pm-noct7bcnkrkwhsgggmrw.png

Так будут распологаться компоненты каждого канала и именно такую площадь занимать. Правда что-то мне тут не нравится… Ага! Обозначения компонентов в слое шелкографии (белый надписи) имеют не сквозную нумерацию, а нумерацию в формате «Обозначение_Название комнаты», то есть у нас есть резисторы R6_BUCK1, R6_BUCK2 и так далее. Я хочу чтобы не было приставки »_BUCK1» и у каждого компонента был свой номер. Нажимаем Ctrl+L и затем идем в меню Annotate Options, где видим такое меню:

joiqo9-1gdxlwdttbuvrf29uxne.png

Теперь необходимо выбрать вариант нумерации $ComponentPrefix$GlobalIndex и нажать ОК. Нажимает Reset All чтобы все значения скинуть и затем нажимаем Anotate Designated. Как видим в канале BUCK2 компоненты сменили свои обозначения с R6_BUCK2 на более привычные нам обозначения R6, R7 и т.д.:

c20cmzv77sxz1jb2iy7auzw5mzi.png

Осталось согласиться с изменениями, нажав Accept Changes и в открывшемся окне подтвердить все кликом по Execute Changes. Переносим изменения из схемы на печатную плату Design → Update PCB Documet как мы уже делали. В результате наблюдаем «человеческие» обозначения, которые не занимают всю плату и гадят в ней:

v9a-s8fylb11ljgqwbq9atwc3ya.png

Имея адекватную компоновку и обозначения переходим к трассировке — выполним трассировку цепей внутри одной комнаты «BUCK6» и получим вот такую картину:

slg_jb6wz8ia-ivopkpuau2tr6e.png

Я не стал разводить все, GND оставил не тронутой, т.к. это обычно единым полигоном заливается. Для демонстрации достаточно. Теперь делаем следующее:

  • Идем Design → Rooms → Cope Room Format
  • Altium нам внизу подсказывает Choose source room, то есть предлагает тыкнуть в комнату с которой нужно все скопировать, в моем случае в BUCK6
  • Теперь altium подсказывает ChooseDestination Room, то есть просит ткнуть в комнату в которую нужно скопировать нашу разводку. Выбираем любую из BUCK-ов.
  • Откроется меню в котором можно поставить галочку Apply To Specified Channel, которая говорит, что надо скопировать не просто в выбранную комнату, а во все аналогичные.
    v5-eqjm_va7esddyjkzku5oulle.png
  • Жмем ОК и радуемся!

Я не поставил галку и выбрал кликами 2 канала, т.к. бывают ситуации, когда, например, не все каналы идентичны. Вспомни VRM на материнке у CPU, там часто 3–4 фазы с одной стороны, а еще 3–4 с другой. Применительно к моему случаю это могут быть 3 фазы с одной разводкой и еще 3 фазы с другой. Думаю обща идеология понятна. Теперь давайте посмотрим на результат:

jep6ztsxyvoosu1x00wflcgfeii.png

Наблюдаем 3 идентичных канала и самое главное — времени я потратил на все каналы как на 1. В данном абстрактном случае экономия времени в 6 раз, но и в реальных задачах порядок уменьшения трудозатрат примерно такой же. Да и не маловажный фактор — если делать 6 каналов руками, то «глаз замыливается» из-за однотипной работы и велика вероятность допустить ошибку или сделать компоновку кривую.

Итог


Надеюсь вам было интересно узнать об одной из базовых парадигм проектирования электроники и почерпнете для себя что-то новое и полезное. И помните — аккуратность в документации, библиотеках и использование правильных инструментов в САПР позволят вам избежать ошибок и сэкономить кучу времени.

© Habrahabr.ru