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



Teraz jest 23 kwi 2024, o 19:35


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 5 mar 2018, o 09:23 
Offline
Nowy

Dołączył(a): 30 maja 2017
Posty: 7
Pomógł: 0

Witam,

Korzystając z zestawu ATB 1.05. i sterownika A4988 chciałbym zrobić program sterujący silnikiem krokowym bipolarnym. Na początek napisałem sobie kod, który w kółko kręci silnikiem w jedną stronę.

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


Teraz chciałbym w pierwszej kolejności uzyskać sterowanie tego silnika z dwóch przycisków, potem napisać funkcje do wykonywania skończonej ilości kroków, ale nie mam pomysłu, jak do tego się zabrać. Czy mogę prosić o jakieś podpowiedzi?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 mar 2018, o 12:31 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 230
Pomógł: 26

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

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 mar 2018, o 09:04 
Offline
Nowy

Dołączył(a): 30 maja 2017
Posty: 7
Pomógł: 0

Powyższy kod działa, przepisywałem go na forum z telefonu, może wtedy jakiś błąd popełniłem. W każdym razie silnik się kręci, no ale "jak głupek" - cały czas z jedną prędkością.

Znalazłem taki fajny przykład:

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


Jest on napisany dla sterowania przy pomocy podwójnego mostka H i trochę innego procesora. Usiłowałem go przerobić na potrzeby sterownika A4988 i ATmegi32, popełniłem coś takiego:

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


Oczywiście nie działa. Bardzo proszę o jakąś podpowiedź. Prawdopodobnie popełniam błąd gdzieś w obsłudze Timera, podejrzewam błędną jego inicjalizację, ale nie mogę sobie z tym poradzić.

EDIT: W pierwotnej wersji pomieszałem ze sobą dwa tryby timera - jeden ustawiałem, a dla drugiego pisałem funkcję obsługi przerwania :oops: Kod powyżej jest już poprawiony i działa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 mar 2018, o 16:03 
Offline
Nowy

Dołączył(a): 30 maja 2017
Posty: 7
Pomógł: 0

Kontynuuję zabawę z silnikiem i napotkałem kolejny problem. Opanowałem już jego obroty z rampą trapezową. Działające fragmenty kodu:

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


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


Po wywołaniu funkcji w mainie silnik wykonuje 8 obrotów w prawo, zatrzymuje się na sekundę, wykonuje 8 obrotów w prawo itd. W dalszym etapie chciałem pokazać na wyświetlaczu LCD (z wykorzystaniem bibliotek z BlueBooka) ilość wykonanych obrotów, przechowywaną w zmiennej stepCounter. W tym celu dopisałem do procedury obsługi przerwania co następuje:

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


Po tych modyfikacjach (to jedyne zmiany w stosunku do działającego kodu, nie licząc deklaracji zmiennych) silnik kręci się w nieskończoność w jednym kierunku. Bardzo proszę o podpowiedź.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 mar 2018, o 19:21 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2561
Pomógł: 126

Obsługi LCD nie dajemy w przerwaniu bo zajmuje bardzo dużo czasu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 mar 2018, o 20:49 
Offline
Użytkownik

Dołączył(a): 22 gru 2013
Posty: 296
Lokalizacja: Szczecin
Pomógł: 47

A nawet po przeniesieniu do main poniższy kod jest grubo nieoptymalny (po przeanalizowaniu powinieneś wiedzieć dlaczego)

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  
PostNapisane: 13 mar 2018, o 21:49 
Offline
Nowy

Dołączył(a): 30 maja 2017
Posty: 7
Pomógł: 0

Mam kolejne pytanie - tym razem chciałbym funkcję trapezoidMove napisać w taki sposób, aby mogła obsługiwać więcej niż jeden silnik, czyli funkcja przyjmuje jako argument jakąś zmienną reprezentującą dany silnik, a w przerwaniu zmienia się stan pinu przypisanego do niego. Jak do tego podejść?

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


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  
PostNapisane: 19 mar 2018, o 16:55 
Offline
Nowy

Dołączył(a): 30 maja 2017
Posty: 7
Pomógł: 0

Przepraszam za dwa posty pod sobą, ale chciałbym odświeżyć temat (może tym razem ktoś się pokusi o podpowiedź). Walczę ze sterowaniem kilkoma silnikami, na tę chwilę udało mi się to rozwiązać w tak prymitywny sposób. Załączam cały kod, z jakiego korzystam dla pełnego obrazu sytuacji.

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


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


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


Kod niby działa - funkcja główna powoduje po kolei obroty czterech silników, ale chciałbym to zrobić w bardziej fachowy sposób. Jak inaczej, korzystając z przedstawionych funkcji narzucać programowi konkretny pin, którego stan będzie zmieniał?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 mar 2018, o 20:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Musisz zmienić całkowicie podejście, bo tak nie zrobisz poprawnie i uniwersalnie sterowania silnikami. Szczególnie jak mają one być sterowane w tym samym czasie ale niezależnie. Sposobów jest wiele, jak wielu jest piszących programy :).
Na pewno nie możesz timera startować i stopować konkretnym silnikiem, bo w tym samym czasie możesz potrzebować go dla innego silnika.
Proponuję Ci najpierw zrezygnować z rampy a zrobić poprawne niezależne sterowanie kilkoma silnikami z dowolnie wybieranymi prędkościami. A dopiero potem dodać rampę.
Na początek proponowałbym Ci, aby timer tylko odliczał kolejne interwały - ustawiony na stałe na największą możliwość zmiany kroku. A następnie dla każdego takiego interwału - tyknięcia, sprawdzał czy masz wykonać jaką akcję dla silników - po kolei dla każdego. Prędkość będzie wtedy określana co ile tyknięć masz robić zmianę stanu - jak co tyknięcie, to masz maksymalną prędkość jak co np. 10 to prędkość jest 1/10 maksymalnej.

--
Pozdrawiam,
Robert



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 2 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO