Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 10 lip 2026, o 18:19


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 
Autor Wiadomość
PostNapisane: 22 lis 2015, o 17:29 
Offline
Nowy

Dołączył(a): 09 mar 2014
Posty: 14
Pomógł: 0

Witam mam problem z prawidłowym odczytywaniem stanów na INT0 i INT1. Napisałem program do dekodowania sygnałów z enkodera kwadraturowego, który działa prawidłowo ale tylko do pewnej prędkości obrotowej silnika. Tu fragment kodu:
Kod:
//INT0 interrupt
ISR(INT0_vect )
{
   if(bit_is_set(PIND, PD3))
      { licznik1++;
      kierunek = 0; } // prawo
   if(bit_is_clear(PIND, PD3))
      { licznik1--;
      kierunek = 1; } // lewo
}

//INT1 interrupt
ISR(INT1_vect )
{
   if(bit_is_set(PIND, PD2))
      { licznik1++;
      kierunek = 0; }
   if(bit_is_clear(PIND,PD2))
      { licznik1--;
      kierunek = 1; }
}

Jest to algorytm podwójnego dekodowania, gdzie INT0 wyzwalane jest zboczem opadającym a INT1 zboczem narastającym. Dodam jeszcze, że enkoder generuje 200 imp/obr a silnik obraca się maksymalnie z prędkością 3100 rpm czyli około 500 obr/sek co daje w przybliżeniu częstotliwość impulsu 10kHz. Wydaje mi się, że jeśli procesor jest taktowany czestotliwoscia 16MHz to na spokojnie te sygnały powinny być odczytywane, ale sie tak nie dzieje. Przy dużych predkosciach silnika w przerwanich wykonują sie zle warunki tzn pomimo że silnik obraca sie w prawo, algorytm raz na jakis czas wysyła sygnał, że silnik obraca sie w lewo. Czy jest to wina tego, że procesor nie wyrabia się z wykonaniem przerwania czy po prostu enkoder generuje czasem zle sygnały? Z góry dzieki za pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lis 2015, o 21:04 
Offline
Nowy

Dołączył(a): 24 wrz 2015
Posty: 14
Lokalizacja: Oława
Pomógł: 3

Jaki typ sterownika? Może być wiele przyczyn. Przychodzą mi do głowy: piorytety przerwań, atomowość wykonania obsługi przerwania, rozmiar wygenerowanego kodu obsługi przerwania. Jak są zdefiniowane zmienne licznik i kierunek? Lepsze jest wstawienie komendy else zamiast dwa razy sprawdzać ten sam pin. Spróbuj tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO