2014-07-22 6 views
0

Je suis confronté à un problème entre Arduino Uno et Matlab. L'idée est de connecter un générateur de sinusoïde à la broche analogique de l'Arduino, de faire la conversion A/N et d'envoyer les résultats à Matlab pour un traitement ultérieur (filtrage et FFT). Les fréquences varieront entre 10 et 20 Hz. La première chose étrange est que les valeurs du terminal série d'Arduino ne peuvent être vues qu'à 19200 bauds, malgré le fait que dans le code suivant, le débit en bauds soit défini sur 9600. Quand j'ai essayé de changer le débit en bauds terminal (retour à 9600), je ne vois que des valeurs indésirables.Communications série Arduino Uno et Matlab

La deuxième chose étrange est que lorsque je change la fréquence entre l'intervalle de 10 et 20 Hz, la série imprime des valeurs qui ne ressemblent pas à un signal sinusal. Cependant, lorsque la fréquence est stable à 20 Hz ou 10 Hz, la sortie est stable.

C'est le code qui fonctionne à 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); 
    }  

Ce code qui fonctionne à 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; 

La chose étrange finale est que malgré le fait que le générateur produit 20 Hz signal sinusal, le graphe FFT illustre un signal à fréquence différente (8 et 18 Hz). Je suppose que j'étais censé voir un signal à 20 Hz. La sortie des générateurs est vérifiée à l'aide d'un oscilloscope.

J'aimerais que quelqu'un m'aide à clarifier ce problème. Je suis très confus, j'ai cherché beaucoup de liens sur le WEB pour WEEKS mais rien encore. Pardonnez-moi pour ce gros message. J'ai essayé de donner autant d'informations que possible. Cependant, si quelqu'un veut savoir quelque chose de plus ou si je n'ai rien mentionné, n'hésitez pas à le demander.

Répondre

1

votre programme a beaucoup d'erreurs.

  1. Vous avez défini différents boudrate pour arduino et PC.
  2. obtenez-vous la forme d'onde correcte? tu ne l'as pas mentionné.
  3. envoyer également le circuit matériel.
  4. Vous pouvez essayer ceci f = [0: N/2] * 500/N; f = f/.05