2014-10-05 4 views
0

Я пытаюсь читать аналоговые сигналы через arduino uno и строить их в MATLAB. Когда я подал свою входную волну из генератора функций и попытался построить ее, построенные сигналы были неправильными, например. входная синусоидальная волна не давала синусоидальной волны. Что может быть возможной причиной? Нужна ли мне внешняя схема для плавного чтения?как построить входные аналоговые сигналы от arduino в matlab

ARDUINO КОД

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

+0

ARDUINO CODE void setup() { Serial.begin (9600); } void loop() { int a = analogRead (A0); Serial.println (a); Задержка (1); } КОД MATLAB s = serial ('COM3', 'BaudRate', 9600); fopen (s) x = 1: 100; n = 1; while n == 1 для i = 1: length (x) tmp = fscanf (s, '% d'); если длина (tmp)> 1 continue; конец y (i) = tmp; конец y = y/1024 * 5; ylim ([0 5]); plot (x, y) Втянутый конец fclose (s) –

+0

В следующий раз, пожалуйста, добавьте код к вопросу, а не комментарии, так как это затрудняет чтение. Таким образом, вы получаете 100 точек данных через последовательное соединение с 9600 бод. Какая частота является вашей синусоидальной волной? Какой результат вы получаете в MATLAB? BTW, похоже, что ваша 'while' петля будет работать вечно ... – am304

ответ

1

Только один вопрос: вы когда-нибудь изучать теорию сигнала? Теорема Найквиста?

Вы получаете 1 очко (100 us), затем вы отправляете его через последовательное соединение (так 10 бит каждый байт) с PRINTLN! (поэтому вы отправляете, например, 6 байтов, то есть «1023» + CR + LF). Итак, 60 байт, при 9600 бит/с, это более 6 мс. Предположим, что для каждой точки это 7 мс.

Теперь у вас волна 1 кГц. Таким образом, вы берете один образец из волны, а затем ждите, пока их не пройдет, а затем возьмите еще одну точку. Таким образом, вы никогда не сможете ничего увидеть.

Если вы хотите, чтобы ваша волна попыталась получить по крайней мере 10 баллов за каждую волну (т. Е. Не превышайте 15 Гц). Если вы хотите увидеть лучшую волну, попробуйте использовать интерполяцию sinc вместо простой интерполяции.

+0

если я увелишу свою бод и уменьшу свою частоту, может ли это помочь улучшить сюжет? –

+0

Конечно, это возможно. Поскольку основная проблема здесь - скорость передачи, вы можете установить ее на 115200 бит/с и получить передачу почти через 0,5 мс (так что вы можете идти примерно на 150 Гц). Если вы хотите идти быстрее, вы можете проверить свой последовательный порт и/или программу, чтобы узнать, как быстро вы можете пойти (arduino может пойти и до 1 Мбит/с). Я предлагаю вам изменить способ передачи ваших данных: переключиться с текстового представления (так что 6 байтов на передачу) на двоичный; поскольку у вас есть 10 бит, вам нужно будет отправить всего 2 байта (так что скорость x3). В любом случае, вы не сможете превысить 1 кГц из-за ADC раз ... – frarugi87