Метод узловых потенциалов, для расчета электрических схем, основан на первом законе Кирхгофа и законе Ома. Этот метод удобен для расчета схем с малым количеством узлов и большим количеством ветвей. Данному условию соответствует множество реальных схем (возможно большая их часть), поэтому данный метод выбран для расчета конструируемых, в редакторе ниже, схем. В редакторе имеется возможность поставить резисторы и источники тока (чего достаточно для составления схем замещения), а также провода и выбрать узел принимаемый за нулевой. Также можно запустить расчет схемы с выводом матриц и уравнений составленным методом узловых потенциалов. Пример расчета схемы в программе Mathcad. Если схема составлена некорректно (например есть разрыв (например провод установлен в середину другого провода а не край) или в одной замкнутой ветви есть два источника тока) то решатель покажет соответствующее всплывающее окно и расчет произведен не будет. Данная программа подойдет для помощи в обучении по ТОЭ, ОТЦ, электротехники или для моделирования схем, постоянного или переменного тока, приведенных к схемам замещения с резисторами и источниками тока.
Режим: ВыборНаправление и ориентация источника: →
Данные (Матрицы):
Здесь появится матрица проводимостей...
Здесь появится матрица источников тока...
Здесь появится матрица узловых потенциалов...
Система уравнений (МУП):
Здесь появится система уравнений...
Если данный САПР, калькулятор, проектирования схем оказался полезным то есть возможность поддержать автора и способстовать т.о. появлению подобного рода контента. Адрес биткоин кошелька для поддержки блога - bc1qlhrmmkh77x2lzhqe4lt9qwkglswj64tsqt2l5g
Цветовая маркировка резисторов используется чтобы размещать информацию на корпусе малого размера, в читаемом виде и устойчивом к частичной утрате этой читаемости например из за повреждения корпуса, частичной покраски или закрытию обзора части корпуса соседними элементами. На корпусе обычно, цветными полосами, указывается сопротивление и допуск (т.е. неточность с которой указано сопротивление). Чтобы прочитать эту информацию нужно повернуть резистор так чтобы ближайшая к выводу или самая широкая цветная полоса располагалась слева. В т.с. самая левая полоса укажет первую цифру сопротивления, самая правая полоса укажет допуск (чаще всего она золотого, серебрянного или черного цвета (по этому признаку также, с большой долей вероятности можно определить стороны))(и если это не трехполосый резистор у которого допуск не указывается и всегда +-20%), вторая справа полоса укажет множитель на который следует умножить число составленное из цифр по самым левым полосам чтобы получилось сопротивление в омах. Сопротивления входят в стандартные ряды например E12, E24, E96. У резистора с 3мя цветными полосами могут быть сопротивления из ряда E12, У резистора c 4мя из E24 и у резистора с 5ю из Е96. 3х полосые резисторы самые не точные. 5ти полосые прецезионные а 4х полосые самые распространенные. Ниже приведен кодер/декодер цветовой маркировки резисторов для всех трех вариантов.
Ранее мы рассматривали аппаратный DIY генератор шума на транзисторах который совсем не трудно изготовить самостоятельно. Однако если возможностей самодельного аппаратного генератора не хватает или он по каким то причинам не подходит то можно воспользоваться программным генератором на данной странице. У данного генератора есть кнопка запуска и остановки, возможность записи и сохранения шума, таймер сна, регулировки громкости, частоты среза фильтра низких частот, динамики изменения шума (можно поставить на 0 если не нужна) и некоторые предустановленные режимы настроек.
Если вдруг генератор перестал работать из за частых переключений то для восстановления его работы можно перезагрузить страницу.
Одной из не обязательных но тем не менее весьма полезных функций в микроконтроллерах STM32 является DMA (Direct Memory Access) т.е. дословно "прямой доступ к памяти". В микроконтроллерах такую функцию обычно выполняет специальный контроллер. Также таких контроллеров может быть больше одного. DMA контроллер может выполнять передачу данных из одной области памяти в другую область минуя центральный процессор, который в этот момент может выполнять какие то более сложные функции. Поскольку передача данных это очень частая в практике и очень ресурсозатратная операция то наличие DMA контроллера позволяет значительно повысить производительности микроконтроллера в целом. Даже с учетом того что шина данных используемая и процессором и DMA контроллером одна и это отчасти несколько ограничивает эффективность такого распараллеливания, в целом всё равно использование DMA имеет смысл. Например нам нужно чтобы данные поступающие из UART или SPI попадали в массив расположенный в оперативной памяти. Возьмем для начала UART1 и попробуем через DMA передать данные в GPIO для наглядности. Как обычно сперва добавляем заголовочные файлы библиотек и макросы. Использовать макросы не рекомендуется для лучшей удобочитаемости кода. Однако они всё таки могут быть полезны. Например можно использовать макросы для простой и быстрой настройки каких либо часто используемых режимов какой либо периферии. Ниже пример макросов для настройки на самые часто используемые режимы GPIO и включение тактирования.
Данные будем брать из UART1 и передавать в порт B а чтобы было видно результат, можно подключить трехцветный светодиод на свободные пины порта B
Порт B используется потому что на порту A работает UART1 и передача данных туда, может помешать работе UART1. Далее, как обычно, настраиваем пины и uart (о том как это делается см. предыдущие уроки по STM32) но только на этот раз дополнительно устанавливаем 6й бит третьего управляющего регистра UART чтобы включить DMA приемник.
USART1->CR3 |= 1<<6;
В используемом микроконтроллере имеется 2 DMA контроллера. У первого есть 7 каналов у второго 5. Каждый канал может проводить только определенные запросы от определенной периферии. Для того чтобы выяснить какая периферия каким каналам соответствует есть две таблицы в мануале. Одна для первого DMA вторая для второго. Т.к. UART1 есть на DMA1 то нас интересует первая таблица. Из неё мы находим нужный нам канал. Это пятый канал первого DMA по тому что на нем uart1 приемник.
DMA1_Channel5
Также ещё важно не забыть включить тактирование DMA1.
RCC->AHBENR |= 1;
В регистр периферии DMA1 передаем адрес регистра данных UART1. В регистр памяти DMA1 передаем адрес порта B. Т.о. обозначив направление передачи данных.
// 2. Указываем адрес периферии (регистр данных UART1)
DMA1_Channel5->CPAR = (uint32_t)&(USART1->DR);
// 3. Указываем адрес назначения (регистр ODR порта GPIOB)
DMA1_Channel5->CMAR = (uint32_t)&(GPIOB->ODR);
В регистр количества пересылок записываем единицу по тому что больше пока не требуется.
DMA1_Channel5->CNDTR = 1;
В конфигурационном регистре устанавливаем только биты 5 для циклического режима т.е. неоднократной передачи и бит 1 для включения DMA1. Остальное установлено по умолчанию так как нужно.
DMA1_Channel5->CCR = 1<<5 | 1;
Основной цикл пуст (при желании его можно заполнить), прерывания тоже не используются. Можно сказать что всю нужную работу, в данном случае, выполняет только DMA и если всё заработает то значит работает DMA. Полный код:
В итоге всё заработало. После загрузки прошивки, визуально светодиод начал реагировать на поступающие на плату символы.
Адрес биткоин кошелька для поддержки блога - bc1qlhrmmkh77x2lzhqe4lt9qwkglswj64tsqt2l5g
Предлагаю немного погрузиться в тему нейронных сетей. т.к. теперь это весьма популярная тема и на то есть причины. Одна из причин, вероятно, заключается в том что они обучаются на подобии того как это происходит с мозгом живых существ а не программируются обычным для электронных устройств способом. Это значительно упрощает процесс создания какого либо полезного цифрового продукта. Ну например, для того чтобы создать программу переводчик обычным способом, придется учитывать все правила языков между которыми происходит перевод и составлять длинные словари всех возможных слов, словосочетаний и всё подобное. Для создания переводчика на основе нейронной сети, понадобятся обучающие выборки и процесс тренировки сети который будет происходить автоматически. Обычно под нейронными сетями понимаются их эмуляторы т.е. такие программы которые используют не нейросетевую архитектуру какого либо устройства для выполнения алгоритмов которые функционируют по принципам нейронных сетей. Например нейросети могут эмулироватся на обычном процессоре. И это не очень эффективно т.к. требует много времени. Также немаловажным является колличество памяти, как постоянной так и оперативной, поскольку работа с нейронными сетями это работа с огромными массивами данных. Долгое время это ограничивало возможности искусственных нейронных сетей. Но когда для их эмуляции стали использовать графические, тензорные или специальные процессоры то это увеличило их возможности.Также сами алгоритмы нейронных улучшались. И теперь они, можно сказать, из разряда игрушек перешли в разряд серьезных вещей которые сильно влияют на всю развитую часть человечества. В частности сильно влияют на рынок труда но вероятно что это далеко не предел. Основой большинства нейронных сетей является многослойный персептрон. Обычный однослойный персептрон изначально был придуман как модель для изучения естественных нейронных сетей из которых состоят мозги живых существ. Один слой состоит из некоторого количества нейронов которые работают параллельно и расположены как бы в одном слое. На вход этого слоя приходят какие то сигналы. Слой их обрабатывает и выдает какие то сигналы на выход. Обычно естественные нейронные сети состоят из более чем одного слоя. Т.е. сначала сигналы со входов обрабатываются одним слоем который выдает какие то сигналы на выход. После, эти выходные сигналы идут на вход следующего слоя который также обрабатывает сигналы и пойдёт их на выход следующего слоя или просто на выход. Каждый нейрон, если он натуральный, то это живая клетка которая устроена очень сложно но в данном случае это не важно. У нейрона имеются отростки. Отростки бывают двух типов. Это аксоны т.е. выходы. У одного нейрона обычно один аксон. И дендриты т.е. входы. Дендритов у нейрона может быть много.
Место соединения акстона и дендрита или ещё входов с дендритами, называется синапсом или по простому связью.
сигнал который проходит через синапс, умножается на коэффициент который называется весовым или просто весом и дальше результат этой операции идет в нейрон и складывается с такими же результатами для всех остальных дендритов. После чего эта сумма, которая еще называется взвешенной суммой проходит через функцию активации и поступает на выход нейрона.
В реальных нейронных сетях сигналами являются бегущие по отросткам потенциалы а не токи поэтому мозги не разогреваются до красна но это не важно т.к. другого практически полезного способа эмулировать нейросети пока не существует. Помимо весовых коэффициентов ещё существуют коэффициенты смещения которые позволяют лучше настраивать сеть но пока что остановимся только на весовых. Совокупность весовых коэффициентов это можно сказать и есть сама сеть или модель. Если она существует в таком простом виде. Обучение нейронной сети заключается в настройке этих весовых коэффициентов так чтобы при подаче на вход сети определенной совокупности сигналов, на выходе этой сети были совокупности сигналов которые желательно чтобы сеть выдавала.
Входные и выходные совокупности сигналов для настройки сети называются обучающими выборками. Их чаще всего больше одной. И чем больше обучающих выборок тем точнее можно настроить нейронную сеть для своих задач. Процесс расчета выходных сигналов по входным, называется "прямое распространение" или forward propagation. Этот процесс нужен для использования нейронной сети. И он относительно прост. Задача же обучения нейронной сети гораздо сложнее и не описывается простыми формулами. Существуют разные методы обучения с разными вариациями. Но пока что на них останавливаться не будем. Т.к. это большая отдельная тема. Предположим что у нас имеется двухслойный персептрон с четырьмя нейронами, двумя входами и двумя выходами.
Попробуем реализовать код прямого распространения. На каком нибудь языке программирования. Обычно подобные вещи делают на питоне со специальными библиотеками для матричных операций. Так получается всё очень просто и быстро. Но о том как реализовать этот алгоритм на чем нибудь си подобном, информации не так много. Поэтому попробуем что нибудь си подобное. Наиболее простой вариант это на мой взгляд javascript. При желании код можно адаптировать под си. Что может быть полезно для применения в микроконтроллерах.
Данный код реализует прямое распространение двухслойного персептрона с двумя нейронами в каждом слое и возможностью увеличить это количество, т.е. масштабирования путем изменения соответствующих переменных. Весовые коэффициенты каждого синапса инициализируются случайными значениями в диапазоне от -1 до +1. На вход сети подается массив входных значений а на выходе получается массив выходных. Для того чтобы запустить программу её нужно сохранить в формате html и открыть каким нибудь браузером, например google chrome. После загрузки произойдет прямой проход и результаты появятся во всплывающем окне а также их можно посмотреть в специальном поле если нажать F12. Есть конечно ограничения. Нельзя сделать слои с разными колличествами нейронов. Т.е. этим ограничена архитектура но зато такая архитектура очень красиво и удобно помещается в трехмерный массив и обрабатывается вложенными циклами что мне очень нравиться 😄
Посмотреть и послушать про нейронные сети также можно на видео:
the_video
Адрес биткоин кошелька для поддержки блога - bc1qlhrmmkh77x2lzhqe4lt9qwkglswj64tsqt2l5g
Также поддержать можно в телеграмм боте https://t.me/electe_bot