Skocz do zawartości

Funkcja Input Capture w Arduino


Pomocna odpowiedź

Cześć, 

czy ktoś może korzystał z funkcji ICP na Arduino UNO w celu pomiaru czasu trwania impulsu? Można prosić o przykładowy kod z wyjaśnieniem? 
Z góry bardzo dziękuję.

Link to post
Share on other sites
  • Gieneq zmienił tytuł na: Funkcja Input Capture w Arduino

Chyba malo osob z tego korzysta...szczerze to ja dopiero teraz sie dowiedzialem ze cos takiego istnieje...😉 a nie mozesz mierzyc tego impulsu z uzyciem przerwan??

Link to post
Share on other sites
29 minut temu, farmaceuta napisał:

Chyba malo osob z tego korzysta...szczerze to ja dopiero teraz sie dowiedzialem ze cos takiego istnieje...

I to jest wada arduino.

35 minut temu, farmaceuta napisał:

a nie mozesz mierzyc tego impulsu z uzyciem przerwan??

ICP jest przerwaniem które można konfigurować na zbocze narastające lub opadające albo oba naraz. Nie wiem jak obsługuje to arduino ale mogę pokazać kod w C jak to się "drzewniej" robiło 😉 Choć może lepiej zobacz sobie na tę stronę https://www.electronicwings.com/avr-atmega/atmega1632-timer-input-capture-mode

 

 

  • Lubię! 2
Link to post
Share on other sites
1 minutę temu, _LM_ napisał:

ICP jest przerwaniem które można konfigurować na zbocze narastające lub opadające albo oba naraz.

Zaraz zaraz...ale zwykle przerwania zewnetrzne tez tak mozna konfigurowac...nawet biblioteka do PCINT tez to umozliwia...no chyba ze cos mi umknelo...😉

Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

Tak to prawda, jednak ICP ma taką właściwość że przechwytuje stan timera w locie i potrzebuje do tego mniej instrukcji niż obsługa przerwanie PCINT nie mam teraz tego jak pokazać, dokładniej jest to opisane w pdf atmegi. 

Edytowano przez _LM_
Link to post
Share on other sites
2 minuty temu, _LM_ napisał:

Tak to prawda, jednak ICP ma taką właściwość że przechwytuje stan timer w locie i potrzebuje do tego mniej instrukcji niż obsługa przerwanie PCINT nie mam teraz tego jak pokazać, dokładniej jest to opisane w pdf atmegi. 

Ok lapie cokolwiek😉 no nic...kolega wyzej musi sie odezwac i powiedziec jakiej dokladnosci oczekuje, bo nawet PCINT ktore jest wolniejsze niz przerwanie zewnetrznie potrzebuje kilku mikrosekund wiec do wiekszosci zastosowan to napewno wystarczy..

Link to post
Share on other sites
(edytowany)

Dodatkowo o ile pamiętam to ICP może być wewnętrznie podłączony do komparatora analogowego lub nawet przetwornika ADC co znacznie zwiększa jego możliwości. Ogółem bardzo fajny jest ten timer czasem wykorzystuje się go do dekodowania ramek z pilota IR. Możesz też użyć go do pomiaru prędkości obrotowej jakiegoś silnika itd...

Edytowano przez _LM_
Link to post
Share on other sites
3 minuty temu, farmaceuta napisał:

no nic...kolega wyzej musi sie odezwac i powiedziec jakiej dokladnosci oczekuje

Tak liczę że sprawdzi link który podałem i będziemy mieli jakiś punkt odniesienia w dyskusji 🙂

Link to post
Share on other sites

Witam Panowie. Generalnie napotkałem problem odbierania komend z pilota IR, kiedy wywołuję funkcję do pomiaru odległości z czujnika HC-SR04. Mój robot przestaje reagować na komendy wysyłane przez pilot telewizyjny, ponieważ prawdopodobnie program przez większość czasu liczy odległość. Dokopałem się do informacji, że można to rozwiązać właśnie taka funkcją, natomiast jestem laikiem w tym temacie i poszukuję informacji... 

Link to post
Share on other sites
(edytowany)

Niestety ta strona (tj kod tam zamieszczony) którą ci podałem nie używa przerwań i wgl ten program jest do kitu napisany. Więc coś ode mnie możliwe że popełniłem  błedy gdyż tego kodu nie sprawdzam. Aby skonfigurowac timer musisz:

	PORTB|=(1<<PB0); // icp na pb0
	TCCR1B|=(1<<CS11)|(1<<CS10); // prescaler 1024
	TCCR1B&=~(1<<ICES1); // zbocze opadające
	TIMSK|=(1<<TICIE1); //  enable ICP intterrupt
	TIMSK|=(1<<TOIE1); // przerwanie od przepełnienia
sei();

To jest konfiguracja następnie przerwanie:

ISR(TIMER1_CAPT_vect){ // przerwanie od przechwytu
// tutaj możesz odczytać przechwyconą wartość timera1
  static uint16_t val = TCNT1;
// w ten sposób możesz odwrócić na zbocze narastające
  TCCR1B &=~(1<<ICES1);
// lub za pomocą toggle wtedy za każdym razem przerwanie będzie działało na zboczu przeciwnym
  TCCR1B^=(1<<ICES1);
}
ISR(TIMER1_OVF_vect){ // przerwanie od przepełnienia 
}

Mam nadzieję że łapiesz

I jeszcze notka od Atmela jak się za to zabrać klik

Edytowano przez _LM_
Link to post
Share on other sites
(edytowany)

IR mam na płytce i jest skonfigurowane jako DI2.

Serdeczne dzięki za pomoc, jestem bardzo wdzięczny! W prawdzie nie rozumiem wszystkiego, ale po prostu będę musiał jeszcze poczytać o tym. 

W razie problemów, napiszę tutaj.

Edytowano przez ximot
Link to post
Share on other sites

Jak ten kod, który zamieściłeś powyżej ma się w czasie do obsługi funkcji czujnika SR04?
 

// funkcja do obsługi czujnika odległości zwracająca odległość do przeszkody
int DistanceSensor ()
{

digitalWrite (TRIG, LOW);                                // zmiana stanu sygnału z wysokiego na niski na wyjściu TRIG powoduje wyzowlenie pomiaru
delayMicroseconds (5);
digitalWrite (TRIG, HIGH);
delayMicroseconds (15);
digitalWrite (TRIG, LOW);

measured_time = pulseIn(ECHO, HIGH);                    // dokonanie pomiaru czasu trwania impulsu na wyjściu ECHO
measured_distance = measured_time / 58 ;                // zmierzony czas podzielony przez 58 daje odległość w cm

return measured_distance;

}

Czemu ta manklatura użytego przez Ciebie kodu jest taka... inna? Gdzie można znaleźć opis użytych przez Ciebie symboli i znaków?
O co chodzi z tym przerwaniem od przepełnienia i prescalerem? 

Link to post
Share on other sites

To są typowe operacje na rejestrach mikrokontrolera. Operatory których użyłem są operatorami logicznymi np << przesuwanie bitowe, ^ negacja itd. 

7 minut temu, ximot napisał:

O co chodzi z tym przerwaniem od przepełnienia i prescalerem?

Prescaler to dzielnik impulsów które później są zliczane przez timer. Czyli jesli twój mikrokontroler pracuje z kwarcem 16Mhz to prescaler dzieli wstępnie tę częstotliwość aby nie było potrzeba zbyt często wywoływać przerwań od przepełnienia(o tym za chwilę). Więc timer pracuje na częstotliwości 16Mhz/1024 15.625kHz. Jego pojemność to 16bit czyli maksymalnie zlicza do 65536 gdy doliczy do tej wartości zgłasza przerwanie czyli funkcję która wykonuje się jakby poza programem głównym. I liczy sobie dalej. Ja uczyłem się pisać w C więc nie znam wszystkich niuansów bibliotek Arduino. Co do linków mogę polecić: http://mikrokontrolery.blogspot.com/ Nie wiem w którą stronę chcesz skierować swoją drogę nauki i rozwoju chodzi o to że może warto zainwestować w jakąś książkę?

 

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...

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.