Dzięki, słuszne uwagi, ale nadal jestem ciekawy jak ustalić tu liczbę kroków na obrót. Oczywiście zdaję sobie sprawę, że potrzebne jest zliczanie i to jestem w stanie zrobić. ale nie zmienia to faktu, że Accelstepper totalnie mi nie odpowiada ( dziwne zależności wpływające np na szybkość silnika, niezgodną z założeniami itd.) Szukam prostego rozwiązania opartego na millis czy micros bo potrzebuję sterowania równocześnie dwoma silnikami (nawijarka). Wiem, że można zastosować enkoder ( ale tu jestem jeszcze w lesie).
Kto walczy ten się uczy.....( he he, czasami -ze trzy lata w jednej klasie, ale zawsze !) Próbuję dokonać zmian w poniższym programie, na razie z miernymi wynikami. Jeśli mógłbyś polecić prostą do bólu bibliotekę z millis byłbym bardzo zobowiązany.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int cycle_delay = 1; //np. 100 ms opóźnienia przy sterowaniu pinu 8 - czylu PUL+. Zatem pełny prostokąt zamknie się w 200ms. Czyli jeden krok silnika będzie co 200ms (5 razy na sekundę)
int liczba_krokow = 0;
int liczba_krokow_na_obrot = 200;
int zw_na_warstwe = 0;
float zmienna_srednica = 0.10;
int zmienna_start = 0;
bool kierunek = false;
const int menu_zwoje = 1;
const int menu_srednica = 2;
const int menu_start = 3;
int wybrana_funkcja = 1; //wstepnie wybrana funkcja men
void setup() {
Serial.begin(9600);
lcd.init();
pinMode(3, OUTPUT); // Motor 2 kierunek
digitalWrite(3, kierunek);
pinMode(2, OUTPUT); // Motor 2 posuw
pinMode(8, OUTPUT); // Motor 1
pinMode(10, INPUT_PULLUP); // menu
pinMode(5, INPUT_PULLUP); //zmniejsz
pinMode(6, INPUT_PULLUP); //zwiększ
pinMode(7, INPUT_PULLUP); // start
lcd.begin(16, 2);
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("zw_na_warstwe");
}
void loop() {
switch (wybrana_funkcja) {
case 1:
zwoje();
lcd.print(" ");
break;
case 2:
srednica();
break;
case 3:
start();
break;
default:
wybrana_funkcja = 1;
break;
}
/* ten kawalek kodu powoduje po nacisnieciu guzika na pin10 przejscie do kolejnego elementu menu*/
if (digitalRead(10) == LOW) {
wybrana_funkcja++;
delay(500);
if (wybrana_funkcja > 3) {
wybrana_funkcja = 1;
}
}
}
void zwoje() {
lcd.setCursor(0, 0); //dzięki tej sekcji będzie od razu widać po naciśnięciu klawisza 10 do jakiej funkcji program wchodzi.
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("Zwoje: ");
lcd.print(zw_na_warstwe);
if (digitalRead(6) == LOW) {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
zw_na_warstwe++;
lcd.print("Zwoje: ");
lcd.print(zw_na_warstwe);
lcd.print(" ");
delay(300);
}
if (digitalRead(5) == LOW) {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
zw_na_warstwe--;
lcd.print("Zwoje: ");
lcd.print(zw_na_warstwe);
//lcd.print(" ");
delay(300);
}
}
void srednica() {
lcd.setCursor(0, 0); //dzięki tej sekcji będzie od razu widać po naciśnięciu klawisza 10 do jakiej funkcji program wchodzi.
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("Srednica ");
lcd.print(zmienna_srednica);
lcd.print(" ");
if (digitalRead(6) == LOW) {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
zmienna_srednica += 0.01;
lcd.print("Srednica: ");
lcd.print(zmienna_srednica);
lcd.print(" ");
delay(300);
}
if (digitalRead(5) == LOW) {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
zmienna_srednica -= 0.01;
lcd.print("Srednica: ");
lcd.print(zmienna_srednica);
lcd.print(" ");
delay(300);
}
}
void krok() {
digitalWrite(8, LOW);
delay(cycle_delay);
digitalWrite(8, HIGH);
delay(cycle_delay);
}
void start() {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("Start: ");
if (digitalRead(7) == LOW) {
digitalWrite(8, HIGH);
digitalWrite(3, kierunek);
obracaj();
kierunek=!kierunek;
}
}
void obracaj() {
for (int obr = 0; obr < zw_na_warstwe; obr++) {
for (int i = 0; i < liczba_krokow_na_obrot; i++) {
krok(); //tu wywołujemy funkcję "krok", która wysyła pojedyńczy prostokąt na pin 8
}
przesun_o_zwoj(); //wywołuję funkcję, która obróci MOTOR2 o 50 kroków
}
}
//funkcja wykonująca krok silnika 2 - MOTOR2
void krok_m2() {
digitalWrite(2, LOW);
delay(cycle_delay);
digitalWrite(2, HIGH);
delay(cycle_delay);
}
void przesun_o_zwoj() {
for (int j = 0; j < zmienna_srednica * 200; j++) {
krok_m2();
}
}
Znaleziono 2 wyniki
Wróć do „Jak ustalić stabilne 200 kroków na obrót.”
- 12 sie 2024, 17:16
- Forum: Silniki Krokowe / Sterowniki Silników Krokowych
- Temat: Jak ustalić stabilne 200 kroków na obrót.
- Odpowiedzi: 6
- Odsłony: 678
- 11 sie 2024, 21:39
- Forum: Silniki Krokowe / Sterowniki Silników Krokowych
- Temat: Jak ustalić stabilne 200 kroków na obrót.
- Odpowiedzi: 6
- Odsłony: 678
Jak ustalić stabilne 200 kroków na obrót.
Wybaczcie, że pytanie z poziomu piaskownicy, ale jakoś nie mogę sobie poradzić.
odpaliłem programik z zastosowaniem micros. O ile da się regulować szybkość o tyle nie wymyśliłem jak wymusić ileś tam obrotów. Mam typowy silnik 200-krokowy. A jak zachowywałby się silnik z inną ilością kroków czy też przekładnią ? Próbowałem różnych sposobów, ale wyniki watpliwe. Silnik zatrzymywał się w przypadkowych pozycjach...stąd moje podejrzenie, że trzeba takiego patentu jak np: int liczba_krokow_na_obrot = 200;
Oto kod:
const int stepPin = 8;
unsigned long stepperTimer;
int currentStepperSpeedDelay = 500; //changing this value changes the stepper motor speed.
byte stepInState = 0; //high or low state for next step
int stepCounter; // na razie nie używane
int stepperDirection; //stores the current direction of rotation
int targetSteps = 0;
void setup() {
pinMode(stepPin, OUTPUT);
}
void loop() {
unsigned long currentMicros;
currentMicros = micros();
if ((currentMicros - stepperTimer) >= currentStepperSpeedDelay) {
stepperTimer = currentMicros;
if (stepInState > 0) {
stepInState = 0;
} else {
stepInState = 1;
}
digitalWrite(stepPin, stepInState );
//stepCounter++;
}
}
odpaliłem programik z zastosowaniem micros. O ile da się regulować szybkość o tyle nie wymyśliłem jak wymusić ileś tam obrotów. Mam typowy silnik 200-krokowy. A jak zachowywałby się silnik z inną ilością kroków czy też przekładnią ? Próbowałem różnych sposobów, ale wyniki watpliwe. Silnik zatrzymywał się w przypadkowych pozycjach...stąd moje podejrzenie, że trzeba takiego patentu jak np: int liczba_krokow_na_obrot = 200;
Oto kod:
const int stepPin = 8;
unsigned long stepperTimer;
int currentStepperSpeedDelay = 500; //changing this value changes the stepper motor speed.
byte stepInState = 0; //high or low state for next step
int stepCounter; // na razie nie używane
int stepperDirection; //stores the current direction of rotation
int targetSteps = 0;
void setup() {
pinMode(stepPin, OUTPUT);
}
void loop() {
unsigned long currentMicros;
currentMicros = micros();
if ((currentMicros - stepperTimer) >= currentStepperSpeedDelay) {
stepperTimer = currentMicros;
if (stepInState > 0) {
stepInState = 0;
} else {
stepInState = 1;
}
digitalWrite(stepPin, stepInState );
//stepCounter++;
}
}