Фоновые процессы - 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 мс)
}
@Lord Fahrenheit, 👍2
Обсуждение1 ответ
Я вижу несколько вариантов:
- Измените свой код, чтобы добиться меньших задержек при выполнении других функций
- Используйте прерывания на заданной частоте для запуска отправки (и, возможно, контакты триггера автоматической передачи, см. Таблицу данных MCP2515, в зависимости от использования контактов и схемы вашего конкретного экрана).
- Используйте базовый планировщик/ОСРВ
Трудно сказать, что происходит без остальной части вашего кода, если это хорошая идея-попытаться выполнить более быстрые функции.
Я не уверен на 100%, что библиотека CAN будет хорошо работать в контексте прерывания.
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- устаревшее преобразование из строковой константы в 'char*'
Просто любопытно, почему вам требуется более 100 мс, чтобы прочитать последовательный порт?, @Eric E
Я использую эту библиотеку: https://github.com/madsci1016/Arduino-EasyTransfer чтобы избавить меня от необходимости писать свой собственный последовательный протокол. Однако я не всегда могу гарантировать, что пришло время выполнить его из-за других сроков ардуино., @Lord Fahrenheit
Я не заглядывал в библиотеку, но, возможно, было бы проще написать свой собственный протокол. Затем вы можете использовать такие методы, как serial.available (), которые сообщат вам, когда данные будут готовы к приему, не блокируя выполнение вашей программы, @Eric E