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

Atmega8 - Silnik bipolarny z MTD2003, problem z kierunkiem obrotów

Vitling 30 Gru 2014 00:01 1263 11
REKLAMA
  • #1 14270240
    Vitling
    Poziom 9  
    Witam!
    Od kilku dni zmagam się z napisaniem programu, który sterowałby silnikiem krokowym bipolarnym wyciągniętym ze starej drukarki. Silnik sterowany jest układem MTD2003, który także był w drukarce. Problem polega na tym, że obraca się o parę stopni w jedną stronę, a następnie znów wraca. Czy byłby ktoś w stanie stwierdzić, co źle napisałem?

    Od PC0 do PC3 to po kolei wyjścia sterujące cewkami. PC0 i PC1 to jedna cewka, kolejne to druga.

    Pozdrawiam.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 14270258
    piotrva
    VIP Zasłużony dla elektroda
    Weźże zapisz te wartości binarne normalnie, z przesunięciami bitowymi, co?
  • REKLAMA
  • #3 14270283
    Vitling
    Poziom 9  
    Wiem po części o czym piszesz, wiem że istnieje takie coś jak przesunięcia bitowe, jednak ciężko mi się w tym połapać. Nie mam zbytniego doświadczenia w pisaniu programów, brakuje mi pomysłu. Napisałem to według mnie najprościej, tak tylko umiałem. Lecz chyba w ten sposób napisany program też miałby szansę funkcjonować, gdyby miał w odpowiedniej kolejności chyba stany logiczne, jednak tu ja już wymiękam. Jeśli się mylę to przepraszam, z niewiedzy się to mojej wzięło.
  • #4 14270320
    piotrva
    VIP Zasłużony dla elektroda
    Problemem jest to, że właśnie w takim programie jest się ciężko połapać, bo dane nie są czytelne.
    Jedno co mi się rzuca na pierwszy rzut oka - pętla powinna być symetryczna, a jej 2 pierwsze linijki nie są rozdzielone opóźnieniem...
  • REKLAMA
  • #5 14270346
    Vitling
    Poziom 9  
    I to że nie są rozdzielone było zamierzone... dwie pierwsze linijki ustawiają stany logiczne, jakie według mojej teorii powinny występować na samym początku. Pisząc program dalej zauważyłem że zmienia się tylko zawsze jeden stan logiczny, więc dlatego na początku są dwie linijki, a dalej po jednej... A opis każdej linijki jest pewny, sprawdzany kilka razy. Po samym nawet opisie nie można stwierdzić, czy stany logiczne są w odpowiedniej kolejności? Opisy są moim zdaniem dość przejrzyste akurat.
  • #6 14270502
    linuxtorpeda
    Poziom 26  
    PORTC &= 0x10; // ustawia PC5 stan L


    To tak nie działa, reszta &= też pewnie nie działa tak, jak myślisz.
  • REKLAMA
  • Pomocny post
    #8 14270757
    BlueDraco
    Specjalista - Mikrokontrolery
    Problem leży zarówno w błędnych operacjach bitowych, jak i w błędnym sterowaniu silnikiem.

    Na początek powinieneś nim sterować w czterech, a nie ośmiu krokach.

    Najprościej przy każdym kroku wyzerować niepotrzebne dłużej sterowania, a potem ustawić dwa odpowiednie bity, czyli
    PORTC &= 0xf5;
    PORTC |= 0x5;

    A dla kolejnych trzech kroków zamiast cyfry 5 w obu instrukcjach powinna być cyfra 9, A i 6.
  • #9 14270848
    piotrva
    VIP Zasłużony dla elektroda
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    no na moje oko ta instrukcja steruje pinem innym niż PC4 - moim zdaniem raczej PC5.
    I tak, wczoraj tego nie zauważyłem, że instrukcje kasowania wg. Ciebie robią zupełnie co innego.

    Dodano po 3 [minuty]:

    BlueDraco napisał:
    Najprościej przy każdym kroku wyzerować niepotrzebne dłużej sterowania, a potem ustawić dwa odpowiednie bity, czyli
    PORTC &= 0xf5;
    PORTC |= 0x5;

    Ale z drugiej strony takie działanie spowoduje powstanie szpilek na liniach sterujących - owszem, krótkich, które powinny zginąć odfiltrowane przez resztę układu, ale mimo wszystko...
  • Pomocny post
    #10 14271080
    szymonjg
    Poziom 16  
    Właściwie artykuł o Ustawianiu i zerowaniu bitów podesłany przez kolegę 2rs232 już wyczerpał temat ale wrzucę też swoje źródło tej wiedzy w postaci artykułu o operacjach bitowych używanych w języku C

    Jak już trochę poczytasz i zrozumiesz to przeanalizuj poniższy przykład.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    To samo (chyba, że gdzieś się pomyliłem) w liczbach szesnastkowych jak by ktoś się przy nich upierał

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

    I to powinno rozwiązać twój problem.
    Sterowanie pół krokowe zostawiam Ci jako pracę domową.

    Cytat:
    Ale z drugiej strony takie działanie spowoduje powstanie szpilek na liniach sterujących - owszem, krótkich, które powinny zginąć odfiltrowane przez resztę układu, ale mimo wszystko...
    .
    Jak podczas sterowania takim silnikiem starać się pozbyć tych szpilek?
  • Pomocny post
    #11 14271109
    piotrva
    VIP Zasłużony dla elektroda
    Trzeba wtedy trochę pomanipulować operacjami bitowymi:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    ta komenda po kolei:
    bierze aktualny stan portu C
    kasuje bity 0..3 (tzw. maskowanie)
    ustawia bity 0, 3
    zapisuje wynik działania do PORTC

    Operacja jest rozbijana na więcej instrukcji ASM, ale w efekcie nie ma żadnych szpilek.
  • #12 14271449
    Vitling
    Poziom 9  
    Dziękuję wszystkim za poświęcony czas. Wszyscy pomogliście mi, aby mój program prawidłowo sterował silnikiem. Wytknięcie mi nieczytelności kodu i zachęcenie do stosowania przesunięć bitowych wezmę pod uwagę oczywiście. Ogromnym postępem dla mnie, było skompilowanie programu szymonjg (brakowało tam na samym początku średnika, ale to akurat byłem w stanie ogarnąć :D ), silniczek ruszył i kręcił się w lewo, generalnie właśnie o to mi chodziło w tym temacie. Pracę domową ze sterowaniem pół krokowym postaram się odrobić. A co do szpilek na liniach sterujących, dobrze wiedzieć, jednak popracuję najpierw nad podstawami, potem dopiero będę myślał o ich wyeliminowaniu :)
    Jeszcze raz dziękuję i pozdrawiam.

    Temat uważam za zamknięty.
REKLAMA