Řízení otáček krokového motoru

Odpovědět
LDasha
Příspěvky: 1
Registrován: 09 črc 2018, 13:31
Reputation: 0

Řízení otáček krokového motoru

Příspěvek od LDasha » 24 črc 2018, 14:24

Zdravím všechny,
chtěl bych Vás tímto poprosit o pomoc při řešení mého projektu. Potřebuji pohybovat krokovým motorem v obou směrech v rozmezí otáček cca 0,3 ot/min až 500 ot/min. Pohybuji šroubem dlouhým cca 1000mm se stoupáním 4mm (není až tak důležite) v jednom směru velmi malými otáčkami. Ve druhém směru se chci rychle vráti do původní pozice - vše hlídáno ručně (žádné končáky). Program jsem dal nějak dohromady ale nedělá přesně co bych požadoval (upozorňuji, že jsem spíše přes šroubky a matičky než přes programování...). Program by měl fungovat tak, že při prvotním zapnutí budou nastaveny otáčky 10 ot/min (pravotočivé). Samotný rozběh/zastavení je pomocí tl. 4., rozmezí, pořípadě pravé/levé otáčky pomocí tl. 1, 2, 3, 0 (jak v zastaveném stavu, tak v běhu).

1. Problém: na displeji se mě sice mění hodnota ot/min, ale na reálné otáčky motoru to nemá žádný vliv. S tímto problémem souvisí ještě jedna věc: jak můžu přesně nastavovat otáčky. Zjistil jsem si jen zkusmo (počítal jsem ruzné hodnoty za minutu) konstantu 27.4

2. Problém: Ať dělám co dělám (změna proudu, mikrokroku,...), tak s motoru nemohu vymáčknout víc jak 200ot/min. Int maxspeed nastaven na 3800 - víc nemá smysl, protože motor se už více netočí. Tento problém by se dal oželit (bude se vracet delší dobu), ale přece jenom by mě to zajímalo.

Použité díly:
krokový motor: NEMA 23, Leadshine 57HS22 http://www.cncshop.cz/57hs22-krokovy-2- ... otor-2-2nm
driver: Leadshine M542 http://www.cncshop.cz/m542-driver-pro-k ... y-50v-4-2a
nastavení driveru: mikrokrok:1600, 1,91A, half current
zdroj: spínaný napájecí zdroj 120W, 48W http://www.cncshop.cz/s120-prumyslovy-s ... zdroj-120w
deska: Andruino UNO R3
zobrazení + řízení: Arduino LCD Shield https://arduino-shop.cz/arduino/899-ard ... 70167.html

Kód: Vybrat vše

#include <AccelStepper.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int adc_key_val[5] ={50, 195, 380, 555, 790 };

#define pinStep 2    
#define pinDirection 3
 
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int isRun;
float rpm = 10;
float speeds = rpm * 27.4;
int maxspeed = 3800;

AccelStepper stepper(1, pinStep, pinDirection); 

void setup() {                    // void means dont expect any return from this command
  lcd.clear();                    // clear the lcd
  lcd.begin(16, 2);               // set up the LCD's number of columns and rows:
  lcd.setCursor(0,0); 
  lcd.print("    Stopped     ");  // display stopped on the LCD
  lcd.setCursor(0,1); 
  lcd.print("ot/min ");            // display the value of speed
  lcd.print(rpm);              // display the value of speeds
  lcd.print("   ");
  isRun = 0;

  stepper.setMaxSpeed(maxspeed); //
  stepper.setSpeed(speeds);      //
}

void loop() {
  adc_key_in = analogRead(0);    // read the value from the sensor 
  key = get_key(adc_key_in);     // convert into key press
 
  if (key >= 0)                  // if keypress is detected
   {
      if (key == 1) {
         rpm += 0.1;
         delay(50);
      }
      if (key == 2 && rpm > 0) {
         rpm -= 0.1;
         delay(50);
      }
      if (key == 0) {
         rpm += 5;
      }
      if (key == 3) {
         rpm -= 5;
      }
      if (speeds>maxspeed) {
         speeds = maxspeed;
      }
      if (speeds<-maxspeed) {
         speeds = -maxspeed;
      }
      if (key == 4) {
        isRun = 1 - isRun;
        lcd.setCursor(0,0); 
        if (isRun == 1) {
          lcd.print("+++ Running +++ ");
        } else {
          lcd.print("    Stopped     "); 
        }
        delay(250);
      }
      lcd.setCursor(0, 1);
      lcd.print("ot/min "); 
      lcd.print(rpm);
      lcd.print("       ");
      stepper.setSpeed(speeds);
      delay(50);
  }
  if (isRun == 1) {
    stepper.runSpeed();
  }
}

int get_key(unsigned int input)
{
    int k;
    for (k = 0; k < NUM_KEYS; k++)
    {
      if (input < adc_key_val[k])
            return k;
    }
   
    if (k >= NUM_KEYS)
      k = -1;  // No valid key pressed
    return k;
}
Budu Vám všem vděčný za rady

K380
Příspěvky: 134
Registrován: 04 srp 2017, 12:43
Reputation: 0

Re: Řízení otáček krokového motoru

Příspěvek od K380 » 24 črc 2018, 16:37

Zdravím !
Momentálně si hraju s krokovými motory a našel jsem mimo jiné toto: www.instructables.com/id/Control-a-Step ... -With-PWM/. Je to ukázka ovládání pojezdu jednou rychlostí vpřed a druhou rychlostí vzad včetně kódu. Bohužel je tam jiný driver než máš ty. Ale třeba půjde použít, případně upravit. Tak na to mrkni.

zz912
Příspěvky: 52
Registrován: 28 črc 2018, 13:49
Reputation: 0

Re: Řízení otáček krokového motoru

Příspěvek od zz912 » 16 pro 2018, 14:22

Problém by mohl být v příkazu,

Kód: Vybrat vše

      delay(50);
který je čten při každém projití loopu.

Zkusil bych si odladit otáčení krokáče, bez čtení toho senzoru. A pak bych šel dál.
Napsal bych si program, který by jen točil motorem.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 13 hostů