logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Silnik krokowy - zmiana trybu pełnokrokowego na półkrokowy przyciskiem

Jakub17 14 Sty 2017 19:02 1512 21
  • #1 16199471
    Jakub17
    Poziom 6  
    Witam

    Silnik krokowy ma obracać się w prawo i w lewo (360 stopni w każdą stronę) w trybie pełnokrokowym, w momencie naciśnięcia i trzymania przycisku ma przejść do trybu półkrokowego i kontynuować obrót od miejsca w którym nastąpiło naciśnięcie przycisku innymi słowy silnik ma płynnie realizować ten sam tor lewo - prawo tylko w różnym trybie zależnie od stanu przycisku. Napisałem traki programik:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Działam na diodach narazie. Program po pewnym czasie w trybie półkrokowym "zawiesza się", tzn nie ma dalszych zmian kroków mimo puszczenia przycisku, palą się tylko 2 diody(które reprezentują jakiś krok) cały czas zamiast się zmieniać. Ma to prawdopodobnie związek z linią:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Dlaczego to nie działa?

    Kolejna sprawa to to że używam narazie nie pełnej tablicy w trybie półkrokowym:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    zamiast
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ze względu na to że tablice mają różne rozmiary to nie może to działa to dobrze w napisanym przeze mnie programie. Jakieś sugestię jak temu zaradzić?
    Dzięki za pomoc:)
  • #2 16199672
    BlueDraco
    Specjalista - Mikrokontrolery
    Wszystkie Twoje tablice są błędne. Zostaw jedną tablicę z ośmioma półkrokami. Sprawdzaj stan przycisku po wykoaniu tych kroków, które są pełnymi krokami (powinny to być parzyste kroki - 0, 2...). W zależności od stanu przycisku przeskocz z indeksem tablicy o 1 albo o 2.
  • #3 16200128
    Jakub17
    Poziom 6  
    Nie może być jedna tablica tak jak mówisz bo gdy będę chciał wrócić z trybu półkrokowego do krokowego to będzie problem z indeksami takiej tablicy żeby zachować płynny krok tzn.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Muszę uzależnić od siebie dwie zmienne: "i" i "k"
    A B C D
    0 2 4 6

    A(0) AB(1) B(2) BC(3) C(4) CD(5) D(6) AD(7) w nawiasie indeksy "i"


    I załóżmy że wychodzę z trybu półkrokowego gdy i=3 to gdzie trafie w trybie pełnokrokowym jak tam są tylko indeksy 0,2,4,6?
  • #4 16200443
    BlueDraco
    Specjalista - Mikrokontrolery
    No właśnie w tym celu MUSI być jedna tablica. Wyjść z trybu połówkowych kroków możesz tylko w pełnym kroku, czyli wykonujesz ten połówkowy do pełnego i dalej już pełne. Jak niby inaczej miałoby to działać?
  • #5 16200728
    namok
    Poziom 25  
    BlueDraco napisał:
    No właśnie w tym celu MUSI być jedna tablica. Wyjść z trybu połówkowych kroków możesz tylko w pełnym kroku, czyli wykonujesz ten połówkowy do pełnego i dalej już pełne. Jak niby inaczej miałoby to działać?
    Wcale nie musi być to jedna tablica. Agorytm dobrze opisałeś i można go zastosować dla dwu tablic gdzie naciśnięcie przycisku to tylko informacja że chcemy przełączyć tryb, a przełączamy w momencie gdy jesteśmy w właściwym miejscu w tablicy.
  • #7 16200910
    Freddie Chopin
    Specjalista - Mikrokontrolery
    adambehnke napisał:
    A ja mam inne pytanie:
    czy for(k=k*2;k<6;++k) działa?

    czy to: "++k" nie powinno wyglądać tak "k++"
    Kompilator nie sypie błędami?

    :)

    Faktycznie - dosyć zabawne. Zwłaszcza dlatego, że to perfekcyjnie poprawny kod, który zasadniczo jest nawet lepszy niż to co proponujesz jeśli ktoś programuje w C++.
  • #8 16200914
    dondu
    Moderator na urlopie...
    adambehnke napisał:
    czy to: "++k" nie powinno wyglądać tak "k++"
    Kompilator nie sypie błędami?

    Oj, podstawy: http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-operatory-inkrementacji.html

    Skompiluj w CManiaku kod:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wynik:

    Cytat:
    k = 0
    k = 1
    k = 2
    k = 3
    k = 4
    k = 5
  • #9 16200948
    Jakub17
    Poziom 6  
    namok napisał:
    BlueDraco napisał:
    No właśnie w tym celu MUSI być jedna tablica. Wyjść z trybu połówkowych kroków możesz tylko w pełnym kroku, czyli wykonujesz ten połówkowy do pełnego i dalej już pełne. Jak niby inaczej miałoby to działać?
    Wcale nie musi być to jedna tablica. Agorytm dobrze opisałeś i można go zastosować dla dwu tablic gdzie naciśnięcie przycisku to tylko informacja że chcemy przełączyć tryb, a przełączamy w momencie gdy jesteśmy w właściwym miejscu w tablicy.


    No własnie też nie do końca bo nie rozumiem dlaczego nie działa to w pierwszej wersji porogramu mianowicie:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Konkretnie chodzi tutaj o przerzucanie wartości i=k, dlaczego to nie działa? Problem jaki się pojawia opisałem wyżej. Po prostu po przeskoczeniu do tej pętli wykona się kilka kroków i nagle zatrzymuje się na jednym kroku i diody reprezentujące ten krok cały czas świeca bez względu na stan przycisku. Analizowałem to wielokrotnie i błąd mi umyka...

    Dodano po 2 [minuty]:

    dondu napisał:
    adambehnke napisał:
    czy to: "++k" nie powinno wyglądać tak "k++"
    Kompilator nie sypie błędami?

    Oj, podstawy: http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-operatory-inkrementacji.html

    Skompiluj w CManiaku kod:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wynik:

    Cytat:
    k = 0
    k = 1
    k = 2
    k = 3
    k = 4
    k = 5


    Nie rozumiem. Skoro k jest parzyste to jak może wyrzucać nieparzyste wyniki?
  • #11 16201103
    Jakub17
    Poziom 6  
    dondu napisał:
    Dlaczego w załączonym przeze mnie kodzie k nie miałoby być nieparzyste?


    No bo jest k=2*k. Dla k=0 zwracana wartosc to k=0. k zostaje zwiększone o 1 (k=1) następuje przejściu pętli - zwracana wartosć k=0. Następna iteracja i działanie k=2*1, sprawdzenie warunku i zwiększenie k (k=3) i wykonanie pętli - zwracana wartosc to k=2. Kolejna iteracja dla k=2*3, warunek nie spełniony.

    Czyli zwrócone wartości to k=0 i k=2.

    Wydawało mi się że tak to działa
  • Pomocny post
    #12 16201234
    nolens_volens
    Poziom 15  
  • #13 16201958
    dondu
    Moderator na urlopie...
    Jakub17 napisał:
    No bo jest k=2*k. Dla k=0 zwracana wartosc to k=0. k zostaje zwiększone o 1 (k=1) następuje przejściu pętli - zwracana wartosć k=0. Następna iteracja i działanie k=2*1, sprawdzenie warunku i zwiększenie k (k=3) i wykonanie pętli - zwracana wartosc to k=2. Kolejna iteracja dla k=2*3, warunek nie spełniony.

    Czyli zwrócone wartości to k=0 i k=2.

    Wydawało mi się że tak to działa

    Na początku k=0
    Następnie na początku pętli k=k*2=0*2=0

    Zaczynamy więc od k=0 kończymy na k<6, czyli k=5 inkrementując k o jeden za pomocą ++k za każdym wykonaniem kroku pętli.

    Poćwicz w CManiaku: http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-spis-tresci.html

    Czy teraz już rozumiesz?
  • #14 16202353
    Jakub17
    Poziom 6  
    dondu napisał:


    Czy teraz już rozumiesz?


    Tak rozumiem:) Kolega nolens_volens podrzucił bardzo pomocny link. Nie wziąłem pod uwagę że wyrażenie k=2*k jest wykonywane tylko raz na początku

    A możesz mi jeszcze powiedzieć jaki błąd jest w tym kodzie że nie wykonuje się poprawnie. Chodzi o to że psuje się to gdy przypisuje i=k

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #15 16202483
    nolens_volens
    Poziom 15  
    Jakub, coś namieszałeś z nawiasami, to pewne.
    To miała być pętla w pętli?
    I zastanów się co się dzieje z k.
  • #17 16202592
    nolens_volens
    Poziom 15  
    Ups, przeoczyłem nawias po if przed drugą pętlą :(
    Sorry

    Jakub please, formatuj porządnie kod.
    Porównaj proszę to co wkleiłeś z tym od Dondu.
  • #18 16202641
    BlueDraco
    Specjalista - Mikrokontrolery
    Zieeeew. A wystarczyloby:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #19 16202900
    trol.six
    Poziom 31  
    A co ma sterować tymi funkcjami ...
    Jakub17 napisał:
    Silnik krokowy ma obracać się w prawo i w lewo...


    ... plus ewentualnie start/stop.
  • #20 16204352
    Jakub17
    Poziom 6  
    dondu napisał:
    Nawiasy są prawidłowo jeśli o taki kod chodziło:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Psuje ... tzn?


    To znaczy chodzi o tą linie for(i=k;i<6;++i) . Gdy przerzucam wartość argumentu k do "i" żeby w pętla z argumentem "i" zaczęła się od miejsca od którego wyszedłem z pętli z argumentem k poprzez break, to pętla z argumentem i zatrzymuje się po na swoim ostatnim wyrazie elemencie CD i dalej nie rozpoczyna się od nowa gdy cały czas trzymam przycisk, nawet jak puszczę przycisk to program nie wraca do pętli z argumentem "i" tylko cały czas świecą się diody reprezentujące ostatni wyraz w tablicy polkrok[] czyli wyraz CD.
  • #21 16205032
    BlueDraco
    Specjalista - Mikrokontrolery
    Tak jest, bo tak to napisałeś. Z kroku o numerze 6 nigdy nie wyjdziesz. W programie jest cała masa błędów - złe tablice kroków, złe długości tych tablic, złe odliczanie. Rozwiązanie poprawne, z czterema linijkami kodu w jednej pętli i jedną 8-elementową tablicą połówkowych kroków, pokazałem, ale Ty w nie nie wierzysz i dalej próbujesz modyfikować kod ze stosem błędów.
    Potrzebujesz jednej tablicy z elementami [A, AB, B, BC, C, CD, D, DA].
  • #22 16210364
    BlueDraco
    Specjalista - Mikrokontrolery
    No to pomyśl, co się stanie, gdy k lub i osiągnie wartość 6.

    Rozmiar tablicy ma wielkie znaczenie, nbo żeby silnik krokowy działa, musi w kółko wykonywać 4 kolejne kroki, a nie trzy i potem przeskok - bo tego przeskoku nie bęDzie - będzie szarpanie. Nie możesz sobie dowolnie zmieniać sterowań silnika, one muszą być w określonym cyklu, np. nie możesz po A podać C, ani po D podać B, ani po AB - BC itd.. ZASADA działania silnika jest taka, że kroki muszą być wykonywane zawsze w takim cyklu, jak w mojej tablicy, przed którą się bezsensownie bronisz.

    Sprawdziłeś moją wersję, czy dalej masz zamiar biadolić, że kod z kupą błędów nie działa?
REKLAMA