首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino Matlab绘图

Arduino Matlab绘图
EN

Stack Overflow用户
提问于 2017-01-26 12:06:13
回答 1查看 595关注 0票数 0

我正在尝试将我的Arduino Leonardo的数据发送到Matlab,然后绘制它。我尝试将正弦波传递到模拟输入,但我能够在串行绘图仪上看到它。问题是,每当我将数据发送到Matlab并绘制它时,绘制的不再是正弦波。

这是我的Arduino代码,我已经在这个link的帮助下调整了它,使其以1 1kHz的频率采样,这对串行绘图仪的结果没有太大的影响。

代码语言:javascript
复制
#define INTERVAL_LENGTH_US 1000UL

unsigned long previousMicros;
#define FASTADC 1
int recValue;
// defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
double t = 0;


void setup() {
  int start ;
  int i ;

#if FASTADC
  // set prescale to 16
  sbi(ADCSRA, ADPS2) ;
  cbi(ADCSRA, ADPS1) ;
  cbi(ADCSRA, ADPS0) ;
#endif

  Serial.begin(115200) ;
  while (1)
  {
    if (Serial.available() > 0)
    {
      recValue = Serial.read();

      if  (recValue == 1)            // If use will send value 1 from MATLAB
      { //delay(10);

        Serial.println("g");
        break;
      }

    }
  }


  void loop()
  {
    unsigned long currentMicros = micros();

    if ((currentMicros - previousMicros) >= INTERVAL_LENGTH_US)
    {
      previousMicros += INTERVAL_LENGTH_US;

      int val_a0 = analogRead(A0);
      int val_a1 = analogRead(A1);
      int val_a2 = analogRead(A2);
      int val_a3 = analogRead(A3);



      Serial.println(val_a0);


      Serial.println(val_a1);

      Serial.println(val_a2);


      Serial.println(val_a3);

    }
  }

编辑:我把电路板换成了UNO电路板(没有使用虚拟通信端口),并且我设法转移了它。但当我实时绘制它时,我只设法绘制了一小段时间(700个样本)。我知道Arduino正在连续地发送正弦波,这只是在matlab中,我只得到了它的一部分。这是我想说的截图:

Recieved sine

我在Matlab中用来接收和绘制它的代码如下:

代码语言:javascript
复制
        clear all;
    s = serial('COM4', 'BaudRate', 250000); % setup comport
    fopen(s);
    t=[0]; v1=[0]; v2=[0];v2=[0];v3=[0]; v4=[0];                            % same as in Arduino IDE
    n=1;h1=0; h2=0; h3=0; h4=0; base=0.0; x=[];  reply = '1';

    % signalling to Arduino to start reading inputs
    servalue= input('Enter the value 1 to start reading :');
    pause(1);tic;
    fprintf(s,servalue);
    %Arduino will send an acknowledgment
    reply = fgetl(s);
    if(reply~='g')
        disp('fail')
    end
    %%%%%%%%%%%%%%%%%%setting the plots%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
    figure; subplot(411) ;
    h1 = plot( v1, 'r-');
    %animatedline(nan,nan); % Save handle to the line
    title('Channel 1');
    ylabel('Amplitude(V)');

    subplot(412); h2= plot( v2, 'r-');
    %animatedline(nan,nan); % Save handle to the line
    title('Channel 2');
    ylabel('Amplitude(V)');


    subplot(413); h3= plot( v3, 'r-');
    %animatedline(nan,nan); % Save handle to the line
    title('Channel 3');
    ylabel('Amplitude(V)');

    subplot(414); h4= plot( v4, 'r-');
    %animatedline(nan,nan); % Save handle to the line
    title('Channel 4');
    xlabel('Time (seconds)');
    ylabel('Amplitude(V)');
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5

    while(toc<50)

        v1 = [v1, str2double(fgetl(s))*(5.0 / 1023.0)];
        v2 = [v2, str2double(fgetl(s))*(5.0 / 1023.0)];
        v3 = [v3, str2double(fgetl(s))*(5.0 / 1023.0)];
        v4 = [v4,str2double(fgetl(s))*(5.0 / 1023.0)];

        %% %%%%%%%updating plots%%%%%%%%%%%%%%%%%%

        set(h1,  'ydata', v1); % Update plot
        set(h2,  'ydata', v2); % Update plot
        set(h3,  'ydata', v3); % Update plot
        set(h4,  'ydata', v4); % Update plot
        drawnow;

        n=n+1;

    end
    fclose(s);

下面是4个通道的响应:4 channels' response

EN

回答 1

Stack Overflow用户

发布于 2017-01-26 17:24:31

看起来你的问题是一些数据被丢弃了,这会使你的数据发送和接收不同步。

理想情况下,您希望发送如下所示的流:

代码语言:javascript
复制
...Ch1-Ch2-Ch3-Ch4-Ch1-Ch2-Ch3-Ch4-Ch1-Ch2-Ch3-Ch4-Ch1-Ch2-Ch3-Ch4...

并在Matlab中接收,如下所示:

代码语言:javascript
复制
V1    V2    V3    V4
Ch1 - Ch2 - Ch3 - Ch4
Ch1 - Ch2 - Ch3 - Ch4
Ch1 - Ch2 - Ch3 - Ch4
Ch1 - Ch2 - Ch3 - Ch4

但是,如果由于某种原因丢失了一些数据,那么您的通道将会混杂在一起:

您的流将如下所示:

代码语言:javascript
复制
...Ch1-Ch2-Ch3-Ch4-Ch1-Ch2- -Ch4-Ch1-Ch2-Ch3- -Ch1-Ch2-Ch3-Ch4-Ch1-Ch2...

因此,Matlab中的程序将以如下方式容纳这些数据

代码语言:javascript
复制
V1    V2    V3    V4
Ch1 - Ch2 - Ch3 - Ch4
Ch1 - Ch2 - Ch4 - Ch1
Ch2 - Ch3 - Ch1 - Ch2
Ch3 - Ch4 - Ch1 - Ch2

正如您所看到的,它可以工作一段时间,但是当数据被删除时,所有的协调都会丢失。

有几种方法可以解决这个问题。搜索“同步串行通信”,您会找到几种方法。

在这种情况下,我建议在一行中发送用逗号分隔的所有通道,然后在matlab中将它们分隔。在Arduino方面:

代码语言:javascript
复制
  Serial.print(val_a0);
  Serial.print(',');
  Serial.print(val_a1);
  Serial.print(',');
  Serial.print(val_a2);
  Serial.print(',');
  Serial.println(val_a3);

然后在Matlab端

代码语言:javascript
复制
data=strsplit(fgetl(s),',');

if lenght(data)==4
    v1 = [v1, str2double(data(1))*(5.0 / 1023.0)];
    v2 = [v2, str2double(data(2))*(5.0 / 1023.0)];
    v3 = [v3, str2double(data(3))*(5.0 / 1023.0)];
    v4 = [v4, str2double(data(4))*(5.0 / 1023.0)];
end

请注意,这只会修复同步,但如果接收到部分数据,则可能会引入其他错误。您可以使用一些try-catch语句来处理此问题

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41866722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档