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



Teraz jest 4 kwi 2026, o 06:19


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 26 maja 2014, o 20:41 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 29 sty 2014
Posty: 10
Lokalizacja: Lublin / Lubartów
Pomógł: 0

Zmajstrowałem mały układzik, który ma przy pomocy impulsatora (24 imp/obr) zmieniać cyfrę na wyświetlaczu. Impulsator podpięty pod piny przerwań zewnętrznych INT0 i INT1. Ma reagować na kierunek obrotów, tzn. jak kręcę w jedną stronę licznik rośnie, jak kręcę w drugą maleje. Przy przepełnieniu się resetuje (poniżej 0 => 9, powyżej 9 => 0). Schemat zmontowany, zasilanie filtrowane, ale jakoś nie chce działać. Licznik albo stoi w miejscu, albo zapycha jak potłuczony. Może coś poradzicie. Nie wiem czy to kwestia sprzętowa czy programowa.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


INT0 i INT1 wyzwalane zboczem opadającym (ale przy rosnącym było to samo)
Wstawiłem kondensatory przy impulsatorze (oba wyjścia) żeby zapobiec szpilkom, ale może za duże były (47 uF)?
Nie zwracajcie uwagi na kolejność cyfr - pomieszałem w podłączeniu i łatwiej było zmienić w kalkulatorze.

Będę wdzięczny za sugestie.

_________________
Lepiej kijek obcinkować niż go potem pogrubasić.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2014, o 21:32 
Offline
Użytkownik

Dołączył(a): 07 maja 2014
Posty: 43
Pomógł: 1

Pierwsze to raczej niepotrzebne są te opóźnienia, po drugie to uprość sobie kod do np pojedynczego przerwania i najprostszego w nim dodawania.
Poza tym to nie bardzo ustawiłeś te przerwania na zbocze opadające... a bardziej na zmianę stanu. Dlaczego używasz kodu szesnastkowego do deklaracji kierunku przycisku? nie prościej (1<<PXn)??



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2014, o 21:32 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 205
Lokalizacja: Poznań
Pomógł: 22

Jeśli impulsator to to samo co enkoder to polecam zaooznać się z tym jak on działa. W skrócie: jeśli obracasz w prawo to sygnał pojawia się najpierw na pinie A a następnie na pinie B, a jeśli kręcisz w prawo to najpierw pojawia się na B a następnie na A. Zależy także w jakim stanie znajdował się enkoder czy jego piny były zwarte do środkowego pinu czy znajdowały się w stanie wysokiej impedancji.
Żeby móc zliczyć wszystkie impulsy musisz znać tak jakby historię enkodera, stan w jakim się znajdował przed przekręceniem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2014, o 22:10 
Offline
Użytkownik

Dołączył(a): 22 mar 2014
Posty: 38
Lokalizacja: Bydgoszcz
Pomógł: 4

do tak prostych celów wystarczy wykorzystać jedno przerwanie, tak jak kolega napisał powyżej.
Niech będzie to INT0.
INT0-> A
Obrazek

wtedy próbkujemy stan PD3(INT1) w przerwaniu:
Kod:
ISR(int0_vect){
if(PIND & (1<<PD3)) numer++;
else numer--;
}


------------------------ [ Dodano po: 1 minucie ]

aha polecam jeszcze poczytać http://www.leniwiec.org/2014/04/28/enkoder-obrotowy-w-praktyce-prawidlowe-podlaczenie-do-mikrokontrolera-avr/


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2014, o 19:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2014
Posty: 279
Lokalizacja: Kraków
Pomógł: 4

ja sobie coś takiego skleciłem do enkodera

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


może się przyda ;)

_________________
http://forum.atnel.pl/topic15633.html



Ostatnio edytowano 28 maja 2014, o 23:23 przez Mellanogaster, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2014, o 20:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 lut 2013
Posty: 600
Pomógł: 47

Zerknij tutaj
http://mirekk36.blogspot.com/2013/04/en ... y-cz2.html
Mirek opracował fajną bibliotekę i poradnik w tym temacie.

_________________
https://www.instagram.com/myfirstquadcopter/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 maja 2014, o 07:29 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 29 sty 2014
Posty: 10
Lokalizacja: Lublin / Lubartów
Pomógł: 0

Dzięki wszystkim za pomoc. Szczególnie przydatne wskazówki od kolegi (a może koleżanki) no atnel no fun. Rzeczywiście przekombinowałem z dwoma przerwaniami, jedno zupełnie wystarczy. Sprawa druga, miałem również problem natury sprzętowej w postaci braku rezystora w odpowiednim miejscu. Na chwilę obecną układ działa, ale (no właśnie):

Zdarza się że kręcąc delikatnie gałką impulsatora (tak aby kontrolować przeskoki o 1), licznik przeskakuje nie o 1 ale o 2 lub 3.
Macie pomysł co może być przyczyną? Może odrobinę większe kondensatory zastosować przy końcówkach impulsatora (mam 100n)? A może po prostu sam model impulsatora jest jakiś trefny i spróbować na innym, jakimś "droższym i lepszym"?

a propos, tera program wygląda nastepująco:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pozdrawiam

_________________
Lepiej kijek obcinkować niż go potem pogrubasić.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 maja 2014, o 18:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Żeby sprawdzić czy za złe liczenie odpowiedzialne są
drgania styków możesz w przerwaniu wprowadzić
opóźnienie odczytu drugiego styku przed ifem
np. _delay_ms(20).

Ale tylko dla pewności nie pozostawiaj tam tej funkcji opóźniającej a
jeśli sytuacja Ci się poprawi to wtedy wykorzystaj timer lub inną funkcję nie blokującą
do niwelacji tych drgań



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 maja 2014, o 18:51 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 29 sty 2014
Posty: 10
Lokalizacja: Lublin / Lubartów
Pomógł: 0

Zaba napisał(a):
Żeby sprawdzić czy za złe liczenie odpowiedzialne są
drgania styków możesz w przerwaniu wprowadzić
opóźnienie odczytu drugiego styku przed ifem
np. _delay_ms(20).

Ale tylko dla pewności nie pozostawiaj tam tej funkcji opóźniającej a
jeśli sytuacja Ci się poprawi to wtedy wykorzystaj timer lub inną funkcję nie blokującą
do niwelacji tych drgań


Dzięki - spróbuję.

_________________
Lepiej kijek obcinkować niż go potem pogrubasić.



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: 9 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 8 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