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


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.