정확한 시간을 어떻게 알 수 있습니까?


16

Arduino를 사용하여 시계를 만들었지 만 시간이 흐르고 있습니다. 롤오버 문제를 알고 있습니다 . 시계는 일주일 동안 약 15 분 정도 표류하는 것처럼 보입니다.

Digi-key의 공진기 와 함께 맞춤형 PCB를 사용하고 있습니다. 이 코드는 각 루프의 시작 부분에서 millis () 함수를 읽고 해당 값에서 작동합니다.

내 질문은 : 통과 가능한 탁상 시계를 만들기에 충분히 정확하게 Arduino로 시간을 측정하는 방법은 무엇입니까?


3
밀리 초 기능은 인터럽트의 데이터와 함께 제공되며,이 과정에는 몇 클럭 사이클이 걸립니다. 이것은 각 진드기에 약간의 시간을 추가합니다.
TheDoctor

3
@TheDoctor : 이것은 잘못되었습니다. 인터럽트는 구동하는 하드웨어 타이머를 느리게하지 않습니다 millis().
Edgar Bonet

답변:


15

참고 : 제 답변은 받아 들여졌으며 투표 점수는 높지만 RTC없이 Arduino가 시간을 유지하는 방법에 대한 Edgar Bonet의 훌륭한 답변 을 읽으십시오 .

DS1307 Real Time Clock을 성공적으로 사용했습니다. 다음은 해당 데이터 시트에 대한 링크 입니다.

다음은 그 기능 중 일부입니다.

  • Arduino와의 통신에 IC 인터페이스를 사용하므로 올바른 라이브러리 (Net에서 사용 가능)를 사용하여 쉽게 프로그래밍 할 수 있습니다.

  • SCL 및 SDA 핀 (각각 A4 및 A5)을 통해 Arduino에 연결되므로 2 개의 핀만 사용합니다.

  • 실행할 외부 구성 요소가 거의 없습니다.

  • IT는 코인 셀 배터리에 연결될 수 있으므로 Arduino가 꺼진 상태에서도 시간을 유지할 수 있습니다. 저전력 모드에서 코인 셀 배터리는 몇 년 동안 지속됩니다.

  • 그것은 아주 조금 표류합니다 (제 경우에는 일주일에 몇 초만 표류합니다).

  • 비싸지 않습니다.

당신은 RTC를 사용하지 않으려면, 당신은 일반적으로에 대한 아두 이노에 클럭을 제공하는 데 사용되는 크리스탈 대체 할 수있는 수정 발진기 모듈 과 같은 Farnel에서이 하나 또는 이 다른 하나를 . 아래 이미지와 같이 4 핀 패키지로 제공됩니다. 그들은 당신의 arduino에 대해 훨씬 더 정확한 시계를 생성합니다.

수정 발진기 이미지 수정 발진기 이미지 수정 발진기 이미지

언급 된 두 모듈 모두 공차가 50ppm이며 5V에서 작동합니다.

다시 말하지만, 이러한 수정 발진기 모듈은 아래와 같이 일반 2 핀 수정 과 혼동되어서는 안됩니다 . 그것들은 예를 들어 MCU를위한 외부 클럭 회로의 일부입니다.

수정 발진기


DS1302가 충분합니까, 아니면 DS1307로 이동해야합니까?
Kelly S. French

14

시계를 구축하기 위해 RTC가 필요하지 않습니다. ATmega 칩에는 RTC 자체의 임무를 수행하는 데 필요한 모든 하드웨어가 있습니다. 방법은 다음과 같습니다.

  1. 32768Hz 시계 크리스털을 구입하십시오 : 시계를 사거나 오래된 시계를 분해하십시오. 시간 유지를 위해 특별히 설계된이 결정은 온도 드리프트 가 매우 작습니다. RTC 칩을 사용하려면이 중 하나가 필요합니다.

  2. 8MHz RC 발진기가 나오도록 ATmega의 퓨즈를 구성하십시오. 이로 인해 millis()기능 이 매우 부정확 해지고 XTAL1 및 XTAL2 핀이 해제됩니다.

  3. 시계 크리스털을 TOSC1 및 TOSC2 핀에 연결합니다. 이들은 XTAL1 및 XTAL2와 동일한 핀입니다 (328P의 9 및 10). 다른 이름은 다른 기능을 의미하는 데 사용됩니다.

  4. 비동기 작업, 일반 카운팅 모드, 프리스케일러가 128로 설정되도록 타이머 / 카운터 2를 구성하고 타이머 오버 플로우 인터럽트를 활성화하십시오.

이제 초당 1 회의 매우 안정적인 속도로 TIMER2_OVF 인터럽트가 발생합니다. ISR에서 시계 표시를 1 초만 진행하면됩니다. 인터럽트 사이에서 MCU를 매우 깊은 절전 모드 (전력 절약 절전 모드 : 타이머 / 카운터 2 외에는 실행하지 않음)로 설정하고 몇 개의 AA 셀에서 몇 년 동안 실행할 수 있습니다. 디스플레이에 전력이 부족한 경우가 아니라면.

나는 24 시간 한손 벽시계 를 만들기 위해 이것을 정확하게했다 . 이 링크는 이제 원본 문서의 영어 번역본을 프랑스어로 가리 킵니다.

석영 교정

석영을 교정하지 않으면 일반적으로 일주일에 몇 초 정도 드리프트가 발생할 수 있습니다 . 드리프트 레이트는 크리스털을 MCU에 연결하는 트레이스의 부유 용량에 따라 달라집니다. 원칙적으로, 미세 조정 된 여분의 커패시턴스를 추가하여 제거 할 수 있습니다. RTC와 동일한 드리프트 문제 가있을 것 입니다.

이런 종류의 정확성에 만족한다면, 그것에 만족하고 행복하십시오. 그러나 드리프트를 측정하려는 경우 매우 안정적임을 알 수 있습니다. 그런 다음 소프트웨어에서이를 쉽게 보상하고 매년 몇 초의 정확도를 달성 할 수 있습니다.

드리프트 보정 알고리즘은 매우 간단합니다. 측정 된 드리프트에서 인터럽트 사이의 정확한 지연을 파악하면 10 9  나노초에 매우 근접해야합니다 .

#define ONE_SECOND    1000000000  // in nanoseconds
#define ONE_INTERRUPT  999993482  // for example

ISR(TIMER2_OVF_vect)
{
    static uint32_t unaccounted_time;

    unaccounted_time += ONE_INTERRUPT;
    while (unaccounted_time >= ONE_SECOND) {
        advance_display_by_one_second();
        unaccounted_time -= ONE_SECOND;
    }
}

위의 예에서 쿼츠는 약간 빠르며 소프트웨어는 며칠마다 틱을 "누락"하여 보상합니다. 석영이 너무 느리면 동일한 코드가 며칠에 한 번 두 번 틱됩니다.

이러한 종류의 교정은 RTC에 대해서도 수행 될 수 있지만 RTC는 시간을 자연스럽게 산술 연산에 적합하지 않은 세분화 된 형태로보고하기 때문에 훨씬 더 복잡합니다.


와우 정말 매끄러운 디자인입니다! 어리석은 모노 글 로트 미국인들에게도 디자인을 명확하게하기 위해 충분한 사진을 올리는 방법이 정말 마음에 듭니다.
John Walthour

2
@JohnWalthour : 감사합니다! 이제 번역을 작성하도록 격려하고 있습니다. :-)
Edgar Bonet

2
@JohnWalthour : 완료! 링크는 이제 영어 번역을 가리 킵니다.
Edgar Bonet

"ATmega 칩에 필요한 모든 하드웨어가 있습니다."라고 말하면, 새로운 결정을 얻어야하는 것은 사실이 아닙니다. 귀하의 솔루션이 매끄럽고 수정을 대체하는 것이 아니라고 생각하지만 하드웨어가 필요하지 않다고 말하고 하드웨어를 교체해야한다고 말할 때 약간 혼란 스러웠습니다.
Kelly S. French

@ KellyS.French : 제 문장은 "ATmega 칩에는 RTC 자체 의 의무를 수행하는 데 필요한 모든 하드웨어가 있습니다"(강조 추가)였습니다. 그러나 유비쿼터스 DS1307을 포함한 대부분의 RTC가 작동하려면 외부 크리스털이 필요하다는 점에 주목해야한다. ATmega도 그다지 다르지 않습니다. RTC 자체 를 교체 하는 데 필요한 모든 것이 있지만 RTC 에 연결해야 할 크리스탈을 대체하지는 않습니다. RTC 모듈 은 크리스털을 포함하기 때문에 RTC 이상입니다.
Edgar Bonet 2018 년

6

지정한 공진기의 안정성은 0.3 %이며 크리스탈 또는 크리스탈 오실레이터 (Ricardo에서 언급 한대로)는 50ppm입니다. 여러 번 더 안정적입니다. 공진기의 온도 드리프트는 말할 것도없고 끔찍합니다. 햇빛에 의한 난방은 그것을 바꿀 것입니다. 따라서 공진기를 장시간 사용하지 않아야합니다.

따라서 크리스털 또는 크리스털 발진기를 사용하면 원하는 것을 얻을 수 있습니다. ATmega에서 사용하거나 퓨즈를 각각 설정하거나 RTC에 연결된 퓨즈를 설정하십시오.


0.005 %의 안정성은 50ppm입니까?
Matthew G.

대답을 간략하게하기 위해 해당 사양을 일반화합니다. Res. 훨씬 더 큰 공차를 가지고 있으며 상당히 꺼져있을 수 있습니다. 존 W가 경험 한대로. "올바른 일을위한 올바른 부분"
mpflaga

오, 나는 단지 @mpflaga라는 용어에 대해 궁금했다.
Matthew G.

4

실시간 클럭 (예 : DSDS1307)과 같은 추가 하드웨어를 사용하지 않으려면 사용하지 않는 모든 인터럽트를 비활성화하여 타이밍 정확도를 크게 향상시킬 수 있습니다. 기본적으로 Arduino 스케치에는 다양한 인터럽트 루틴이 활성화되어 있으며 종종 스케치에 사용되지 않습니다. 시도하지 않고 할 수 있는지 확인하는 가장 빠른 방법noInterrupts();


3
−1 (이는 −4가 필요하지만) : 1. 실제로 필요한 경우가 아니라면 시간을 유지하는 데 필요한 TIMER0_OVF 만 제외하고 기본적으로 모든 인터럽트가 비활성화됩니다. 2. Arduino의 타이밍 정확도는 주로 공진기의 품질에 의해 제한됩니다. 3. 인터럽트는 millis()서비스를 제공 할 때 1 밀리 초 이상을 소비하지 않는 한 정확도에 영향을 미치지 않습니다 .이 경우 다른 문제가 있습니다 ... 4. 인터럽트를 비활성화 noInterrupts()하면 millis()시간이 전혀 유지 되지 않습니다!
Edgar Bonet

2

Arduino의 많은 정신이 소박하고 때로는 문제를 겪고 있음을 이해합니다. 저는 직장에서 Arduino (현재는 chipKIT, RAM이 10 배, 클럭 속도가 10 배이므로)를 사용하고 최대한 빠르게 속도를 내고 작동하려면 "주변 기능"이 필요합니다.

내 프로젝트 중 하나에서 sparkfun 실시간 시계를 사용하고 매우 기쁘게 생각합니다. 또한 "Dead on"변형이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.