Znaleziono 2 wyniki

autor: anszun
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

Re: Jak ustalić stabilne 200 kroków na obrót.

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();
}
}
autor: anszun
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++;
}
}

Wróć do „Jak ustalić stabilne 200 kroków na obrót.”