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:
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
Odpowiedź
- 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 !! - 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.
pinMode(pin, mode)
?