Оглавление:

Протокол CAN - да, мы можем !: 24 шага
Протокол CAN - да, мы можем !: 24 шага

Видео: Протокол CAN - да, мы можем !: 24 шага

Видео: Протокол CAN - да, мы можем !: 24 шага
Видео: MCP2515, контроллер CAN шины с интерфейсом SPI 2024, Июль
Anonim
Image
Image
Используемые ресурсы
Используемые ресурсы

Еще одна тема, которую недавно предложили подписчики моего канала на YouTube, - это протокол CAN (сеть контроллеров), на котором мы и сосредоточимся сегодня. Важно объяснить, что CAN - это протокол одновременной последовательной связи. Это означает, что синхронизация между модулями, подключенными к сети, выполняется относительно начала каждого сообщения, отправляемого на шину. Мы начнем с знакомства с основными концепциями протокола CAN и выполним простую сборку с двумя ESP32.

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

Шаг 1. Используемые ресурсы

  • Два модуля ESP WROOM 32 NodeMcu
  • Два CAN-трансивера от WaveShare
  • Перемычки для соединений
  • Логический анализатор для захвата
  • Три USB-кабеля для ESP и анализатора
  • 10 метров витой пары в качестве шины

Шаг 2: CAN (сеть контроллеров)

CAN (сеть контроллеров)
CAN (сеть контроллеров)
  • Он был разработан Robert Bosch GmbH в 1980-х годах для обслуживания автомобильной промышленности.
  • С годами он получил широкое распространение благодаря своей надежности и гибкости в реализации. Он используется с военной техникой, сельскохозяйственной техникой, промышленной и строительной автоматизацией, робототехникой и медицинским оборудованием.

Шаг 3: CAN - функции

CAN - Особенности
CAN - Особенности
CAN - Особенности
CAN - Особенности
  • Двухпроводная последовательная связь
  • Максимум 8 байтов полезной информации на кадр, с возможной фрагментацией
  • Адрес направлен к сообщению, а не к узлу
  • Назначение приоритета сообщениям и ретрансляция сообщений "на удержании"
  • Эффективная способность обнаруживать и сигнализировать об ошибках
  • Возможность работы с несколькими мастерами (все узлы могут запрашивать доступ к шине)
  • Возможность многоадресной рассылки (одно сообщение для нескольких получателей одновременно)
  • Скорость передачи до 1 Мбит / с на 40-метровой шине (снижение скорости с увеличением длины шины)
  • Гибкость настройки и внедрения новых узлов (до 120 узлов на шину)
  • Стандартное оборудование, низкая стоимость и хорошая доступность
  • Регулируемый протокол: ISO 11898

Шаг 4: Используемая схема

Используемая цепь
Используемая цепь

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

Шаг 5: Напряжения в линии передачи (дифференциальное обнаружение)

Напряжения в линии передачи (дифференциальное обнаружение)
Напряжения в линии передачи (дифференциальное обнаружение)

В CAN доминирующий бит - ноль.

Обнаружение дифференциальной линии снижает чувствительность к шуму (EFI)

Шаг 6: стандарты CAN и формат фреймов

Стандарты CAN и формат кадров
Стандарты CAN и формат кадров

Стандартный формат с 11-битным идентификатором

Шаг 7: стандарты CAN и формат фреймов

Стандарты CAN и формат кадров
Стандарты CAN и формат кадров

Расширенный формат с 29-битным идентификатором

Шаг 8: стандарты CAN и формат фреймов

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

Шаг 9: Четыре типа фреймов (фреймов)

Четыре типа фреймов (фреймов)
Четыре типа фреймов (фреймов)

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

Четыре типа оправ (рамок)

Передача и прием данных в CAN основаны на четырех типах кадров. Типы кадров будут идентифицироваться вариациями в управляющих битах или даже изменениями в правилах записи кадров для каждого случая.

  • Кадр данных: содержит данные передатчика для приемника (ов).
  • Удаленный фрейм: это запрос данных от одного из узлов.
  • Кадр ошибки: это кадр, отправленный любым из узлов при обнаружении ошибки в шине, и может быть обнаружен всеми узлами.
  • Кадр перегрузки: Служит для задержки трафика на шине из-за перегрузки или задержки данных на одном или нескольких узлах.

Шаг 10: Схема - Детали подключений

Схема - Подробная информация о подключениях
Схема - Подробная информация о подключениях

Шаг 11: Схема - Сбор данных

Схема - Сбор данных
Схема - Сбор данных

Длины волн, полученные для стандартной CAN с 11-битным идентификатором

Шаг 12: Схема - Сбор данных

Схема - Сбор данных
Схема - Сбор данных

Длины волн, полученные для расширенной CAN с 29-битным идентификатором

Шаг 13: Схема - Сбор данных

Схема - Сбор данных
Схема - Сбор данных

Данные, полученные логическим анализатором

Шаг 14: Библиотека Arduino - CAN

Библиотека Arduino - CAN
Библиотека Arduino - CAN

Я показываю здесь два варианта установки библиотеки драйверов CAN.

Менеджер библиотеки Arduino IDE

Шаг 15: Github

Github
Github

github.com/sandeepmistry/arduino-CAN

Шаг 16: Исходный код передатчика

Исходный код: включает и настройку ()

Мы включим библиотеку CAN, запустим последовательный порт для отладки и запустим шину CAN со скоростью 500 кбит / с.

#include // Включить библиотеку CAN void setup () {Serial.begin (9600); // инициируем последовательную отладку while (! Serial); Serial.println («CAN трансмиссии»); // Начало CAN или CAN 500 кбит / с if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // когда нет возможности инициировать управление while (1); }}

Шаг 17: Исходный код: Loop (), отправка стандартного пакета CAN 2.0

По стандартной CAN 2.0 отправляем посылку. 11-битный идентификатор идентифицирует сообщение. Блок данных должен иметь длину до 8 байтов. Он запускает пакет с идентификатором 18 в шестнадцатеричном формате. Он упаковывает 5 байтов и закрывает функцию.

void loop () {// Использование или блокировка CAN 2.0 // Envia um pacote: o id tem 11 bit e Identifica a mensagem (Prioridade, evento) // o bloco de dados deve possible até 8 bytes Serial.println ("Enviando pacote … »); CAN.beginPacket (0x12); // id 18 в шестнадцатеричном формате CAN.write ('h'); // 1 байт CAN.write ('e'); // 2 байта CAN.write ('l'); // 3º байта CAN.write ('l'); // 4 байта CAN.write ('o'); // 5º байт CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); задержка (1000);

Шаг 18: Исходный код: Loop (), отправка расширенного пакета CAN 2.0

На этом этапе идентификатор состоит из 29 бит. Он начинает отправлять 24 бита идентификатора, еще раз упаковывает 5 байтов и завершает работу.

// Usando CAN 2.0 Estendido // Envia um pacote: идентификатор 29 бит и идентификатор сообщения (Prioridade, evento) // блок данных, который может содержать 8 байтов Serial.println ("Enviando pacote estendido…"); CAN.beginExtendedPacket (0xabcdef); // десятичный идентификатор 11259375 (abcdef em hexa) = 24 бита preenchidos até aqui CAN.write ('w'); // 1 байт CAN.write ('o'); // 2 байта CAN.write ('r'); // 3º байта CAN.write ('l'); // 4 байта CAN.write ('d'); // 5º байт CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); задержка (1000); }

Шаг 19: Исходный код получателя

Исходный код: включает и настройку ()

Мы снова включим библиотеку CAN, запустим последовательный порт для отладки и запустим шину CAN со скоростью 500 кбит / с. Если произойдет ошибка, эта ошибка будет напечатана.

#include // Включить библиотеку CAN void setup () {Serial.begin (9600); // инициируем последовательную отладку while (! Serial); Serial.println ("Receptor CAN"); // Начало CAN или CAN 500 кбит / с if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // когда нет возможности инициировать управление while (1); }}

Шаг 20: Исходный код: Loop (), получение пакета и проверка формата

Мы попытались проверить размер полученного пакета. Метод CAN.parsePacket () показывает мне размер этого пакета. Так что, если у нас есть пакет, мы проверим, расширен он или нет.

void loop () {// Проверка или подтверждение приема int packetSize = CAN.parsePacket (); if (packetSize) {// Se temos um pacote Serial.println ("Recebido pacote."); if (CAN.packetExtended ()) {// проверка подлинности пакета Serial.println ("Estendido"); }

Шаг 21: Источник: Loop (), проверяет, является ли это удаленным пакетом

Здесь мы проверяем, является ли полученный пакет запросом данных. В этом случае данных нет.

if (CAN.packetRtr ()) {// Подтверждение наличия пакета в удаленном пакете (Requisição de dados), neste caso não ha dados Serial.print ("RTR"); }

Шаг 22: Исходный код: Loop (), длина данных запрошена или получена

Если полученный пакет является запросом, мы указываем запрошенную длину. Затем мы получаем код длины данных (DLC), который указывает длину данных. Напоследок указываем полученную длину.

Serial.print ("Pacote com id 0x"); Serial.print (CAN.packetId (), HEX); if (CAN.packetRtr ()) {// если требуется, указатели или требования для Serial.print ("e requsitou o comprimento"); Serial.println (CAN.packetDlc ()); // объект DLC (код длины данных, указатель или дополнение к данным)} else {Serial.print ("e comprimento"); // содержит индикаторы полученного значения Serial.println (packetSize);

Шаг 23: Исходный код: Loop (), если данные получены, они печатаются

Мы печатаем (на последовательном мониторе) данные, но только если полученный пакет не является запросом.

// Введите данные о том, что нужно сделать, чтобы получить доступ без необходимости использования while (CAN.available ()) {Serial.print ((char) CAN.read ()); } Serial.println (); } Serial.println (); }}

Шаг 24: Загрузите файлы

PDF

Я НЕТ

Рекомендуемые: