Перейти к содержимому

Урок 9 из 18 · Модуль 3. CAN: физика шины и арбитраж

17 сентября 2026
Пилоту БПЛА | Технику БПЛА | Хобби

Протоколы в БАС: полный курс · Урок 9 из 18 · Модуль 3. Шины датчиков: I²C, SPI, CAN

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

Тест за десять секунд: на обесточенной шине между CAN_H и CAN_L должно быть 60 Ом — два терминатора по 120 Ом в параллель. Показания 120 Ом означают потерю одного терминатора, 40 Ом — лишний терминатор.

Содержание

1. Цели урока

После этого урока вы сможете:

  • объяснять, зачем нужны терминаторы и почему именно 120 Ом;
  • объяснять, как дифференциальная пара гасит помехи;
  • различать доминантный и рецессивный биты и читать диаграмму CAN-сигнала;
  • объяснять арбитраж: почему CAN обходится без мастера;
  • называть типовые устройства на CAN в БпЛА и диагностировать неисправности шины.
↑ К оглавлению

2. Физика шины и арбитраж

CAN (Controller Area Network) разработан компанией Bosch в 1983 году и официально представлен в 1986-м — изначально для автомобильной электроники, где десятки ЭБУ должны обмениваться данными по одной шине в условиях сильных электромагнитных помех от двигателя и зажигания. В мире БпЛА поверх CAN работает протокол DroneCAN (бывший UAVCAN) — открытый стандарт, поддерживаемый ArduPilot и PX4. Встречается на больших коптерах, VTOL, агродронах и аппаратах промышленного класса: по одной витой паре подключают ESC, GPS, датчик воздушной скорости, модуль питания и сервы.

Ключевые особенности CAN, которые делают его незаменимым на крупных БпЛА:

  • помехоустойчивая дифференциальная пара — сигнал передаётся не как абсолютное напряжение, а как разность между двумя проводами;
  • длина шины до 40 м на скорости 1 Мбит/с, до 1000 м на 50 кбит/с;
  • равноправные узлы — нет мастера, любой узел может начать передачу;
  • встроенная диагностика ошибок — CRC, подсчёт ошибок, автоматический перевод «сбойного» узла в пассивный режим.

Физика шины: два провода и два резистора

Схема подключения CAN

CAN-шина состоит из двух проводов — CAN_H (High) и CAN_L (Low) — и двух терминирующих резисторов по 120 Ом, установленных на каждом конце шины.

Зачем витая пара. Провода CAN_H и CAN_L скручены вместе. Любая внешняя помеха (от электродвигателей, силовых проводов, радиопередатчика) наводит одинаковое напряжение на оба провода одновременно. Приёмник CAN смотрит не на абсолютный уровень каждого провода, а на разность CAN_H − CAN_L. Помеха, одинаково добавленная к обоим проводам, в разности исчезает — это и есть принцип дифференциальной передачи.

Зачем терминаторы по 120 Ом. Шина — это длинная линия передачи. Если её конец «не нагружен», электромагнитная волна отражается обратно и создаёт помехи, искажающие сигнал. Терминирующий резистор поглощает волну: его сопротивление подобрано равным волновому сопротивлению витой пары (~120 Ом). Ставят два резистора — по одному на каждом конце шины.

Почему 60 Ом при измерении. Два резистора по 120 Ом включены параллельно относительно точек CAN_H и CAN_L:

technobee_0816_11dc4.jpg

Внимание: Измерять сопротивление шины нужно только при отключённом питании. При включённом питании мультиметр покажет некорректные значения из-за напряжения на шине.

Доминантный и рецессивный бит

В CAN существует два логических состояния шины — рецессивное (recessive) и доминантное (dominant). Это ключевое понятие: именно на нём строится и арбитраж, и диагностика ошибок.

СостояниеЛогикаCAN_HCAN_LРазность CAN_H − CAN_LКто формирует
Рецессивное 1 ~2,5 В ~2,5 В ~0 В никто не «тянет» шину — оба провода подтянуты терминаторами к 2,5 В
Доминантное 0 ~3,5 В ~1,5 В ~2 В передатчик активно «раздвигает» провода: CAN_H тянет вверх, CAN_L — вниз

Важнейшее свойство: если хотя бы один узел на шине выставляет доминантный бит, шина переходит в доминантное состояние — независимо от того, что выставляют остальные узлы. Рецессивный бит «подавляется» доминантным. Это называется «монтажное И» (wired-AND) — точно так же, как open-drain в I²C.

Как читать диаграмму CAN-сигнала. На осциллограмме всегда показывают три линии: CAN_H, CAN_L и их разность (дифференциальный сигнал). Приёмник смотрит только на разность. Запомните главное: при доминантном бите шина «раздвигается» — CAN_H идёт вверх, CAN_L вниз. При рецессивном — оба провода стоят на одном уровне 2,5 В.

technobee_0817_52153.jpg

Как помеха от мотора исчезает в разности. Предположим, помеха добавляет +0,5 В к обоим проводам в момент доминантного бита:

technobee_0818_280da.jpg

Приёмник читает только разность — поэтому CAN работает в сантиметрах от силовых проводов и моторов, где одиночный провод PWM уже даёт сбои.

Структура кадра CAN

Каждое сообщение на шине передаётся в виде кадра данных (Data Frame). Кадр состоит из нескольких полей; техник должен понимать назначение каждого — особенно при работе с логическим анализатором.

technobee_0819_fbcae.jpg

ПолеРазмерНазначение
SOF (Start of Frame) 1 бит всегда доминантный бит (0) — сигнализирует всем узлам о начале кадра; одновременно синхронизирует тактовые генераторы узлов
ID (Identifier) 11 бит (CAN 2.0A)
29 бит (CAN 2.0B Extended)
идентификатор сообщения. Чем меньше число — тем выше приоритет. В DroneCAN ID кодирует тип данных и адрес узла
RTR (Remote Transmission Request) 1 бит 0 — кадр данных (передаём данные); 1 — запрос на передачу (просим другой узел прислать данные). В DroneCAN RTR не используется
IDE (Identifier Extension) 1 бит 0 — стандартный 11-битный ID; 1 — расширенный 29-битный ID (CAN 2.0B)
DLC (Data Length Code) 4 бита количество байт данных в кадре: от 0 до 8
DATA 0–8 байт полезные данные: показания датчика, команда ESC, телеметрия GPS и т.д.
CRC 15 бит + 1 делимитер контрольная сумма. Все узлы независимо считают CRC принятого кадра и сравнивают с переданным — ошибки данных обнаруживаются автоматически
ACK 1 бит + 1 делимитер подтверждение. Передатчик выставляет рецессивный бит (1); любой принявший кадр без ошибок узел перебивает его доминантным (0). Если ACK остался рецессивным — никто не принял кадр
EOF (End of Frame) 7 бит семь рецессивных бит — признак конца кадра; после этого шина считается свободной

Пример реального кадра в логическом анализаторе (DroneCAN, ESC-телеметрия, ID = 0x110):

technobee_0820_cd514.jpg

Арбитраж — почему все узлы равны

У CAN нет мастера: любой узел может начать передачу, когда шина свободна. «Свободная шина» — это когда на обоих проводах рецессивный уровень (разность ≈ 0 В). Если два узла начали передачу одновременно, включается арбитраж без разрушения кадра.

Принцип арбитража. Каждый передающий узел одновременно читает шину и сравнивает то, что выставил, с тем, что видит. Если узел выставил рецессивный бит (1), но шина показывает доминантный (0) — значит, другой узел передаёт доминантный бит и имеет более высокий приоритет. «Проигравший» узел немедленно замолкает и ждёт следующей свободной шины. «Победитель» продолжает передачу, даже не зная о конфликте.

Рассмотрим пример: GPS-модуль (ID = 0x100) и ESC (ID = 0x110) начали передачу одновременно:

technobee_0821_f10d3.jpg

Почему выигрывает меньший ID. Доминантный бит (0) всегда «перебивает» рецессивный (1). Меньший числовой ID содержит больше нулей в старших битах — именно там происходит разрешение конфликта. Поэтому ID 0x000 имеет наивысший приоритет, ID 0x7FF — наименьший.

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

Что такое CAN FD: Классический CAN ограничен 8 байтами данных и 1 Мбит/с. CAN FD (Flexible Data-rate), принятый в 2012 году, увеличивает полезную нагрузку до 64 байт и скорость фазы данных до 5–8 Мбит/с; скорость фазы арбитража при этом остаётся равной номинальному битрейту шины (обычно те же 1 Мбит/с). ArduPilot умеет работать с CAN FD на поддерживающих его платах, но сам DroneCAN по-прежнему использует классический CAN.

DroneCAN в БпЛА

DroneCAN — прикладной протокол поверх CAN. Каждый узел получает Node ID — уникальный адрес от 1 до 127 (0 используется узлом без ID во время динамического назначения, а 126 и 127 зарезервированы для отладочных инструментов; в DroneCAN GUI Tool узел по умолчанию получает ID 127). Node ID назначается либо вручную (через конфигуратор устройства или Mission Planner), либо автоматически (dynamic node ID allocation). Полётный контроллер при этом является одним из узлов на равных правах — не «мастером» шины.

УстройствоПримерыЧто передаёт по CAN
ESC / регуляторы Zubax Myxa, Holybro Kotleta20, Hobbywing DroneCAN X9/X6, T-Motor Kolibri, CUAV, VESC с CAN команды газа (от ФК), обратно — RPM, ток, напряжение, температура
GPS / GNSS Zubax GNSS 2, Holybro DroneCAN M9N, Here3 координаты, скорость, время, HDOP; компас — по тому же CAN-кабелю
Датчик воздушной скорости Matek ASPD-CAN (DroneCAN), AUAV Pitot Probe, Holybro DroneCAN Airspeed. Аналоговый Matek ASPD-4525 подключается по I²C, а не по CAN дифференциальное давление → воздушная скорость
Модуль питания / мониторинг АКБ Holybro DroneCAN Power Module, CUAV CAN PMU, Zubax Power. Zubax Babel — это USB-CAN адаптер для диагностики шины, а не модуль питания напряжение, ток, заряд батареи, состояние ячеек
Сервоприводы Himark CAN servo, Volz DA 22 команды положения (от ФК), обратно — фактическое положение, нагрузка
Световое оборудование DroneCAN LED-модули команды цвета и яркости навигационных огней

Почему CAN, а не PWM/UART для ESC на большом дроне:

  • обратная связь — ESC сообщает реальные RPM, ток и температуру каждого мотора; при PWM полётный контроллер «слепой»;
  • один кабель на все ESC — витая пара CAN_H/CAN_L проходит через весь аппарат вместо пучка PWM-проводов к каждому регулятору;
  • диагностика отказов — если ESC перестал отвечать на шине, ФК немедленно это видит и может среагировать;
  • помехоустойчивость — рядом с силовыми проводами дифференциальная пара значительно надёжнее одиночных сигнальных линий PWM.

Типовые неисправности и диагностика

СимптомВероятная причинаСпособ диагностики и устранения
Ни один CAN-узел не обнаруживается в ФК оба терминатора отсутствуют или обрыв шины замерить сопротивление CAN_H–CAN_L при отключённом питании: должно быть 60 Ом; проверить целостность CAN_H и CAN_L мультиметром
Узлы обнаруживаются, но периодически пропадают один терминатор отсутствует (120 Ом вместо 60 Ом), длинная шина, плохой контакт проверить наличие обоих терминаторов на концах шины; укоротить или переобжать кабель; проверить качество разъёмов
Шина «перегружена» (bus-off у узла) неисправный узел генерирует ошибки; лишний терминатор; CAN_H и CAN_L перепутаны замерить сопротивление (40 Ом — лишний терминатор); отключать узлы по одному до исчезновения ошибок; проверить полярность CAN_H/CAN_L
Конфликт Node ID двум устройствам назначен одинаковый Node ID в ArduPilot: Mission Planner → UAVCAN → просмотр узлов; назначить уникальные ID каждому устройству
ESC не реагирует на команды не назначен уникальный Node ID ESC; неверный номер мотора (ESC index / ThrottleID) в конфигураторе ESC; неверная маска ESC в параметрах ФК проверить параметр CAN_D1_UC_ESC_BM (маска ESC), Node ID и номер мотора в конфигураторе ESC
GPS виден на шине, но данные не поступают в ФК неверный тип GPS в параметрах установить GPS1_TYPE = 9 (DroneCAN) в ArduPilot (в версиях 4.5 и старше параметр назывался GPS_TYPE); проверить Node ID GPS-модуля

💻 Для программиста

В отличие от I²C и SPI, CAN-контроллер не работает в режиме «байт за байтом» — он оперирует готовыми кадрами. Прикладной код помещает данные в структуру кадра (ID + DLC + данные), передаёт её CAN-периферии микроконтроллера, а та самостоятельно проводит арбитраж, считает CRC и добавляет ACK. При работе с DroneCAN используют библиотеку libcanard (C99, минимальный footprint) или pyuavcan (Python, для наземных инструментов). Для диагностики шины на ПК удобен адаптер SLCAN (Serial-Line CAN) — недорогой USB-CAN переходник, работающий с can-utils в Linux или с DroneCAN GUI Tool.

↑ К оглавлению

3. Чек-лист самопроверки

Урок освоен, если каждый пункт выполнен на практике:

  • Замерил 60 Ом на обесточенной исправной шине мультиметром
  • Могу объяснить, почему помеха от мотора не влияет на дифференциальный сигнал CAN
  • Объясняю разницу между доминантным и рецессивным битом и почему доминантный «побеждает»
  • Понимаю, почему при конфликте выигрывает кадр с меньшим ID
  • Знаю, какие устройства на борту крупного БпЛА подключаются по CAN и зачем
Результат: все пункты выполнены — переходите к следующему уроку.
↑ К оглавлению

4. Что дальше

  • Предыдущий урок: Урок 8. SPI: скоростной конвейер
  • Следующий урок: Урок 10. DroneCAN на практике: устройства и настройка в ArduPilot
  • Полный перечень тем — в статье «Содержание курса».
↑ К оглавлению
118