Фоновые процессы - Arduino Mega и SeeedStudio МОГУТ защищать

Я пытаюсь соединить Arduino Mega 2560 с системой из четырех черных контроллеров двигателя Jaguar, подключенных в CAN. Для этого я использую защитный экран от SeeedStudios.

При настройке Jaguars в режиме CAN необходимо каждые 100 мс отправлять в сеть сообщение, чтобы ссылка оставалась активной. Тем не менее, я также получаю вход с последовательного на другой Arduino, а также посылаю другие команды Ягуарам, но не достаточно регулярно, чтобы специально тайм-аут.

Можно ли отправить сообщение ссылки асинхронно в фоновом режиме, пока я выполняю другой код? Я посмотрел на таймеры и прерывания, однако я не уверен, что это действительно решит проблему, учитывая, что у меня есть другие процессы, которые занимают более 100 мс для завершения.

Вот мое заявление цикла:

loop() {
  CAN.sendMsgBuf(HEARTBEAT,1,0,volModeEnable); //HEARTBEAT keeps CAN link active
  setVoltage(3,.5); //Sets voltage of Motor by percent
  setVoltage(4,.5);
  setVoltage(6,.5);
  setVoltage(8,.5);
  //GrabFromSerial(); Takes longer than 100ms
  //Оператор управления для дополнительных команд идет сюда... (также необходимо быть > 100 мс)
}

, 👍2

Обсуждение

Просто любопытно, почему вам требуется более 100 мс, чтобы прочитать последовательный порт?, @Eric E

Я использую эту библиотеку: https://github.com/madsci1016/Arduino-EasyTransfer чтобы избавить меня от необходимости писать свой собственный последовательный протокол. Однако я не всегда могу гарантировать, что пришло время выполнить его из-за других сроков ардуино., @Lord Fahrenheit

Я не заглядывал в библиотеку, но, возможно, было бы проще написать свой собственный протокол. Затем вы можете использовать такие методы, как serial.available (), которые сообщат вам, когда данные будут готовы к приему, не блокируя выполнение вашей программы, @Eric E


1 ответ


1

Я вижу несколько вариантов:

  1. Измените свой код, чтобы добиться меньших задержек при выполнении других функций
  2. Используйте прерывания на заданной частоте для запуска отправки (и, возможно, контакты триггера автоматической передачи, см. Таблицу данных MCP2515, в зависимости от использования контактов и схемы вашего конкретного экрана).
  3. Используйте базовый планировщик/ОСРВ

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

Я не уверен на 100%, что библиотека CAN будет хорошо работать в контексте прерывания.

,