Вы хотите использовать USB для связи с компьютером. Если у вас есть несколько микроконтроллеров, вы, вероятно, подключите только один из микроконтроллеров непосредственно к компьютеру. Другие микроконтроллеры должны будут получать свои команды от основного микроконтроллера.
Коммуникация, которую вы выберете, будет зависеть от ряда факторов:
- требуемая пропускная способность (мы предполагаем, что вы используете их на 16 МГц)
- сложность (проводка и кодирование)
- двунаправленный или мастер-раб
Почти все опции имеют встроенную поддержку микроконтроллера AVR. Нет варианта, который вы могли бы разумно предпочесть встроенным, который потребовал бы дополнительного оборудования. Поскольку они имеют встроенную поддержку, сложность программного обеспечения одинакова: вы просто настраиваете порт (используя регистры), помещаете данные для передачи в другой регистр, а затем запускаете передачу, устанавливая бит в другом регистре. Все полученные данные находятся в другом регистре, и прерывание инициируется, чтобы вы могли обработать его. Какой бы вариант вы ни выбрали, единственным отличием является изменение местоположения регистров и некоторые изменения в регистрах конфигурации.
Цикл USART имеет следующие особенности:
- Максимальная скорость передачи CLK / 16 = 1 МГц (при тактовой частоте 16 МГц), что составляет скорость передачи около 90 КБ / с.
- полностью двунаправленная связь (без указания главного или подчиненного)
- требуются отдельные провода между каждой парой микроконтроллеров - Atmega32u4 изначально поддерживает два порта USART, ограничивая количество микроконтроллеров, которые вы можете подключить в сети на практике (иначе вы в конечном итоге получите длинную строку микроконтроллеров - т.е. подключенных в связанном списке манера)
Примечание: это также то, что вы использовали бы для связи RS232, за исключением того, что для RS232 требуется 10 В, для получения этих уровней напряжения требуется драйвер. Для связи между микроконтроллерами это бесполезно (изменяются только уровни напряжения).
RS485:
- По сути, вы используете порт USART в другом режиме - пропускной способности нет, и это может лишь немного упростить проводку, но также усложняет ее. Это не рекомендуется.
Двухпроводной интерфейс:
Это также называется I2C. Это означает, что все устройства имеют одни и те же два провода.
Вам нужен подтягивающий резистор на обоих проводах
Он медленный (поскольку нагрузочные резисторы ограничены по величине, и емкость увеличивается по мере увеличения количества устройств и увеличения длины провода). Для этого микроконтроллера AVR скорость составляет до 400 кГц - медленнее, чем USART (но эта скорость зависит от ограничения вашей емкости). Причина в том, что, хотя устройство управляет проводом передачи данных на низком уровне, обратный переход достигается путем повторного всплытия провода (нагрузочный резистор).
Это даже медленнее, если учесть, что ВСЕ коммуникации имеют одинаковую ограниченную пропускную способность. Поскольку все коммуникации имеют одинаковую ограниченную пропускную способность, могут возникнуть задержки в связи, когда данные должны ждать, пока сеть не будет свободна, прежде чем ее можно будет отправить. Если другие данные постоянно отправляются, они также могут заблокировать отправку данных.
Он полагается на протокол «ведущий-ведомый», где ведущий обращается к ведомому, затем отправляет команду / запрос, а затем подчиненный отвечает. Только одно устройство может обмениваться данными одновременно, поэтому ведомое устройство должно ждать завершения работы мастера.
Любое устройство может выступать как ведущим, так и / или подчиненным, что делает его довольно гибким.
SPI
Это то, что я бы рекомендовал / использовал для общего общения между микроконтроллерами.
Это высокая скорость - до CLK / 2 = 8 МГц (для CLK на 16 МГц), что делает его самым быстрым методом. Это возможно благодаря отдельному проводу, предназначенному исключительно для часов.
MOSI, данные MISO и провода синхронизации SCK используются во всей сети, что означает более простую разводку.
Это формат ведущий-ведомый, но любое устройство может быть ведущим и / или ведомым. Однако из-за сложностей выбора ведомого для общей проводки (внутри сети) ее следует использовать только иерархическим образом (в отличие от двухпроводного интерфейса). IE. если вы организуете все устройства в древовидную структуру, устройство должно быть главным только для его дочерних элементов и только ведомым для его родительского элемента. Это означает, что в подчиненном режиме устройство всегда будет иметь один и тот же мастер. Кроме того, чтобы сделать это правильно, вам нужно добавить резисторы в MISO / MOSI / SCK к ведущему ведущему устройству, чтобы, если устройство обменивалось данными в нисходящем направлении (когда не выбрано в качестве ведомого), связь не влияла на связь в других частях сеть (обратите внимание, что количество уровней, которые вы можете сделать с помощью резисторов, ограничено, см. ниже для лучшего решения с использованием обоих портов SPI).
Микроконтроллер AVR может автоматически отключать сигнал MOSI, когда он выбран в качестве ведомого, и переключаться в режим ведомого (если он ведущий).
Даже если для этого может потребоваться иерархическая сеть, большинство сетей может быть организовано в виде дерева, поэтому это обычно не является важным ограничением.
Вышесказанное можно немного ослабить, поскольку каждый микроконтроллер AVR поддерживает два отдельных порта SPI, поэтому каждое устройство может иметь разные позиции в двух разных сетях.
Сказав это, если вам нужно много уровней в вашем дереве / иерархии (более 2), вышеупомянутое решение с использованием резисторов становится слишком сложным для работы. В этом случае вы должны изменить сеть SPI между каждым уровнем дерева. Это означает, что каждое устройство будет подключаться к своим дочерним элементам в одной сети SPI, а его родительскому элементу - в другой сети SPI. Хотя это означает, что у вас есть только одно дерево соединений, преимущество заключается в том, что устройство может обмениваться данными как с одним из своих дочерних элементов, так и с его родительским, и у вас нет резисторов (всегда трудно выбрать правильные значения). ,
Поскольку он имеет отдельные провода MOSI и MISO, и ведущий, и ведомый могут обмениваться данными одновременно, что дает потенциальный коэффициент увеличения скорости в два раза. Для выбора ведомого требуется дополнительный вывод для каждого дополнительного ведомого, но это не является большой нагрузкой, даже для 10 различных ведомых устройств требуется всего 10 дополнительных выводов, которые можно легко разместить на типичном микроконтроллере AVR.
CAN не поддерживается указанным микроконтроллером AVR. Поскольку есть и другие хорошие варианты, в любом случае это, вероятно, не важно.
Рекомендуется использовать SPI , потому что он быстрый, проводка не слишком сложная, и для нее не нужны непостоянные подтягивающие резисторы. В редком случае, когда SPI не в полной мере отвечает вашим потребностям (возможно, в более сложных сетях), вы можете использовать несколько вариантов (например, использовать оба порта SPI вместе с двухпроводным интерфейсом, а также соединять некоторые микроконтроллеры). используя цикл USART!)
В вашем случае использование SPI означает, что, естественно, микроконтроллер с USB-подключением к компьютеру может быть ведущим, и он может просто передавать соответствующие команды с компьютера на каждое подчиненное устройство. Он также может читать обновления / измерения от каждого ведомого устройства и отправлять их на компьютер.
При 8 МГц и длине провода 0,5 м, я не думаю, что это станет проблемой. Но если это так, постарайтесь быть осторожнее с емкостным сопротивлением (держите заземление и сигнальные провода слишком близко, а также с осторожностью при подключении между различными проводниками), а также с прекращением сигнала. В том маловероятном случае, если это останется проблемой, вы можете уменьшить тактовую частоту, но я не думаю, что это необходимо.