Problem ze sterowaniem silnikiem krokowym

Dyskusje o programowaniu mikroprocesorów.

Autor tematu
Bochen625
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 5
Posty: 5
Rejestracja: 20 gru 2015, 14:59
Lokalizacja: Wwa

Problem ze sterowaniem silnikiem krokowym

#1

Post napisał: Bochen625 » 20 gru 2015, 15:11

Witam.
Jestem w trakcie budowania bardzo prostej konstrukcji, która napędzana będzie silnikiem krokowym. Program piszę na Arduino i chcę aby sterowanie silnikiem odbywało się za pomocą joysticka, który jak wiadomo jest potencjometrem. Tak wygląda kod funkcji, która odpowiada za sterowanie.

void manualMode()
{
int value = 0;
int kierunek;
int predkosc;

value = analogRead(sensorX);

if(value > 540)
{
predkosc = map(value, 540, 1023, 0, 100);
kierunek = 1;
}

if(value > 440 && value < 540)
{
predkosc = 0;
}

if(value < 440)
{
predkosc = map(value, 0, 440, 100, 0);
kierunek = -1;
}

if(predkosc > 0)
{
silnik.setSpeed(predkosc);
silnik.step(kierunek);
}

}

Problem polega na tym, że niezależnie w którą stronę pochyle joystick, to silnik kręci się w tą samą stronę (dokładnie zgodnie ze wskazówkami zegara).
Sprawdzałem też czy zadziała kiedy zamiast joysticka do sterowania uzyje przycisków ale jest to samo.
Czy ktoś wie i mógłby mi powiedzieć gdzie lub w czym jest problem, bo na prawdę już sam nie wiem o co chodzi. :???:

Dla przykładu powiem jeszcze, że testowałem też na "czystym" programie, czyli zaimplementowałem silnik, podałem setSpeed oraz step i wtedy działa bez zarzutu. Ustawiając step na wartości dodatnie silnik kręci się w jedną stronę, a po zmianie w kodzie na wartości ujemne silnik kręci się w odwrotną stronę.
Liczę na waszą pomoc, będę bardzo wdzięczny.
Pozdrawiam.



Tagi:


steff.k
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 3
Posty: 529
Rejestracja: 07 paź 2013, 20:12
Lokalizacja: Kraków/Kraśnik

#2

Post napisał: steff.k » 20 gru 2015, 16:33

Jak masz zdefiniowane wyjście kierunek? Nie powinno być 0 i 1? a nie 1 i -1?


Autor tematu
Bochen625
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 5
Posty: 5
Rejestracja: 20 gru 2015, 14:59
Lokalizacja: Wwa

Re: Problem ze sterowaniem silnikiem krokowym

#3

Post napisał: Bochen625 » 20 gru 2015, 17:18

kierunek definiuje po prostu
int kierunek;

Z tego co wiem i jak sprawdzałem na tym prostym przykładzie samej pracy silnika to jeżeli dla wartości step podam liczbę "na minusie" np -100, to silnik kręci się zgodnie z ruchem wskazówek zegara, a jeżeli wartość jest na plusie to silnik kręci się w przeciwnym kierunku.


steff.k
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 3
Posty: 529
Rejestracja: 07 paź 2013, 20:12
Lokalizacja: Kraków/Kraśnik

#4

Post napisał: steff.k » 20 gru 2015, 17:22

A to nie wiem co to za biblioteka. Ja właśnie piszę prosty sterownik na STM32 i mam zdefinowane dwa piny. Jeden jako STEP, drugi jako DIR i nimi sobie steruję.

Powodzenia :!:


Autor tematu
Bochen625
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 5
Posty: 5
Rejestracja: 20 gru 2015, 14:59
Lokalizacja: Wwa

#5

Post napisał: Bochen625 » 20 gru 2015, 18:12

wydaje mi sie ze działamy na tej samej bibliotece.

#include <Stepper.h>

silnik implementuje w taki sposob

Stepper silnik = Stepper(400, dir, step1);


steff.k
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 3
Posty: 529
Rejestracja: 07 paź 2013, 20:12
Lokalizacja: Kraków/Kraśnik

#6

Post napisał: steff.k » 20 gru 2015, 20:28

Jak pisałem wcześniej ja nie korzystam a tej biblioteki.

Pinem Dir steruje jako 0 i 1 a pinem STEP jak pwm:

Kod: Zaznacz cały

if (Wlewo == 1 && Wprawo==0) 
            { 
                i++;
                DIR=1;
                                
                if (i>10000)
                {
                    i=0;
                    f=(1/A)*1500;                  //oblicznie param PWM na podstawie enkodera
                    Speed=((1/f)/ppr)*60*1000000;  //obliczenie predkosci w rpm
                    
                                      
                    lcd.setCursorPosition(0, 9);   //wypis predkosci na LCD
                    lcd.printf("    ");
                    lcd.setCursorPosition(0, 9);
                    lcd.printf("%.0f",Speed);
                                                                                          
                    mypwm.period_us(f);            // ustawienie PWM
                    mypwm.pulsewidth_us(f/2);
                                      
                } 
         
         
            }            


Autor tematu
Bochen625
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 5
Posty: 5
Rejestracja: 20 gru 2015, 14:59
Lokalizacja: Wwa

#7

Post napisał: Bochen625 » 20 gru 2015, 23:37

Ok problem rozwiązany lecz teraz przede mna kolejna zagadka.
Chcę odczytać wartość prędkości z zakresu 0-150 z pinu analogowego i wyświetlić ją na wyświetlaczu lcd. Generalnie zadanie bardzo proste ALE w momencie kiedy prędkość wynosi np. 130 i zmniejszę ją do wartości np 60 to zero z wartości 130 zostaje na wyświetlaczu i pokazuje wtedy wartość 600. Wie ktoś jak co z tym zrobić?


jomat
Specjalista poziom 1 (min. 100)
Specjalista poziom 1 (min. 100)
Posty w temacie: 1
Posty: 168
Rejestracja: 12 kwie 2013, 19:03
Lokalizacja: Świdnica

#8

Post napisał: jomat » 20 gru 2015, 23:59

A czytałeś kod z postu wcześniejszego?
najpierw czyścisz, potem wyświetlasz
lcd.printf(" ");


Autor tematu
Bochen625
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 5
Posty: 5
Rejestracja: 20 gru 2015, 14:59
Lokalizacja: Wwa

#9

Post napisał: Bochen625 » 21 gru 2015, 00:50

Czytałem tylko średnio go zrozumiałem.
Dzięki za wyjaśnienie i pomoc :)

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Arduino, Raspberry pi i inne systemy mikroprocesorowe”