Дата публикации

Автор статьи: Редакция Clex.kz

2

CAN-шина в проектах: связь между контроллерами, датчиками и исполнительными узлами

CAN-шина используется для обмена данными между контроллерами, датчиками и исполнительными узлами в автоэлектронике, механизмах и автоматике. Разбираем CAN-модуль, SPI, терминаторы, витую пару, ошибки подключения и отличие от UART и RS-485.

Где нужна CAN-шина

CAN-шина нужна там, где несколько электронных узлов должны обмениваться данными по общей линии. Не один контроллер и один датчик, а несколько устройств: блок управления, датчики, приводы, панели, исполнительные модули.

Такая схема часто встречается в автоэлектронике, спецтехнике, робототехнике, станках, самодельных транспортных платформах, распределенной автоматике и системах, где контроллеры стоят не в одном корпусе.

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

CAN хорош не тем, что он "быстрее всего". Его смысл в другом: несколько устройств работают на одной шине, сообщения имеют идентификаторы, а обмен рассчитан на условия, где возможны помехи и длинные провода.

CAN - не замена каждому интерфейсу

CAN не нужно ставить в любой проект. Если датчик стоит рядом с платой, проще использовать I2C, SPI, UART или обычный цифровой вход.

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

Если нужно передать данные на большее расстояние между двумя или несколькими устройствами в промышленной среде, часто смотрят в сторону RS-485. Эту тему мы разбирали в статье RS-485 простыми словами: подключение, витая пара, терминаторы и типичные ошибки.

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

Как устроен обмен сообщениями

В CAN обычно не думают в формате "устройство 1 отправило байт устройству 2". Обмен строится через сообщения с идентификаторами.

Например, узел температуры отправляет сообщение с одним ID. Узел давления - с другим. Блок управления мотором - с третьим. Остальные устройства слушают шину и обрабатывают только нужные им сообщения.

Это удобно для распределенной системы. Если панель индикации хочет показывать температуру, она подписывается логикой программы на сообщение температуры. Если другой узел не использует эти данные, он просто их игнорирует.

В CAN важен порядок приоритетов. Сообщение с более высоким приоритетом получает доступ к шине раньше. Это полезно для систем, где аварийные или управляющие сообщения должны проходить быстрее обычных информационных данных.

Физическая линия CANH и CANL

На физическом уровне CAN использует две линии: CANH и CANL. Обычно их прокладывают витой парой. Сигнал передается дифференциально: приемник смотрит не на напряжение одной линии относительно земли, а на разницу между CANH и CANL.

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

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

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

Терминаторы 120 Ом

На концах CAN-линии обычно ставят терминаторы 120 Ом между CANH и CANL. Они нужны, чтобы уменьшить отражения сигнала на линии.

Важно: терминаторы ставятся не на каждом модуле, а на двух концах шины. Если в сети три, четыре или десять узлов, терминаторов все равно должно быть два - на физическом начале и физическом конце линии.

⚠️Частая ошибка - включить терминатор на каждом CAN-модуле. В результате сопротивление линии становится слишком низким, и связь начинает работать нестабильно или пропадает совсем.

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

CAN-контроллер и CAN-трансивер

В CAN-связи есть две части: контроллер и трансивер.

CAN-контроллер отвечает за формат сообщений, ID, проверку ошибок и работу протокола. CAN-трансивер работает с физическими линиями CANH и CANL.

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

Например, MCP2515 CAN-модуль SPI подключается к микроконтроллеру по SPI, а наружу дает CANH и CANL для шины. Поэтому в проекте фактически есть две связи: SPI между платой и модулем, и CAN между узлами системы.

Такой модуль часто используют с Arduino, ESP32 и другими платами, когда нужно добавить CAN в проект без разработки собственной CAN-обвязки.

Скорость обмена и длина линии

В CAN нельзя выбирать скорость отдельно для каждого устройства. Все узлы на одной шине должны работать на одной скорости. Если один модуль настроен на 500 кбит/с, а другой на 250 кбит/с, они не будут нормально понимать друг друга.

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

В самодельных проектах часто начинают с типовых скоростей: 125, 250 или 500 кбит/с. Главное - одинаковая настройка на всех узлах и нормальная физическая линия.

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

Пример структуры сообщений

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

Пример простой карты сообщений:

ID сообщенияЧто передаетКто отправляет
0x100Температура корпусаУзел датчиков
0x110Давление в системеУзел измерений
0x200Команда моторуГлавный контроллер
0x210Состояние мотораДрайвер мотора
0x300Аварийный статусЛюбой узел

Это не универсальный стандарт, а пример организации. В реальном проекте ID выбирают под свою систему.

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

CAN и автомобильная электроника

CAN часто ассоциируют с автомобилями. В машине разные блоки обмениваются данными: двигатель, коробка, ABS, приборная панель, кузовная электроника, датчики и исполнительные узлы.

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

Для обучения лучше начинать не с вмешательства в штатную проводку автомобиля, а с отдельного стенда: два микроконтроллера, два CAN-модуля, витая пара и простые сообщения. Так легче понять шину без риска для машины.

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

Пример подключения MCP2515 к Arduino

MCP2515 подключается к Arduino по SPI. Обычно используются линии SCK, MOSI, MISO, CS и INT. Питание и уровни логики нужно проверять по конкретному модулю.

Снаружи модуля находятся CANH и CANL. Эти линии идут к другим CAN-узлам. На концах шины ставятся терминаторы 120 Ом.

Упрощенная логика подключения такая:

  • Arduino соединяется с MCP2515 по SPI;
  • CANH соединяется с CANH другой платы;
  • CANL соединяется с CANL другой платы;
  • GND устройств соединяется;
  • на концах линии стоят терминаторы.

Для работы с Arduino часто используют готовые библиотеки MCP2515. Но даже правильная библиотека не поможет, если перепутаны CANH/CANL, нет общей земли, не совпадает скорость или включены лишние терминаторы.

Код теста двух узлов

Для первого запуска лучше собрать не всю систему, а два узла. Один отправляет сообщение, второй принимает и выводит его в Serial Monitor.

Такой тест показывает сразу несколько вещей: SPI с модулем работает, CAN-линия подключена, скорость совпадает, терминаторы стоят правильно, приемник видит сообщение.

Набросок логики отправителя:

sendCanMessage(0x100, temperatureBytes); delay(500);

Набросок логики приемника:

if (readCanMessage(id, data)) { Serial.print("ID: "); Serial.println(id, HEX); }

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

Типичные ошибки CAN-подключения

Ошибки CAN часто похожи друг на друга: модуль определяется по SPI, но сообщений нет. Или связь появляется на столе, а на объекте пропадает. Обычно причина в физической линии или настройках.

Частые проблемы:

  • перепутаны CANH и CANL;
  • нет общей земли между устройствами;
  • не совпадает скорость обмена;
  • нет терминаторов на концах линии;
  • терминаторы включены на каждом модуле;
  • вместо шины получилась звезда с длинными ответвлениями;
  • линия идет рядом с силовыми проводами;
  • модуль питается не тем напряжением;
  • SPI работает, а CAN-трансивер не подключен к шине;
  • в коде используются случайные ID без карты сообщений.

Проверку лучше начинать с простого: два узла, короткая витая пара, правильные терминаторы, одинаковая скорость, понятное тестовое сообщение.

Когда CAN лучше не использовать

CAN не нужен для каждого проекта. Если датчик стоит в 10 см от платы, проще подключить его напрямую. Если нужен один дисплей рядом с контроллером, подойдет SPI или I2C. Если нужно соединить два устройства простым текстовым протоколом, может хватить UART. Если нужна промышленная линия на большое расстояние с простым мастер-опросом, часто удобен RS-485.

CAN оправдан, когда есть несколько узлов, общая линия, короткие сообщения, требования к устойчивости связи и понятная карта сообщений.

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

CAN-шина в проектах: связь между контроллерами, датчиками и исполнительными узлами

Чтобы оставить комментарий, авторизируйтесь

Комментарии (0)