2013-07-20 97 views
2

我一直在使用ArduinoIO-Matlab接口從Matlab控制Arduino。我目前的設置是我有3個EMG肌肉傳感器(來自Advancer Technologies)通過模擬引腳1,2和3連接到Arduino。Arduino連接到Matlab。我試圖從這三個引腳同時收集數據,並將它們存儲在1000x3的矩陣中。我的問題是Matlab從模擬引腳採樣的速率。從3個引腳同時收集1000個讀數大約需要25秒。我知道arduino本身的採樣率較高。以下是我的代碼。我如何改變這個以在10秒內獲得大約1000個樣本的採樣率?增加/改變Matlab-Arduino analogRead()採樣率

ar = arduino('COM3'); 

ax = zeros(1000,3); 

for ai = 1:1000 
    ax(ai,:) = [ar.analogRead(1) ar.analogRead(2) ar.analogRead(3)]; 
end 

delete(ar); 

這是上面的代碼(配置文件查看器)所需的時間:

time  calls line 
< 0.01  1 3 ax = zeros(1000,3); 
        4 
< 0.01  1 5 for ai = 1:1000 
25.07 1000 6  ax(ai,:) = [ar.analogRead(1) ar.analogRead(2) ar.analogRead(3)]; 
      1000 7 end 
        8 
    1.24  1 9 delete(ar); 

請讓我知道如果有別的東西,我需要澄清。 感謝:D enter code here

回答

1

您需要修改arduino C++代碼(.pde文件)。 在這段代碼中,您應該根據自己的喜好(例如1000)對信號進行採樣,然後使用serial.writeln()方法將採樣的數據傳輸到matlab。

這會給你〜3kHz的採樣率(取決於很多因素)......

+0

嗨穆罕默德。你能澄清一點嗎?我需要在「adiosrv.pde」arduino代碼的確切位置和方式中設置費率。我正在查看adiosrv.pde,但無法理解或找到我必須進行修改的位置。 –

+0

我使用簡單的IO方案(adiosrv.pde)。在代碼中使用「case 30」(starts @ 217)執行模擬讀取。而不是從arduino請求輸入,讀取一個輸入並使用串行寫入將它發送到Matlab,我做了以下操作: for(int i = 0; i <1000; ++ i) Serial.println(analogRead(pin) ); 您還需要修改matlab代碼中的analogRead方法: for i = 1:1000 signal(i)= fscanf(a.ser,「%d」); end 更好的採樣方法是對整個信號進行採樣,然後通過串行將其發送回Matlab,但實際上這對我來說並沒有解決(我所滿意的是......) – Muhammad

+0

好的。 Btw抱歉,遲到的迴應。我的考試已經結束,所以我無法嘗試。如果(val> 96 && val <113),則adiosrv.pde中的情況30具有 {pin = val-97; agv = analogRead(pin); \t Serial.println(agv); } s = -1; 休息; 我應該追加哪部分內容?此外,這僅適用於需要獲取固定大小數據的情況。爲了實時連續數據採集的目的,應該做什麼? –

0

下很可能說明了你所看到的結果,爲什麼你需要做的東西像什麼穆罕默德的答案提示。雖然這個原因是由他的回答暗示的,但沒有說明其他人可以避開這個「陷阱」。

我無法訪問所需的底層代碼和系統以確定地檢查此答案。這個答案是建立在「典型方法」的基礎上的,並且具有純粹的poppycock [tm]的機會,但觀察方法和標準方法之間的確切吻合表明這是正在發生的事情。如果這是正確的,那麼對於具有必要系統的人進行一點點鑽研就會證明這一點。

當數據每次發送一個數據樣本時,每次樣本開銷會大大超過傳輸原始數據所花費的時間。

你說需要25秒才能傳送3000個樣本。
每個樣品的時間= 25/3000 =每個樣品8.333ms。

假設一個9600波特數據傳輸速率。
默認的通信速度可能是9600波特。這可以檢查,但結果表明這可能是正確的,稍作不同的假設提供了同樣好的解釋。串行通常使用N81格式= 1個起始位,8個數據位,每8位字節1個停止位。
所以1位取9600分之1小號
和10位取9600分之10= 1.042毫秒
和採樣時間的/字節時間
= 8.333/1.042 = 7.997字次。
事實上,如果你做沒有舍入或截斷的計算,即
25/3000 x 9600/10 = 8.000 ....。 即您的傳輸採用每個採樣的8 x 9600波特率字符。
同樣,這正好是4 x 4800波特或2 x 2400波特傳輸時間。

我沒有檢查過使用的格式,但想象一下,使用PC監視器程序的基本串行例程可能使用
2 x數據字節+ CR + LF = 4個字節。
這假定一個16位變量作爲2 x 8位二進制字發送。
更可能=
- 以4個ASCII字符發送16位或
- 以6個ASCII字符發送24位。

在沒有適當深度鑽取的情況下,使用6個ASCII字和一個9600波特率的CR + LF提供了一個很好的擬合,使用了Occam可能認爲這是最好的起點的典型參數。無論總體要求是8或4還是2個字節,觀察到的數據速率和標準波特率之間的某種偶然的精確匹配表明,這爲您提供了所見的基本原因。

查看代碼將快速顯示使用什麼波特率,數據長度和包裝。