Liczenie impulsów za pomocą Arduino Uno

Próbuję liczyć impulsy z generatora przebiegów za pomocą Arduino Uno. Generator przebiegów jest ustawiony na następujące ustawienia:

  • Typ przebiegu: impuls
  • Częstotliwość: 20 Hz (50 ms)
  • Amplituda: 3,0 Vpp
  • Przesunięcie: 0 V
  • Szerokość = 5 ms

Jak dotąd na moim monitorze szeregowym wyświetlane są tylko 0.

Tutaj jest tym, czego próbowałem do tej pory:

1) Używając pulseIn () i pulseInLong () -> bez powodzenia

2) Sprawdź połączenia przewodów -> Użyłem multimetru do sprawdzenia i są prawidłowo podłączone.

3) Podłącz oscyloskop, aby sprawdzić, czy generowany jest przebieg -> Przebieg jest generowany, jak pokazano na poniższych ilustracjach.

Uwaga: Przebieg generator jest częścią oscyloskopu:

Generator przebiegów

Schemat połączeń

Mój kod pokazano poniżej:

volatile int IRQcount; int pin = 2; int pin_irq = 0; //IRQ that matches to pin 2 int result = 0; void setup() { // put your setup code here, to run once: Serial.begin (115200); pinMode(2, INPUT); attachInterrupt(pin_irq, IRQcounter, FALLING); } void IRQcounter() { IRQcount++; } void loop() { // put your main code here, to run repeatedly: cli();//disable interrupts IRQcount = 0; sei();//enable interrupts delay(500); cli();//disable interrupts result = IRQcount; sei();//enable interrupts Serial.print(F("Counted = ")); Serial.println(result); } 

Komentarze

  • Nie ' nie wiem, czy domyślnie wejście bu t czy musisz używać pinMode(pin, mode)?
  • Czy " low " część kształtu fali przy 0 V lub przy -1,5 V?
  • Na zdjęciu z zakresu ' niski poziom sygnału wynosi -1,5 V , a wysoki poziom to 1,5 wolta. 1,5 V to prawdopodobnie zbyt niskie napięcie, aby Arduino rozpoznało je jako logiczne wysokie.
  • Aby być łaskawym dla wejść Arduino, należy ustawić generator sygnału na 5 Vpp i zmienić offset na + 2,5 V, więc sygnał przełącza się między 0 a + 5 V (zakładając, że Arduino Vcc wynosi 5 V.) Wejścia cyfrowe mikrokontrolera nie powinny być zasilane ujemnie.
  • Aha, widzę, zmieniłem opóźnienie na 250 ms, dlatego widziałem wynik = 5, ale teraz zmieniłem go z powrotem na 500 ms i teraz widzę wynik = 10, czy możesz wyjaśnić, jak sprawdzić, czy liczba impulsów jest poprawna?

Odpowiedź

  1. Jak zauważył Peter Bennett i inni, początkowo ustawiłeś 3 Vpp lub impuls naprzemiennie + 1,5 V do -1,5 V . Zgodnie z charakterystyką elektryczną kontrolera Arduino , nie gwarantuje się, że 1,5 V zostanie odczytane jako „1”. Powinno wynosić co najmniej 0,6 Vcc. irq styk nie może rozpoznać przejść krawędzi, zamiast tego przez cały czas odczytuje wartość „0”. Nie powinno się również doprowadzać napięcia do styków we / wy, aby uniknąć uszkodzenia !!
  2. Częstotliwość impulsów to 20 Hz lub 20 impulsów na sekundę. Przy opóźnieniu 500 ms liczysz, ile impulsów występuje na pół sekundy, więc result powinna mieć wartość 10. To właśnie jest wyświetlane na monitorze szeregowym.

Odpowiedź

Od na zdjęciu z zakresu, niski poziom sygnału to -1,5 V, a wysoki to 1,5 V. Prawdopodobnie 1,5 V to zbyt niskie napięcie, aby Arduino mogło je rozpoznać jako logiczne wysokie.

Ponadto wejścia cyfrowe Arduino mogą zostać uszkodzone przez napięcie ujemne, a wejścia w większości cyfrowych układów scalonych są przystosowane do akceptacji wejścia między uziemieniem a dodatnim napięciem zasilania.

Jeśli Arduino jest zasilane z +5 V, należy ustawić generator sygnału na 5 Vpp, z przesunięciem +2,5 V, aby utrzymać sygnał w Arduino ” s granice napięcia wejściowego.

Aby zostało rozpoznane jako logiczne Wysokie, napięcie wejściowe musi przekraczać 0,7 Vcc lub 3,5 V – niższe napięcia mogą nie być rozpoznawane jako Wysokie, więc nie będą powodować przerwania.

Komentarze

  • Ustawiłem to na 5Vpp, jednak przesunięcie + 2,5V powoduje fluktuacje w liczbie zliczeń i bez offsetu mam spójny odczyt liczby impulsów, czy to jest oczekiwane? tak myślę
  • Sprawdź poziomy wejściowe w Arduino. Niski poziom powinien znajdować się na (lub bardzo blisko) uziemienia, a wysoki powinien znajdować się blisko dodatniego zasilania Arduino ', które zakładam, że wynosi 5 V.

Odpowiedź

Zresetujesz IRQcount za każdym razem w pętli.

Komentarze

  • Myślę, że ' jest w porządku. Wyzeruj licznik, włącz przerwania, opóźnij, a następnie wydrukuj liczbę przerwań pod koniec opóźnienia.
  • To ' to nie problem.
  • Jakie są jednostki opóźnienia ()? Nie ' nie programuję Audrino, ale czy to tykanie czy ns?
  • @ mjh2007 milisekund, więc ' jest zdecydowanie wystarczająco długi.
  • Arduino delay() jest w ms.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *