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;
}