2014-07-22 72 views
0

我面臨Arduino Uno和Matlab之間的問題。我們的想法是在Arduino的模擬引腳連接一個正弦發生器,做A/D轉換並在Matlab中發送結果以進行進一步處理(濾波和FFT)。頻率在10到20赫茲之間變化。Arduino Uno和Matlab串行通信

第一個奇怪的是,儘管在下面的代碼中波特率被定義爲9600,但Arduino的串行終端的值只能在19200波特率上看到。當我嘗試更改波特率時終端(回到9600),我只看到垃圾值。

第二個奇怪的是,當我在10和20 Hz之間的頻率間改變頻率時,串行打印看起來不像是正弦信號的值。但是,當頻率穩定在20 Hz或10 Hz時,輸出穩定。

這是一個運行在Arduino的代碼:

int values; 
float voltage; 

void setup() { 
    // put your setup code here, to run once: 
    Serial.begin(9600); 

} 

void loop() { 
    values = analogRead(1); 
    float voltage = values * (1.0/1023); 
    Serial.println(voltage, 3); 
    delay(200); 
    }  

這它運行在Matlab的代碼:

clc; 
clear all; 
close all; 

s = serial('COM12'); 
set(s, 'InputBufferSize', 1024);         
set(s, 'FlowControl', 'none'); 
set(s, 'BaudRate', 19200); 
set(s, 'Parity', 'none'); 
set(s, 'DataBits', 8); 
set(s, 'StopBit', 1); 
set(s, 'Timeout',4); 

disp(get(s,'Name')); 
prop(1)=(get(s,'BaudRate')); 
prop(2)=(get(s,'DataBits')); 
prop(3)=(get(s, 'StopBit')); 
prop(4)=(get(s, 'InputBufferSize')); 

disp(['Port Setup Done!!',num2str(prop)]); 
fopen(s); %opens the serial port 

disp('Running'); 
buf_len = 1024; 
index = 1:buf_len; 
Raw = zeros(size(index)); 
Data = zeros(size(index)); 
Fs = 200; 
T = 1/Fs; 

while 1 

    Raw = fscanf(s,'%f'); 
    disp(num2str(Raw)); 

    Data = [Data(2:end),Raw]; 
    subplot(2,1,1); 
    plot(Data); 
    xlabel('Number of Samples'); 
    ylabel('Amplitude'); 
    axis normal; 
    drawnow; 

    N = length(Data); 
    f = [0:N/2]*Fs/N; 
    FFT = 2*abs(fft(Data))/N; 
    subplot(2,1,2); 
    plot(f, FFT(1:N/2+1)); 
    xlabel('Frequency'); 
    ylabel('Amplitude |Xf|'); 
    axis normal; 
    drawnow; 

最終奇怪的是,儘管該發生器產生20赫茲的事實正弦信號,FFT圖形顯示了不同頻率(8和18 Hz)的信號。我想我應該在20赫茲看到一個信號。發生器輸出通過使用示波器進行驗證。

我想有人幫我澄清這個問題。我很困惑,我在網上搜索了很多WEEKS的鏈接,但還沒有。原諒我這個大帖子。我儘可能提供儘可能多的信息。但是,如果有人想知道更多的東西,或者如果我沒有提到任何隨意問的話。

回答

1

你的程序有很多錯誤。

  1. 你已經爲arduino和PC設置了不同的boudrate。
  2. 你得到正確的波形?你沒有提到它。
  3. 也發送硬件電路。
  4. 你可以嘗試這個f = [0:N/2] * 500/N; f = f/.05