2014-10-05 144 views
0

我一直試圖通過arduino uno讀取模擬信號並在MATLAB中繪製它們。當我從函數發生器給出我的輸入波並試圖繪製它時,繪製的信號是不正確的,例如,輸入正弦波沒有給出正弦波。可能的原因是什麼?我需要任何外部電路以便順利閱讀嗎?如何在matlab中繪製來自arduino的輸入模擬信號

ARDUINO CODE

void setup() 
{ Serial.begin(9600); } 
void loop() 
{ 
int a=analogRead(A0); 
Serial.println(a); 
delay(1); 
} 

MATLAB代碼

s=serial('COM3','BaudRate',9600); 
fopen(s) 
x=1:100; 
n=1; 
while n==1 
    for i=1:length(x) 
     tmp=fscanf(s,'%d'); 
     if length(tmp)>1 
      continue; 
     end 
     y(i)=tmp; 
    end 
    y=y/1024*5; 
    ylim([0 5]); 
    plot(x,y) 
    drawnow 
    end 
fclose(s) 
+1

請張貼您的代碼。 – am304 2014-10-05 17:37:06

+0

ARDUINO CODE void setup() Serial.begin(9600); } void loop() { int a = analogRead(A0); Serial.println(a); 延遲(1); ('COM3','BaudRate',9600); (s) x = 1:100; n = 1; (x) tmp = fscanf(s,'%d'); 如果長度(tmp)> 1 繼續; end y(i)= tmp; 結束 y = y/1024 * 5; ylim([0 5]); 圖(X,Y) 的DrawNow 結束 FCLOSE(S) – 2014-10-06 05:25:17

+0

下一次,請把代碼添加到這個問題,而不是評論,因爲它使得它難以閱讀。所以你通過9,600波特的串行連接獲得100個數據點。輸入正弦波的頻率是多少?你在MATLAB中得到什麼輸出?順便說一句,它看起來像你的'while'循環將永遠運行... – am304 2014-10-06 08:28:02

回答

1

只有一個問題:你有沒有學習信號理論?奈奎斯特定理?

您贏得1分(100 us),然後您通過串行連接(因此每個字節10位)發送一個PRINTLN! (所以你發送,例如,6個字節,即「1023」+ CR + LF)。所以60字節,在9600 bps,它是超過6毫秒。我們假設每個點都是7毫秒。

現在你有1 kHz的波形。所以你從波浪中抽取一個樣本,然後等待其中的6個樣本通過,然後再取一個點。所以你永遠無法看到任何東西。

如果你想看看你的波浪每個波浪至少10點(即不要超過15赫茲)。如果您想看到更好的波形,請嘗試使用sinc插值而不是簡單的插值。

+0

如果我增加我的波特率並減少我的頻率,它可以幫助更好的情節? – 2014-10-07 13:29:25

+0

當然可以..因爲這裏的主要問題是波特率,您可以將其設置爲115200 bps,並在幾乎0.5毫秒內完成傳輸(因此您可以在150 Hz左右)。如果你想要更快一點,你可以檢查你的串口和/或程序,看看你能走多快(arduino也可以達到1Mbps)。 我建議你改變你傳輸數據的方式:從文本表示(所以每個傳輸6個字節)切換到二進制;既然你有10位,你將不得不發送2個字節(所以x3速度)。無論如何,由於ADC時間的限制,您無法超過1 kHz。 – frarugi87 2014-10-07 13:53:00