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

[Rozwiązano] Nierówna praca Nema17 z DRV8825 i Arduino - jak ustabilizować?

Belialek 03 Kwi 2019 19:21 1611 15
REKLAMA
  • #1 17884041
    Belialek
    Poziom 22  
    Posty: 977
    Pomógł: 19
    Ocena: 124
    Witam,

    Steruję silnikiem krokowym (Nema17) za pomocą sterownika DRV8825 wykorzystując język Arduino. Mam problem z uzyskaniem równej pracy silnika - przykładowy film (proszę oglądać z dźwiękiem) tej nierównej pracy poniżej.





    Przykładowy kod:

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


    Czy coś robię nie tak, czy silniki krokowe tak mają? Tą małą zębatką poruszam większą, powstają straszne wibracje i hałas jakby traktor jechał - myślałem, że to kwestia spasowania zębów, ale jak widać to sam silnik powoduje takie objawy...
  • REKLAMA
  • #2 17884222
    Konto nie istnieje
    Poziom 1  
  • #3 17884265
    Belialek
    Poziom 22  
    Posty: 977
    Pomógł: 19
    Ocena: 124
    khoam napisał:
    Nie ma takiego języka.

    Mój błąd - chodziło mi o środowisko Arduino (chociaż wykorzystuję swoją płytkę z Atmega32).

    Przeniesienie tej linijki do setup() nie wyeliminowało tej przypadłości - dalej klekota :) Swoją drogą, dałem ją tam, bo w docelowym programie prędkość definiuje użytkownik i w wywołaniu jest zmienna zamiast liczby.

    No nic, przetestuję jeszcze te przykłady i dam znać.
  • REKLAMA
  • #5 17884607
    krzysiek_krm
    Poziom 40  
    Posty: 4612
    Pomógł: 716
    Ocena: 599
    Prawdę mówiąc nie znam tej biblioteki więc jest to trochę strzał w ciemno, tak czy siak musiałbyś dokładnie zapoznać się z tą biblioteką.
    Moim zdaniem wibracje biorą się stąd, że w nieskończonej pętli while(1) wykonujesz metodę "rotate" z argumentem 50, która obraca silnik o 50 "czegoś" i jest zamkniętą operacją: start - obrót - stop. Ponieważ pędzisz ją w kółko w nieskończonej pętli silnik sprawia wrażenie jakby obracał się bez przerwy ale te zatrzymania i starty są odczuwane jako wibracje.
    Prawdopodobnie do kręcenia silnikiem w kółko jest w tej bibliotece jakaś inna metoda (albo i nie).
  • #6 17884652
    Belialek
    Poziom 22  
    Posty: 977
    Pomógł: 19
    Ocena: 124
    504651921 napisał:
    Zupełnie zły kod już od pierwszej linii

    #include "DRV8825.h


    Zmieniłem, ale w moim przykładzie dalej ni przyniosło efektu. Skompilowałem ten przykład:

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


    I prawie wszystko jest OK - ruch silnika jest płynny, fajne opcje przyspieszenia/zwolnienia ale niestety nie działa mi odłączenie silnika... W poprzedniej wersji miałem zdefiniowany pin ENABLE, na który podawałem LOW (żeby włączyć) lub HIGH (żeby wyłączyć cewki) - tutaj powinna za to odpowiadać funkcja
    stepper.disable();
    ale w dalszym ciągu po wykonaniu obrotu cewki są pod napięciem i silnik jest zablokowany. W komentarzach jest adnotacja, że jak się nie wykporzystuje pinu SLEEP tylko ENABLE (u mnie tak jest) to trzeba od-komentować linijkę
    stepper.setEnableActiveState(HIGH);
    niestety wtedy kompilator mi zwraca błąd:

    
    'class DRV8825' has no member named 'setEnableActiveState'
    


    i za bardzo nie mam pomysłu co z tym zrobić, a zauważyłem że na "postoju" silnik z cewkami pod napięciem się bardzo grzeje.
  • REKLAMA
  • #8 17884830
    Belialek
    Poziom 22  
    Posty: 977
    Pomógł: 19
    Ocena: 124
    jutro dopiero sprawdzę - a czy mogę mieć jednocześnie bibliotekę DRV8825.h i BasicStepperDriver.h? BO w zasadzie tylko tego odłączenia cewek mi brakuje - reszta już działa...
  • #10 17884843
    Belialek
    Poziom 22  
    Posty: 977
    Pomógł: 19
    Ocena: 124
    Hmm sugerowałem się tymi komentarzami w kodzie:

    * Choose one of the sections below that match your board
  • Pomocny post
    #11 17885271
    Konto nie istnieje
    Poziom 1  
  • #12 17885358
    Belialek
    Poziom 22  
    Posty: 977
    Pomógł: 19
    Ocena: 124
    khoam napisał:
    Reinstalowałbym bibliotekę StepperDriver tak, na wszelki wypadek.


    Zaktualizowałem zarówno DRV8825 jak i StepperDriver - teraz kompilacja idzie normalnie, dziękuję!

    Teraz tylko zastanawiam się, w jaki sposób przerobić to na funkcje - nie chciałbym aby program leciał po prostu w pętli głównej... Ogólnie chciałem uzyskać efekt ciągłego obrotu, który trwa do momentu wciśnięcia przycisku (opuszczenie funkcji). Coś w tym stylu - pod wieczór będę mógł się rozłożyc z układem, więc póki co kombinuję "na sucho" ;)

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


    Nie wiem czy mogę kontynuować tutaj, czy zakładać nowy temat?
  • REKLAMA
  • Pomocny post
    #13 17885370
    Konto nie istnieje
    Poziom 1  
  • #14 17887417
    Belialek
    Poziom 22  
    Posty: 977
    Pomógł: 19
    Ocena: 124
    OK, podłączyłem układ - wszystko działa fajnie, tylko cały czas mam problem z zasilaniem po zakończeniu pracy. W moim pierwszym programie po porstu podawałem na pin "ENABLE" stan niski aby zasilić cewki a stan wysoki aby je wyłączyć. Niby w dalszym ciągu ten sposób, ale jak już coś robić to dobrze :)

    W podlinkowanych przykładach konfiguracja silnika wygląda następująco:

    #include "DRV8825.h"
     #define MOTOR_STEPS 200
     #define DIR 18
     #define STEP 17
     #define SLEEP 13 // optional (just delete SLEEP from everywhere if not used)
     #define MODE0 14
     #define MODE1 13
     #define MODE2 12
     DRV8825 stepper(MOTOR_STEPS, DIR, STEP, SLEEP, MODE0, MODE1, MODE2);


    Z pinu SLEEP nie korzystam, korzystam za to z ENABLE - i wykonuję to co jest opisane w komentarzu, tj:

    
    // if using enable/disable on ENABLE pin (active LOW) instead of SLEEP uncomment next line
    //stepper.setEnableActiveState(LOW);
    stepper.enable();
    


    Czyli analogicznie stepper.setEnableActiveState(HIGH); powinno odłączyć zasilanie a tak się nie dzieje. Wg mnie brakuje w konfiguracji i samym wywołaniu silnika tego parametru ENABLE, ale nie mogę nigdzie znaleźć jak to zrobić... Oczywiście zwykłe "digitalWrite(pin_enable, HIGH);" załatwia sprawę, ale chciałbym zrobić to wszystko wykorzystując tylko tą bibliotekę...
  • Pomocny post
    #15 17887447
    Konto nie istnieje
    Poziom 1  
  • #16 17887489
    Belialek
    Poziom 22  
    Posty: 977
    Pomógł: 19
    Ocena: 124
    Dzięki!

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


    Przy takiej konfiguracji działają funkcje stepper.enable(); oraz stepper.disable(); :)

    Bardzo dziękuję wszystkim za okazaną pomoc. Temat uznaję za zamknięty, a ja wyniosłem cenną lekcję - czytać źródła dołączanych bibliotek :)

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik ma problem z nierówną pracą silnika krokowego Nema17 sterowanego przez DRV8825 przy użyciu Arduino. W dyskusji zasugerowano, że problem może wynikać z błędnego umiejscowienia wywołania metody `stepper.begin()` w kodzie, które powinno być umieszczone w funkcji `setup()`, a nie w nieskończonej pętli `loop()`. Użytkownik przetestował różne przykłady kodu, w tym konfiguracje z użyciem bibliotek DRV8825 oraz A4988. Ostatecznie, po aktualizacji bibliotek, udało mu się skonfigurować poprawnie funkcje `stepper.enable()` i `stepper.disable()`, co poprawiło działanie silnika. Użytkownik podkreślił znaczenie czytania dokumentacji dołączonych bibliotek.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA