어제 밤에 사진 올린 시계 이야기.
알리에서 시계를 샀는데 시간이 안 맞는다..
전자회로에서 시계를 만드는 방법은. 오실레이터, 크리스탈, RTC, PLL등이 있다.
크리스탈은 정확하지만 발진회로를 붙여야 한다. 오실레이터는 조금 비싸고 RTC는 비싸다. RTC는 그냥 시간 전용이다. (사실은 내부에 아주 작은 램과 배터리와 와치독도 제공하지만 논외로 합시다)
RTC가 리얼타임클록의 약자인데, 리얼이 붙은 것을 보고 무엇을 알 수 있나? 아 컴플렉스가 있구나 진짜 시간은 아니구나라는 것을 알 수 있다.
PLL은 컴퓨터 시스템의 다양한 클록을 공급하는 CPU, AP, MCU의 내부 장치다. 나누거나 곱해서 이런저런 클록을 생성한다.
그런데... 나누고 곱하면 딱 떨어지지가 않는다. 더 정확한 DDR클럭을 위해 DDR의 목표 클럭에 맞춰 초기값을 설정하면 UART 속도가 딱 떨어지지 않거나 그렇다.
물론 대강 맞으면 대강 돌아간다. 우리 컴퓨터쿤이 그렇게 엄격하지가 않다. 그리하여 대강 맞추면 또 문제가 생긴다. 통신 오류가 자꾸 발생하거나, 보드가 열 받거나 추운데 갔더니 시스템이 죽었어요 이런다.
뭐 시스템 꿈뻑거리고 잘 돌아가는 모습을 보고나면 아.. 뭐 PLL 조정 상수 결정 잘 됐네. 데이터시트가 시키라는데로 했으니까 뭐... 아니 사실은 선배가 또는 업체가 준 거 빌드 되니까 쓰는 건데 뭔 문제 있겠어.
이렇게 하여 시간이 맞지 않는 시계가 탄생한다. 시간이 맞지 않는다는 이야기는 들쭉날쭉 안 맞는다는 뜻도 하루에 두 번만 정확하다는 뜻도 아니다.
보통은 누적오차가 쌓여서 조금씩 느려지거나 조금씩 빨라진다. 클록도 오실레이터도 달지 않은 마이컴의 경우 내부 PLL에 의존하는데 사실은 공급 전압에 따라서도 조금씩 틀어질 수 있다. 알리발 시계는 USB 전원용과 배터리용이 있는데 아마도 4.5V 마진안에서 대충 돌아갈 것 같다...;;
누적오차도 실험 후 보정 테이블로 잡을 수도 있겠지만, 사실 나도 그렇게까지 해본 적이 없다. 현대적인 시스템은 NTP가 있는데 굳이..
문득 예전에 시리얼 통신 에러율 관련 쓴 글이 생각나서 링크를 걸어봄.
PLL 설정의 상수를 결정해야 하는데 레지스터에는 정수만 넣을 수 있고 계산값이 10.85가 나왔다. 커널코드에서 실수 연산을 쓰지 않으므로 대충 계산값을 넣으면 int 계산이 되면서 10이 들어간다. 11을 넣었으면 0.15 오차인데 0.85 오차가 생겼다는 이야기. (커널 코드에서 실수 연산을 쓸 수 있는 방법이 있긴 있다)