Skocz do zawartości
ghost1313

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

Pomocna odpowiedź

Napisano (edytowany)

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

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

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

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...