UART 보레이트와 클럭 오차
UART 가 「가끔」 깨진다면 배선보다 먼저 볼 것이 보레이트 오차다. MCU 는 자기 클럭을 정수로 나눠 보레이트를 만들기 때문에, 클럭과 보레이트 조합에 따라 몇 % 씩 어긋난다.
왜 오차가 생기나
UART 는 따로 클럭 선이 없다. 보내는 쪽과 받는 쪽이 「같은 속도로 센다」고 약속하고, 받는 쪽은 시작 비트에서 박자를 맞춘 뒤 각 비트의 가운데에서 값을 읽는다. 그런데 MCU 는 보레이트를 클럭 ÷ 정수로만 만들 수 있다. 72 MHz ÷ 115200 = 625 처럼 딱 나누어떨어지면 오차가 0이지만, 16 MHz ÷ (16 × 115200) = 8.68 처럼 소수가 나오면 반올림한 만큼 속도가 틀어진다. 그 어긋남이 프레임 끝(약 10비트)까지 쌓여 반 비트에 가까워지면 읽기가 틀린다.
값 넣어 보기
이 클럭에서 자주 쓰는 보레이트 전부
| 보레이트 | 분주값 | 실제 | 오차 | 판단 |
|---|
공식과 근거
근거: STM32 레퍼런스 매뉴얼 USART 장(보레이트 생성 · 수신기 허용 오차 표), ATmega328P 데이터시트 USART 장(보레이트 설정 표).
어디까지 괜찮나
받는 쪽이 견딜 수 있는 어긋남은 제조사 매뉴얼에 「수신기 허용 오차」로 나오고, 설정에 따라 대략 3~4% 수준이다. 이건 보내는 쪽과 받는 쪽 오차를 합친 값이라 한쪽 MCU 만 볼 때는 넉넉히 잡는다.
| 한쪽 오차 | 판단 |
|---|---|
| ±1% 안쪽 | 안전 — 상대가 조금 틀어져도 버틴다 |
| ±1~2% | 대부분 되지만 상대 쪽 오차 · 케이블 · 온도에 따라 가끔 깨질 수 있다 |
| ±2% 넘음 | 위험 — 클럭 · 보레이트 조합을 바꾼다 |
흔한 실수
자주 묻는 것
왜 크리스털이 11.0592 MHz 같은 이상한 값인가
11.0592 MHz · 14.7456 MHz · 18.432 MHz 는 9600 · 115200 같은 표준 보레이트로 딱 나누어떨어지는 값이라 오차가 0% 가 된다. 표에 넣어 보면 확인할 수 있다.
오버샘플링 8배는 언제 쓰나
클럭에 비해 보레이트가 아주 높을 때(예: 수 Mbps) 쓴다. 더 높은 속도를 낼 수 있는 대신 잡음과 클럭 어긋남에 덜 너그럽다.