Problem ze sterowaniem silnikiem krokowym
-
Autor tematu - 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
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.
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:
-
Autor tematu - 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
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.
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.
-
- Specjalista poziom 2 (min. 300)
- Posty w temacie: 3
- Posty: 529
- Rejestracja: 07 paź 2013, 20:12
- Lokalizacja: Kraków/Kraśnik
Jak pisałem wcześniej ja nie korzystam a tej biblioteki.
Pinem Dir steruje jako 0 i 1 a pinem STEP jak pwm:
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 - Nowy użytkownik, używaj wyszukiwarki
- Posty w temacie: 5
- Posty: 5
- Rejestracja: 20 gru 2015, 14:59
- Lokalizacja: Wwa
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ć?
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ć?