Skocz do zawartości

Pomiar czasów trwania składowych sygnału prostokątnego


ghost1313

Pomocna odpowiedź

Cześć,

załóżmy, że mam czujnik z wyjściem cyfrowym, na którym pojawia się przebieg prostokątny. Chciałbym wiedzieć, ile czasu trwają poszczególne stany niskie i wysokie. Czyli przykładowo chciałbym uzyskać takie dane:

  • HIGH - 20 ms
  • LOW - 10 ms
  • HIGH - 30 ms
  • LOW - 5 ms

i tak dalej... Chodzi o to, żebym mógł z tych danych odtworzyć potem ten przebieg.

Napisałem następujący program:

volatile unsigned int  index      =  0 ;
volatile unsigned long times[100] = {0};

void saveCurrentMicros() {
  times[index++] = micros();
}

void setup() {
  pinMode(3, OUTPUT);

  attachInterrupt(digitalPinToInterrupt(3), saveCurrentMicros, CHANGE);

  tone(3, 36000);

  Serial.begin(115200);
}

void loop() {
  if(index > 99) {
    detachInterrupt(digitalPinToInterrupt(3));

    for(int i = 0; i < 99; i++) {
      Serial.println(times[i + 1] - times[i]);
    }

    while(1);
  }
}

I to działa, z tym że dane są generowane z pewnym przybliżeniem. Wychodzi z tego czasem 12, czasem 16. W dwóch przypadkach na sto dostałem dziwne wartości 4294966128 oraz 1200. Czyli działa "jako tako". Czy ktoś z Was zna może lepszy sposób na zrobienie tego? Myślałem o funkcji pulseIn(), ale to chyba nie do końca się sprawdzi.

Pozdrawiam

Edytowano przez ghost1313
Link do komentarza
Share on other sites

Timer2 w trybie ICP..  lepszego juz sposobu nie ma. Można określić czas impulsu jak i okres. Z bardzo dużą precyzją i funkcja nie blokująca. 

Edytowano przez Jarewa
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.