Компьютерная алгебра для электронного дизайна

Компьютерная алгебра для электронного дизайна
Компьютерная алгебра для электронного дизайна

Не поймите меня неправильно. Как и большинству людей, нет ничего, что мне нравилось бы больше, чем решать длинную и сложную математическую задачу вручную. Но иногда несколько страниц алгебраических набросков на бумаге - это просто средство для достижения цели. Я нахожу это особенно верным во время сеансов проектирования электроники, будь то проектирование схемы или разводка печатной платы; Мне просто нужен ответ, и любое время, потраченное на его поиск, отвлекает меня от более важной задачи. У меня, по крайней мере, это происходит как минимум раз в неделю, и около пяти лет назад я решил что-то с этим сделать. Я, конечно, слышал о пакетах компьютерной алгебры, но когда я пошел в школу, их не преподавали в рамках программы бакалавриата по инженерии. Итак, я приступил к изучению одного: пусть компьютеры делают математику!

Я выбрал пакет wxMaxima, основанный на документах внешний интерфейс к системе компьютерной алгебры Maxima. Созданный на основе кода, первоначально написанного в конце 1960-х годов, это пакет общего назначения, поддерживающий символьные вычисления для алгебры и исчисления. Под ним солидный, зрелый код, а сверху - современный пользовательский интерфейс. Кроме того, это FOSS.

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

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

Отборочные

Есть несколько вещей, которые нам нужно знать о синтаксисе Maxima, который отличается от обычных языков, с которыми вы, возможно, более знакомы:

  1. Строки заканчиваются либо точкой с запятой, которая показывает результирующий вывод, либо знаком доллара, который скрывает его.
  2. Присваивание переменной использует двоеточие. Чтобы установить для переменной «x» значение «3», мы говорим «x: 3;».
  3. Знак равенства устанавливает отношение символического равенства: «y=2x;» определяет уравнение, которым можно манипулировать символически.
  4. Если вы перепутаете 2 и 3, вы сильно запутаетесь.

Имея это в виду, мы готовы взглянуть на некоторые функции из кода GitHub. Три простые функции оказываются очень полезными. Первая функция, par(), вычисляет эквивалентные значения для параллельных резисторов или катушек индуктивности или для последовательных конденсаторов. Например:

Вторая функция, vdiv(r_top, r_bot), вычисляет коэффициент делителя напряжения для заданных резисторов. В первом примере источник питания 5 В делится резисторами на 400 и 100 Ом, чтобы получить на выходе 1 В, а во втором примере создается символическое выражение для делителя, образованного r1 и r2.

Наконец, функция pref(x, E) находит ближайшее значение к x из выбранной «E-серии» предпочтительных значений EIA. Вы можете выбрать любую серию из {E3, E6, E12, E24, E48, E96, E192}, а также комбинированную серию {E48_E24, E96_E24, E192_E24}. Например, мы можем найти ближайшие резисторы 5% и 1% для значения примерно пи Ом.

Вооружившись этими тремя функциями и встроенной мощью Maxima, мы готовы решать некоторые проблемы.

Выход VGA: новый мигающий светодиод

Поскольку 2019 году суждено стать годом, когда хакеры в полной мере воспользуются мощью FPGA, кажется вполне уместным применить эти методы к обычному примеру FPGA. В то время как вводный проект микроконтроллера традиционно представляет собой мигающий светодиод, простой выход VGA для многих является первым «настоящим» проектом FPGA. Для генерации аналоговых сигналов несколько цифровых выходных линий обычно подаются на простой ЦАП на основе резисторов на каждый цветовой канал, а линии синхронизации обрабатываются двумя другими выходами.

Показанная здесь схема представляет один цветовой канал (скажем, красный) и допускает восемь различных выходных уровней из трех входных битов, поэтому дисплей RGB будет способен отображать 512 цветов. В этом случае Vc - это старший бит, а Va - младший бит. Эта топология представляет собой простой ЦАП с взвешенными резисторами, и мы предпочли его более распространенному варианту R-2R, потому что для последнего (каламбур) требуется семь резисторов вместо четырех. Есть несколько вещей, которые мы знаем сразу, а именно, что наше напряжение питания составляет 3,3 В, в то время как полное выходное напряжение (Vmax) для ЦАП должно быть 0,7 В при нагрузке с 75-омным терминатором (Rl) внутри монитора (мы знаем это из спецификации VGA).

Нам нужно найти значения четырех резисторов (R1 - R4), поэтому нам нужно придумать четыре уравнения для решения. Один из них должен установить выходное сопротивление 75 Ом, чтобы избежать отражений на кабеле и возникающей в результате размытости на дисплее. Из схемы мы видим, что выходное сопротивление - это просто все резисторы, включенные параллельно (представьте, что Va, Vb и Vc подключены к земле). Итак, мы определяем переменную Zout с помощью функции par(). Позже мы создадим уравнение, присвоив ему значение 75 Ом. Результат, который мы получаем, показывает хорошо отформатированную версию формулы:

Нам нужны еще три уравнения. Есть несколько наборов, которые можно выбрать, но, возможно, самый простой способ - рассмотреть выходное напряжение, когда только одна из входных линий находится в состоянии высокого уровня. Например, когда высокий только старший бит - состояние {Vc=1, Vb=0, Va=0} или «100» - резисторы образуют делитель напряжения из Vcc с R4 в качестве верхнего резистора, а все остальные параллельно нижнему резистору. Мы используем функции vdiv() и par(), чтобы определить переменную V100 для этого состояния, для которой мы также создадим последующее уравнение. Вывод для нас - беспорядочное выражение, но Максиму это не беспокоит.

Аналогичным образом, когда только Vb имеет высокий уровень (состояние «010»), мы можем определить V010 с помощью аналогичного делителя напряжения, на этот раз с r3 в качестве верхнего резистора, а все остальные подключены параллельно снизу.

Наконец, применение той же логики к состоянию «001» дает выражение для V001.

Теперь мы можем составить четыре уравнения и заставить их решать максимумы. Первое уравнение устанавливает выходной импеданс равным 75 Ом, а остальные три задают выходное напряжение для выбранных нами состояний. Для 3-разрядного ЦАП старший бит имеет вес 4/7 от полного напряжения, средний бит имеет вес 2/7, а младший бит - 1/7 веса. Приравнивание трех состояний напряжения к этим долям Vmax дает нам три других уравнения. Наряду с уравнениями мы также передаем список переменных для решения: номиналы резисторов.

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

Поскольку мы вряд ли купим резистор на 130,26316 Ом, мы можем выбрать наиболее близкие значения из ряда E24 (5%) и присвоить результат переменной «vals».

Конечно, выбор этих значений изменит производительность ЦАП, поэтому лучше проверить, что на самом деле выдают эти резисторы. Функция ev() оценивает свой первый аргумент, используя контекст второго, поэтому в этом случае мы подставляем резисторы с предпочтительным значением. (Переменная fpprintprec управляет точностью печати с плавающей запятой; здесь она установлена равной четырем значащим цифрам.)

Выводы в идеале должны быть [75, 0.4, 0.2, 0.1]. Я бы, вероятно, согласился с этими значениями, может быть, потому что у меня есть большой запас резисторов 5%, но если бы мы хотели получить более близкий результат, мы могли бы просто вместо этого найти предпочтительные значения из серии E96 (1%).

К этому анализу есть пара сносок. Во-первых, мы проигнорировали любое выходное сопротивление драйверов ЦАП. Если мы знаем их выходное сопротивление (или можем измерить, предположить или вывести его из графиков в таблице данных), мы можем вычесть его из каждого входного резистора для компенсации. Мы также удобно убрали гамма-коррекцию, которую, к сожалению, нельзя сделать с помощью только цепи резисторов. Наконец, это всего лишь один из способов расчета номиналов резисторов. Вместо этого вы могли бы использовать знание того, что R1, R2 и R3 должны быть связаны в два раза, чтобы упростить вычисления, хотя, возможно, дело в том, что вам не нужно быть таким умным.

555 Сервоконтроллер таймера

В качестве второго примера рассмотрим конструкцию сервоконтроллера с использованием повсеместно распространенной микросхемы таймера 555. Допустим, у нас есть потенциометр на 10 кОм (R1), и мы хотим с его помощью управлять положением сервопривода. Нам нужен таймер 555 для вывода импульсов от 1 мс до 2 мс, что соответствует полному ходу сервопривода, когда потенциометр перемещается в своем диапазоне. Мы также решили, что частота повторения импульсов должна быть 200 Гц или ниже. Изучив страницу в Википедии, мы обнаруживаем, что добавление диода в типичную нестабильную схему 555 позволяет нам иметь рабочие циклы менее 50%, которые нам нужны для генерации импульсов. Страница также дает нам уравнения для высокого времени (Th) и низкого времени (Tl) с добавленным диодом.

Чтобы начать проектирование, мы сбрасываем все, что знаем, в переменные. Мы выбираем источник питания 5 В для Vcc и предполагаем прямое напряжение 0,7 В для диода (к которому мы вернемся позже). Выражения для высокого времени (Th) и низкого времени (Tl) являются прямым переводом уравнений, приведенных на странице Википедии, в то время как частота (F) является просто обратной величиной периода.

С учетом этих определений теперь мы можем написать три уравнения, чтобы ограничить решение для трех неизвестных, r2, r3 и c1. Мы используем функцию ev(), которая оценивает выражения по списку отношений. Например, первое уравнение «ev(Th=1e-3, r1=0)» говорит о том, что ширина импульса должна быть 1 мс, когда R1 установлен на ноль (повернут полностью влево). Точно так же мы устанавливаем ширину импульса на 2 мс с R1, установленным на максимальное сопротивление (10 кОм). Наконец, последнее уравнение говорит, что частота должна быть 200 Гц с R1 на нуле. Этих трех уравнений достаточно, чтобы решить три неизвестных.

Опять же, результаты - это не все значения, которые мы можем найти в мусорной корзине, поэтому мы можем выбрать ближайшие 5% значений.

Итак, мы можем проверить наши запасные части на наличие резисторов 10k и 56k плюс конденсатор 100n. Если бы мы хотели быть осторожными, мы могли бы также проверить, что эти замены существенно не изменили решение, оценив ширину и частоту импульса с R1 в обоих крайних значениях.

Результаты выглядят хорошо: импульсы от 1 мс до 2 мс в диапазоне от 170 Гц до 205 Гц. Но, конечно, это только подтверждает, что выбранные компоненты работают с выбранной нами моделью схемы. В основе этой модели лежит предположение, что прямое напряжение диода является известной постоянной величиной 0,7 В. В действительности это прямое напряжение зависит от тока, протекающего через диод: беглый просмотр таблицы данных 1N4148 показывает, что оно, вероятно, составляет около 0,5 В при задействованных токах. в этой цепи. Таким образом, перед построением схемы мы можем захотеть повторно выполнить вычисления, используя это значение. В любом случае, результаты позволяют нам приблизиться к следующему шагу, будь то моделирование или прототипирование.

Преобразование посадочного места на печатной плате

Что дает техническое описание (слева) и то, что я хочу (справа).

Вот последний простой пример, который я часто использую для создания посадочных мест для печатных плат. В Eagle посадочные места создаются путем размещения контактных площадок определенного размера в указанной центральной точке. В некоторых таблицах данных их посадочные места представлены в этом формате, в то время как другие заставляют вас выполнять некоторые математические операции для преобразования размеров. Раньше я проделывал это в уме, но после того, как из-за глупой ошибки получил три печатных платы с фиолетовыми подставками, теперь я заставляю свой компьютер выполнять эту работу. Два быстрых уравнения могут быть найдены путем проверки, а максимумы сделают все остальное. В этом случае я выражаю размеры, указанные в таблице данных, с точки зрения того, что я хочу: размер (h, w) и положение (x, y) контактных площадок.

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

Дальше

Если вы заинтригованы Maxima и хотите начать работу самостоятельно, на странице github.io есть множество ссылок на учебные пособия. В Интернете также есть ряд примеров, относящихся к проектированию схем: анализ демпфирования в генераторах, некоторый вводный анализ схемы, применение дифференциальных уравнений к RC-цепям и конструкция транзисторного усилителя (предупреждение в формате PDF)..

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