여기 몇 가지 요소가 있습니다.
- ATmega328P MCU는 얼마나 높은 전송 속도를 달성 할 수 있습니까?
- USB- 시리얼 인터페이스는 얼마나 높은 전송 속도를 달성 할 수 있습니까?
- ATmega328P의 발진기 주파수는 무엇입니까?
- USB 직렬 인터페이스의 발진기 주파수는 무엇입니까 (있는 경우)?
- 전송 속도 불일치의 USB 직렬 인터페이스는 얼마나 허용됩니까?
이러한 모든 요소는 최대 달성 가능한 전송 속도를 결정하는 것과 관련이 있습니다. ATmega328P는 클럭 속도의 하드웨어 제수를 사용하여 직렬 인터페이스의 기본 클럭을 생성합니다. 메인 클럭과 원하는 전송 속도의 비트 시간에 대한 정수 비율이 없으면 MCU가 원하는 속도 를 정확하게 생성 할 수 없습니다 . 일부 장치는 다른 장치보다 전송 속도 불일치에 훨씬 민감하기 때문에 잠재적 인 문제가 발생할 수 있습니다.
FTDI 기반 인터페이스는 전송 속도 불일치에 대해 최대 몇 퍼센트의 오차를 허용합니다. 그러나 0.5 %의 전송 속도 오류도 처리 할 수없는 특수 내장 GPS 모듈을 사용했습니다.
일반 직렬 인터페이스는 ~ 5 % 전송 속도 오류를 허용합니다. 그러나 각 끝을 끌 수 있으므로 더 일반적인 사양은 + -2.5 %입니다. 이렇게하면 한쪽 끝이 2.5 % 빠르고 다른 쪽 끝이 2.5 % 느리면 전체 오류는 여전히 5 %에 불과합니다.
어쨌든 Uno는 ATmega328P를 기본 MCU로 사용하고 ATmega16U2를 USB 직렬 인터페이스로 사용합니다. 또한이 두 MCU 모두 유사한 하드웨어 USART와 16Mhz 클럭을 사용한다는 점에서 운이 좋았습니다.
두 MCU 모두 동일한 하드웨어 및 클럭 속도를 갖기 때문에 동일한 방향으로 동일한 보드 속도 오류가 발생하므로 보드 오류 문제를 기능적으로 무시할 수 있습니다.
어쨌든,이 질문에 대한 "적절한"대답은 ATmega16U2의 소스를 파고 거기에서 가능한 전송 속도를 계산하는 것을 포함하지만, 게으 르기 때문에 간단하고 경험적인 테스트가 효과가있을 것입니다.
ATmega328P 데이터 시트를 간단히 살펴보면 다음 표가 생성됩니다.
따라서 최대 명시된 전송 속도 2 Mbps를 감안할 때 빠른 테스트 프로그램을 작성했습니다.
void setup(){};
void loop()
{
delay(1000);
Serial.begin(57600);
Serial.println("\r\rBaud-rate = 57600");
delay(1000);
Serial.begin(76800);
Serial.println("\r\rBaud-rate = 76800");
delay(1000);
Serial.begin(115200);
Serial.println("\r\rBaud-rate = 115200");
delay(1000);
Serial.begin(230400);
Serial.println("\r\rBaud-rate = 230400");
delay(1000);
Serial.begin(250000);
Serial.println("\r\rBaud-rate = 250000");
delay(1000);
Serial.begin(500000);
Serial.println("\r\rBaud-rate = 500000");
delay(1000);
Serial.begin(1000000);
Serial.println("\r\rBaud-rate = 1000000");
delay(1000);
Serial.begin(2000000);
Serial.println("\r\rBaud-rate = 2000000");
};
그런 다음 직렬 터미널이있는 관련 직렬 포트를 살펴보십시오.
따라서 하드웨어가 문제없이 2,000,000 보드에서 실행될 수있는 것으로 보입니다.
이 전송 속도 는 바이트 당 MCU 64 80 클럭 사이클 만 제공 하므로 직렬 인터페이스를 사용 중으로 유지하는 것은 매우 어려울 수 있습니다. 개별 바이트가 매우 빠르게 전송 될 수 있지만 인터페이스가 단순히 유휴 상태 인 경우 많은 시간이 걸릴 수 있습니다.
편집 : 실제 테스트!
2Mbps는 실제입니다.
각 비트 시간은 500ns이며 예상되는 것과 정확히 일치합니다.
성능 문제! 전체 패킷 길이 :
500 Kbaud :
1 Mbaud :
2MBaud의 :
참고 : 눈에 띄는 오버 슈트가 좋지 스코프 프로브 접지 관행에 기인하고, 아마 진짜. 내 스코프 프로브의 일부인 접지 클립 리드를 사용하고 있으며 리드 인덕턴스가 오버 슈트의 대부분의 원인 일 수 있습니다.
보다시피, 전체 전송 길이는 0.5, 1 및 2 Mbaud에서 동일합니다. 직렬 버퍼에 바이트를 배치하는 코드가 제대로 최적화되지 않았기 때문입니다. 따라서 자체 직렬 라이브러리를 작성하지 않는 한 효과적인 500 Kbaud 보다 더 나은 것을 달성하지 못할 것 입니다. Arduino 라이브러리는 최적화가 잘되어 있지 않기 때문에 버스트 전송에 약간의 시간을 투자한다면 적절한 2Mbaud를 얻는 것이 그리 어렵지 않을 것입니다 .