2014-10-05 12 views
0

나는 arduino uno를 통해 아날로그 신호를 읽고 MATLAB에서 플로팅하려고했습니다. 함수 발생기에서 입력 파형을 가져 와서 플롯하려했으나 플롯 된 신호가 올바르지 않습니다. 입력 사인파는 사인파를 내지 못했습니다. 가능한 이유는 무엇일까요? 원활한 판독을 위해 외부 회로가 필요합니까?matlab에 arduino에서 입력 아날로그 신호를 플로팅하는 방법

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; n == 1 i = 1의 경우 : 길이 (x) tmp = fscanf (s, '% d'); 길이 (tmp)> 1 인 경우 계속; end y (i) = tmp; end y = y/1024 * 5; ylim ([0 5]); plot (x, y) drawnow end fclose (s) –

+0

다음 번에 주석을 읽기보다는 읽기 어렵게 만드는 질문에 코드를 추가하십시오. 따라서 직렬 연결을 통해 9,600 보오를 통해 100 개의 데이터 포인트를 획득하고 있습니다. 입력 사인파는 어떤 주파수입니까? MATLAB에서 어떤 출력을 얻습니까? BTW, 당신의'while' 루프가 영원히 돌아갈 것 같습니다. ... – am304

답변

1

그냥 하나 개의 질문을 : 당신이 이제까지 신호 이론을 공부 했습니까? 나이키 스트 정리?

1 포인트 (100 us)를 얻은 다음 PRINTLN으로 직렬 연결 (10 비트마다 1 바이트)으로 전송합니다! (예 : 6 바이트, 즉 "1023"+ CR + LF)를 보냅니다. 60 바이트이므로 9600bps에서 6ms 이상입니다. 모든 포인트에 대해 7ms라고 가정합시다.

이제 1kHz 웨이브가 있습니다. 따라서 웨이브에서 하나의 샘플을 가져온 다음 6 개가 통과 한 다음 다른 지점을 선택하기를 기다립니다. 그래서 당신은 결코 아무것도 볼 수 없을 것입니다.

웨이브를보고 싶다면 모든 웨이브에 대해 최소 10 포인트를 확보해야합니다 (즉, 15Hz 이상으로 올라가지 않아야 함). 더 나은 웨이브를보고 싶다면 일반 보간법 대신 sinc 보간을 사용하십시오.

+0

보봇 (Boe)을 높이고 주파수를 낮추면 더 나은 음모가 될 수 있습니까? –

+0

물론 가능합니다. 여기에서 가장 큰 문제는 전송 속도로 115200bps로 설정할 수 있고 전송 속도를 거의 0.5ms로 맞출 수 있습니다 (따라서 약 150Hz로 갈 수 있습니다). 빠른 속도로 가고 싶다면 직렬 포트 및/또는 프로그램을 통해 얼마나 빨리 갈 수 있는지 확인하십시오 (arduino는 1Mbps까지 가능). 데이터 전송 방법을 변경하는 것이 좋습니다. 텍스트 표현 (전송 당 6 바이트)에서 이진으로 전환하십시오. 10 비트가 있기 때문에 2 바이트 (x3 속도) 만 보내야합니다. 어쨌든 ADC 시간 때문에 1 kHz 이상으로 갈 수 없을 것입니다 ... – frarugi87