millis ()를 사용하여 Arduino 시간을 유지하는 것이 정확하지 않습니까?


9

Arduino를 사용하여 일부 데이터를 기록했습니다. Arduino 스케치 millis()에서 측정 한 각 값이 취해지는 시간을 추적 할 수 있도록 이 기능 도 사용했습니다 . 그러나 타이밍이 정확하지 않은 것으로 나타났습니다. 예를 들어 실생활에서 30 초는 10 초 (예제)로 나옵니다.

Arduino 지연 기능이 계속 사용하는 시간에 영향을 준다고 말하는 것이 맞 millis()습니까? 다시 말해, 50ms의 지연이 있다고 가정 millis()하면, 해당 기간 동안 기능이 중지되었다가 연결 기간 동안 계속되는가? 일부 데이터를 플로팅하고 지나간 시간이 주어지면 내 데이터의 피크 주파수가 너무 빈번하다는 것을 알았을 때 이것을 알았습니다. 그래서 이것이 타이밍 불일치에 대한 추론인지 알고 싶습니다. 그렇다면 각 샘플이 발생하는 시간을 유지할 수 있도록 어떻게 수정해야합니까?

여기에 약간의 맥락을 제시하는 것은 나의 스케치입니다.

#include <eHealth.h>    

unsigned long time;
// The setup routine runs once when you press reset:
void setup() {
  Serial.begin(9600);  
}

// The loop routine runs over and over again forever:
void loop() {

  float ECG = eHealth.getECG();
  time = millis();
  Serial.print(time);
  Serial.print(" ");
  Serial.print(ECG, 5); 
  Serial.println("");    

  delay(50);
}

공식 Uno 보드 중 하나를 사용하고 있습니까?
Peter Bloomfield 2016 년

1
구성 값 (라인 타임 스탬프가 이상적인 직렬 모니터) 대신 실제 타이밍이 진행중인 상황을 파악하는 데 도움이 될 수 있습니다.
Ignacio Vazquez-Abrams

3
의 계산 millis()은 인터럽트 구동이므로 delay()영향을 미치지 않아야합니다.
microtherion

나는 같은 문제가 있지만 그것을 (millis ()) 복잡한 코드로 통합 할 때만. 코드의 복잡성이 코드의 복잡성과 함께 점점 더 지연되는 방식으로 정확도에 영향을 미친다고 생각합니다. 이것을 피할 수있는 방법이 있습니까? 별도의 RTC 모듈을 사용하고 있습니까?
Josip7171

답변:


10

millis()이렇게 인터럽트 구동 delay()적어도되지 보드 기반 ATMEGA에 그 영향을주지한다.

그것은 그것이 millis()완전히 정확 하다는 것을 말하는 것은 아닙니다 . 타이머의 각 틱은 정확히 1ms가 아니라 1.024ms입니다. 이 오류는 수정 될 때까지 점차 누적됩니다. 이것은 TIMER0_OVF (타이머 0 오버 플로우) 인터럽트 핸들러의 구현에서 볼 수 있습니다.

부정확의 또 다른 원인은 정확히 16MHz가 아닌 발진기 / 크리스탈 자체입니다. 그래도 꽤 가깝고 온도가 너무 많이 변하지 않는 한 비교적 안정적입니다.

위는를 사용할 때 약 1ms가 될 수 있음을 의미합니다 millis(). 이것은 당신의 문제처럼 들리지 않습니다.

또 다른 잠재적 인 문제는 현재하고있는 일 getECG()입니다. 매우 느릴 수 있습니다.

float eHealthClass::getECG(void)
    {
        float analog0;
        // Read from analogic in. 
        analog0=analogRead(0);
        // binary to voltage conversion
        return analog0 = (float)analog0 * 5 / 1023.0;   
    }

analogRead() 느리지 만 이와 같은 루프에 영향을 줄 정도로 느리지는 않습니다.

사람들이 본 또 다른 문제는 시계 속도를 변경하지만 boards.txt를 올바르게 변경하지 않는 경우입니다. 이는 millis()구현에 사용 된 상수 가 잘못되었고 시간이 잘못되었음을 의미합니다.

실제로 50ms마다 값을 읽으려면이를 구현하는 훨씬 더 좋은 방법은 다음을 수행하는 것입니다

static long lastUpdate;

if (millis() - lastUpdate > 50)
{
    lastUpdate = millis();
    //Do stuff
}

우리는 당신이 얻는 타임 스탬프를 정말로 볼 필요가있을 것입니다. 실제로 30이 10으로 표시되는 경우 직장에 다른 것이 있습니다.


2
Uno의 경우 클럭은 크리스털 구동 방식이 아니라 크리스털 공진기를 사용하므로 크리스털보다 정확도가 떨어집니다.
jfpoilpret

@jfpoilpret 아 아 아아아. 회로도를 보면 CSTCE16M0V53-R0 Murata CERALOCK 장치 입니다.
Chris O

공진기는 초기 공차가 약하고 (종종 0.5-2 %) 온도 안정성이 좋지 않지만, 사용시 타이밍 루프를 교정하면 온도가 이동하지 않는 한 양호합니다.
Cybergibbons

2
Millis ()는 여전히 1.024ms마다 작동하는 타이머에서 작동하지만 오류 측정기 변수가 너무 높아질 때마다 증가하는 형태로 오류 보정을 추가했습니다. 실제로 Roman Black의 알고리즘이라고 생각합니다. 따라서 타이밍은 정확히 1ms에 훨씬 가깝습니다. github.com/arduino/Arduino/blob/master/hardware/arduino/cores/…
EternityForest

여전히 관심이있는 사람들은 JRobert의 답변에 게시 한 의견을 참조하십시오. 나는 답변이 없기 때문에 자신의 답변으로 답변하고 싶지 않았습니다. 문제를 다시 표현했습니다.
user3284376

2

상당한 부분 eHealth.getECG()통화 시간 동안 인터럽트가 꺼지면 millis()의 수가 뒤쳐 질 수 있습니다. 그렇지 않으면 millis()설명 된 3 배 오류보다 훨씬 정확한 시간을 반환해야합니다.

샘플링 된 신호가 예상보다 높은 주파수에서 나타난다 고 말했는데, 이는 샘플 속도가 의도 한 것보다 낮은 경우 발생할 수 있습니다. 샘플 속도가 20Hz라고 가정하십니까? 루프는 인쇄 시간에 볼 수있는 50ms보다 약간 긴 시간이 걸릴 수 있지만 여전히 시계 시간을 추적해야합니다. 이를 설명하지 않았지만 50ms / sample로 가정하면 데이터의 속도가 명백히 향상됩니다.

이것이 문제가되지 않는 경우 다음 단계는에있는 동안 출력을 토글 loop()하고 주파수 미터 (일부 저렴한 DVM이이를 수행 할 수 있음) 또는 '범위를 사용하여 결과 구형파의 주파수를 측정하는 것입니다. 공란으로 같은 일을하십시오 loop(). 첫 번째 실험은 실제 샘플링 속도 또는 간격입니다. 두 번째는 예상 한 것 millis()(즉, timer0 주파수) 인지 알려줍니다 .


1
나는 그것을 가지고 놀고 더 문제가 Arduino와 관련이 없다는 것을 깨달았습니다. 대부분의 millis () 함수는 매우 잘 작동합니다. 일부 값은 정확히 8ms (지연)이 아닙니다. 당신은 그것이 예상된다고 말했습니다. 내가 설명한 3 배 오류는 데이터를 수신하는 데 사용하는 파이썬 측면에서 사실입니다. 그 결과가 될 수있는 아이디어는 파이썬의 pyserial을 사용하고 있으며 지옥만큼 느립니다.
user3284376

1 / 2 @ 이상의 추측을 줄 수있는 구현에 대해서는 충분히 알지 못하지만 Python 측은 샘플을 떨어 뜨릴만큼 느립니까?
JRobert

0

여기도 마찬가지입니다. 중단을 끄면 측정 된 시간이 "실시간"이라고 덧붙일 수 있습니다. 어쨌든, 루프가 너무 오래 걸리면 millis ()가 실시간 값을 반환해야하기 때문에 왜이 지연이 발생하는지 이해하지 못합니다 (각 값 사이의 거리가 더 먼 경우에만)


1
"여기에 동일"이란 무엇입니까? 포럼과 달리 StackExchange에서 항목을 다시 주문할 수 있으므로 답변은 독자적으로 진행되어야합니다. 따라서 "여기에 동일하다"는 답변 아래에 표시되는 답변 / 질문에 따라 무엇이든 의미 할 수 있습니다.
Nick Gammon

이 게시물은 귀하의 의견이 충분하지는 않지만 의견으로 더 적합합니다.
Greenonline

죄송합니다. 답변을하시면 주 게시물을 참조하는 것이 분명합니다. 그렇지 않으면 댓글이있을 것입니다.
user48711
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.