• Регистрация
BadBishopGoodRook
BadBishopGoodRook0.00
н/д
  • Написать
  • Подписаться

Симулинк + Ардуино в реальном времени

Добрый день, друзья! Столкнулся с проблемой: при подключении Ардуино Мега 2560 к Симулинк и выкатывании простейшего кода, который читает аналоговый сигнал с двух потенциометров, время работы программы заметно отстаёт (читайте "отличается", потому что меняется при изменении частоты дискретизации) от реального. 


Если напряжение снимается с частотой 1000 Гц, секунда симуляции длится около 13-14 секунд реального времени, при этом примерно за секунду реального времени снимается около 300 сэмплов.

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

Не нашёл в настройках ничего, что позволяло бы использовать время с Ардуино, хотя, по-моему, такая настройка была чуть ли не в панели управления симуляции в ранних версиях Матлаб. У меня R2019b. Подскажите, пожалуйста, показывает ли то, как отображается сигнал на компьютере, реальное положение дел, или я могу со спокойной душой выкатывать то, что должно работать с частотой 1 кГц?

Теги

    11.08.2020

    Лучший ответ

    • kurguz+178.35
      13.08.2020 12:00

      Многое зависит от того, каким образом вы подключаете плату к Simulink, и в каком режиме запускаете работу модели. Что значит "выкатывание простейшего кода"? Вы писали его сами или сгенерировали?

      Контроллеры на Arduino стоят не особенно мощные, поэтому стоит посмотреть на настройки железа. Конверсия ADC занимает 13 тактов, и в общем случае даже при 10-битном АЦП чтение двух напряжений на 1 кГц оставит вам не большой простор на размещение алгоритма. Дополнительно процессорное время ест передача данных в Simulink, здесь влияет bauldrate и объем данных.

      Если вы генерировали прошивку из модели Simulink, то можно пройтись профайлером и посмотреть, где самые большие потери производительности: https://www.mathworks.com/help/releases/R2020a/ecoder/ug/configuring-code-execution-profiling.html 

    Ответы

    • kurguz
      kurguz+178.35
      13.08.2020 14:14

      Многое зависит от того, каким образом вы подключаете плату к Simulink, и в каком режиме запускаете работу модели. Что значит "выкатывание простейшего кода"? Вы писали его сами или сгенерировали?

      Контроллеры на Arduino стоят не особенно мощные, поэтому стоит посмотреть на настройки железа. Конверсия ADC занимает 13 тактов, и в общем случае даже при 10-битном АЦП чтение двух напряжений на 1 кГц оставит вам не большой простор на размещение алгоритма. Дополнительно процессорное время ест передача данных в Simulink, здесь влияет bauldrate и объем данных.

      Если вы генерировали прошивку из модели Simulink, то можно пройтись профайлером и посмотреть, где самые большие потери производительности: https://www.mathworks.com/help/releases/R2020a/ecoder/ug/configuring-code-execution-profiling.html 

      • BadBishopGoodRook
        BadBishopGoodRook0.00
        14.08.2020 08:32

        Спасибо за ответ! Я  думаю, я разобрался, в чём дело: в данной верси Matlab есть вкладка Hardware, в случае, если подклюено внешнее устройство, то режим External запускается оттуда. В этом случае считывание данных происходит в реальном времени.

        Вы правы, что настройки железа играют большую роль, с этим я уже тоже столкнулся, когда моя мега 2560 не захотела работать с МРС контроллером. В этом случае мне помогло увеличение памяти, используя Due. К тому же, я думаю, то, что результаты работы программы выводятся обратно на экран компьютера, а не используются только внутри платы для вывода на какие-то пины, также уменьшает производительность