Чтение последовательного порта с помощью matlab fscanf () или fgetl () показывает результаты в секундах после фактического изменения значения - PullRequest
2 голосов
/ 27 июня 2019

Я использую аналоговые выводы Arduino для измерения напряжения и распечатываю его на последовательный порт с serial.print(string).Это работает, он выводит одно значение в виде xxxx.yyyy с переменной длиной, это я проверял с помощью встроенного в последовательный просмотрщик.Чтобы прочитать его, я использую Matlab с fscanf() или fgetl().Это показывает правильную вещь, aaaa.bbbb, но со странной задержкой.Когда я меняю напряжение, показания отстают на 5-10 секунд, но когда я увеличиваю напряжение с 0 до 3 до 5, в течение этого timeframe, например, 3 секунды между 3 и 5, показания также меняются.Это не так, как я изменил напряжение, но он получает эти значения, как если бы это были 2-ступенчатые входы, хотя я изменил их вручную не очень быстро.

При чтении и исследовании,Я столкнулся с тем фактом, что, возможно, BaudRate был слишком низким, поэтому я изменил его на максимум Arduino на 115200. Я также изменил значение в коде Matlab .Я также попробовал пакет поддержки Arduino Hardware с функцией readVoltage(), но у него слишком низкая частота дискретизации.

Настройки для последовательного порта:

s = serial('com3');
set(s, 'BaudRate', 115200); % set BaudRate to 115200
set(s, 'Parity', 'none'); % set Parity Bit to None
set(s, 'DataBits', 8); % set DataBits to 8
set(s, 'StopBit', 1); % set StopBit to 1
set(s,'Terminator','LF') % set terminating character to LF/new line
fopen(s);

Цикл чтения:

for i =1:am
    val(:,i) = string(fgetl(s));    %retrieve value of serial port, in the form aaaa.bbbb where a and b can vary in length
    if mod(i,10) == 0           %Display every 10 iterations
        volt1 = floor(val)*5/1023;          %Calculating actual voltage for A1, where floor(val) is first value
        volt2= (volt1-floor(val))*5/0.1023;         %getting only decimals for second voltage
        plot(volt1)         %plot the values
        hold on
        plot(volt2)
        hold off
        ylim([0 5])
        xlim([i-1000 i])        %make the plot chug along
        drawnow                 %Live
    end
    clc
    toc
end

Нет сообщений об ошибках, и используя другой последовательный порт, у меня не быловидимая задержкаЭто также должно быть возможно с Matlab, так как люди получают частоту обновления 2-3 кГц, используя это.

1 Ответ

0 голосов
/ 28 июня 2019

Проблема в том, как вы используете plot в цикле.Это очень неэффективно.

В зависимости от вашей версии Matlab и накладных расходов в вашей последовательной связи, вы можете ускорить вызов clf в начале цикла, чтобы предотвратить наложение большого количества графиков.друг на друга.

Если проблема не устранена, вы можете попробовать animated line и addpoints в цикле.

Наконец, есть паравещи, которые вы, возможно, захотите проверить: соединение Arduino для Matlab (я сам никогда не пробовал, но я читал, что это дает хорошую производительность) и таймер задержки на вашем последовательном порту (которыйможет оказывать влияние при низких скоростях передачи).

...