Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Kategoria: Akumulatorki / Baterie / Ładowarki

Silnik krokowy - brak synchronizmu kroków

Jakub17 15 Lut 2017 22:32
  • #1 15 Lut 2017 22:32
    Jakub17
    Poziom 6  

    Witam.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Mam taki problem. Silnik się obraca ale jest zauważalny tak jakby przeskok pod koniec funkcji obrot(). Pokazane na filmiku. Dlaczego tak sie dzieje?
    Jak użyję instrukcji które są zakomentowane w pętli while() to nie ma takiego przeskoku i wszystko działa płynnie. Ale ja chce miec funkcje odpowiedzialne za obrot bo program zamierzam wzbogacić o zmiane kierunku obrotu itp. ale jak widać na razie mam problem z tym by każdy krok silnika był wykonywany w równym odstępie.

    Tutaj filmilk
    https://www.youtube.com/watch?v=TtJ-EBm3PqU

    Zmienna kr jest najpierw zwiększana a póżniej porównywana więc gdy wykona się KROK4 (kr=3) to zmienna kr zostanie zwiększona do 4 i tym samym wyzerowana i powinien wykonać się KROK1 po uprzednim odczekaniu 100 ms. Coś źle rozumiem?

  • Pomocny post
    #2 15 Lut 2017 22:42
    Piotrus_999
    Poziom 38  

    z kazdym krokiem delay jest dłuższy o 100ms. Zresztą nie - on jest dużo głuższy zawsze bo wszystkie delaye się wykonują.

    Takie definicje jak krokx są złe z zasady.

    Klaczego zmienną kr definiujesz 2 razy i do tego jej nie inicjalizujesz??

  • Pomocny post
    #3 15 Lut 2017 22:44
    BlueDraco
    Specjalista - Mikrokontrolery

    1. Masz błędne sterowania dla poszczególnych kroków.

    2. Funkcja obrót() ma różny czas opóźnienie po poszczególnych krokach. Pomiędzy 4. i 1. czas ten wynosi 200 ms, a pomiędzy 1 i 2 - 600 ms.

  • #4 16 Lut 2017 06:12
    Jakub17
    Poziom 6  

    Teraz jest już dobrze?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Faktycznie z tym _delay_ms() mój błąd polegał na tym że niewykonanie danego warunku if wcale nie wiąże się z nie wykonaniem _delay_ms(). Błąd w definicji kr wynikał z tego że wielokrotnie modyfikowałem program szukając przyczyny i prawdopodobnie zapomniałem usunąć tej definicji w main(). Zmienna globalna jest inicjalizowana zerem więc teraz jest chyba dobrze.
    A z tym błędnym sterowaniem to chodziło o to, że nie załączałem fazy w drugim uzwojeniu czy o coś innego Wam chodziło? Celowo nie dodałem załączania tych faz, żeby sobie nie komplikować na początku z przekładaniem przewodów (bo niestety miałem duży problem z podłączeniem poprawnie krokowca), zamierzałem później to poprawić.

    Ale zauważyłem że w tym moim poprzednim sterowaniu jeden krok jest większy od drugiego tzn. tak jakby było pomieszanie sterowania krokowego z półkrokowym

  • #5 16 Lut 2017 08:42
    BlueDraco
    Specjalista - Mikrokontrolery

    1. W silniku krokowym normalnie sterowanym zawsze pracują dwa uzwojenia - teraz w Twoim kodzie z grubsza tak jest. Gorzej, że u Ciebie pracują chwilami trzy uzwojenia, w tym dwa naprzeciw sobie - bo najpierw załączasz nowe, a potem wyłączasz stare.
    2. Zastanów się, cz zmienna kr może mieć równocześnie dwie różne wartości -Twój kod jest napisany tak, jakby mogła mieć cztery różne wartości, bo po sprawdzeniu, że jest równa 0, sprawdzasz, czy jest równa 1, 2 i 3.
    3. Tego się nie robi z delay(), tylko w przerwaniu timera.
    4. Sterowania dla silnika należy zapisać w tablicy indeksowanej zmienną kr - wtedy nie będą potrzebne żadne if ani switch do wystawianai sterowań.

  Szukaj w 4mln produktów
Przeglądaj produkty