我面臨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的鏈接,但還沒有。原諒我這個大帖子。我儘可能提供儘可能多的信息。但是,如果有人想知道更多的東西,或者如果我沒有提到任何隨意問的話。