• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Sterowanie silnikiem krokowym określoną częstotliwością
#1
Witam
Rok temu zrobiłem sobie domowej roboty urządzenie do podążania za ruchem gwiazd, ja to nazywam w skrócie "startracker". Kilka kawałków MDFu przekładnia ślimakowa 100:1 do tego pasowa 4:1, silnik krokowy NEMA17, driver DRV8825 i Raspberry Pi. Zasilanie pakiet baterii LiPo 7,2V booster na 12V (do krokowego) i step-down 5V (dla RPi). Chciałbym zastąpić RPi przez Arduino Nano, ale tu pojawił się problem. Okazuje się, że to nie tak łatwe jak wpisanie częstotliwości 29,71 Hz do prostego generatora PWM w Rpi. Czy szanowni forumowicze pomogli by mi w tym?
 
Odpowiedź
#2
kolego nie rozumie w czym masz trudność możesz dokładniej rozwinąć problem
 
Odpowiedź
#3
Mam problem z napisaniem kodu, a dokładniej potrzebuję gotowego kodu. Jestem w stanie sam poskładać - polutować, ale ni chu chu nie wiem jak napisać kod. Jak napisałem wyżej z Pythonem nie miałem żadnego problemu, tutaj po prostu się nie widzę.
 
Odpowiedź
#4
Nie PWM tylko impulsy na wyjściu cyfrowym z odpowiednimi opóźnieniami i powinno działać. Tylko opóźnienie musisz już dać w mikrosekundach a długość okresu musi być sumą czasu trwania impulsu i opóźnienia.
 
Odpowiedź
#5
Witam
Dziękuję za podpowiedzi. Znalazłem kilka kodów, jeden chciałem przerobić ale coś mi nie wychodzi. Oryginalny:
Kod:
// testing a stepper motor with a Pololu A4988 driver board or equivalent

// this version uses millis() to manage timing rather than delay()
// and the movement is determined by a pair of momentary push switches
// press one and it turns CW, press the other and it turns CCW

byte directionPin = 9;
byte stepPin = 8;

byte buttonCWpin = 10;
byte buttonCCWpin = 11;

boolean buttonCWpressed = false;
boolean buttonCCWpressed = false;

byte ledPin = 13;

unsigned long curMillis;
unsigned long prevStepMillis = 0;
unsigned long millisBetweenSteps = 25; // milliseconds

void setup() { 

  Serial.begin(9600);
  Serial.println("Starting Stepper Demo with millis()");

  pinMode(directionPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  
  pinMode(buttonCWpin, INPUT_PULLUP);
  pinMode(buttonCCWpin, INPUT_PULLUP);
  
}

void loop() { 
  
  curMillis = millis();
  readButtons();
  actOnButtons();
  
}

void readButtons() {
  
  buttonCCWpressed = false;
  buttonCWpressed = false;
  
  if (digitalRead(buttonCWpin) == LOW) {
    buttonCWpressed = true;
  }
  if (digitalRead(buttonCCWpin) == LOW) {
    buttonCCWpressed = true;
  }
}

void actOnButtons() {
  if (buttonCWpressed == true) {
    digitalWrite(directionPin, LOW);
    singleStep();
  }
  if (buttonCCWpressed == true) {
    digitalWrite(directionPin, HIGH);
    singleStep();
  }
}

void singleStep() {
  if (curMillis - prevStepMillis >= millisBetweenSteps) {
    prevStepMillis += millisBetweenSteps;
    digitalWrite(stepPin, HIGH);
    digitalWrite(stepPin, LOW);
  }
}

a mój skrócony :
Kod:
byte stepPin = 4;
byte ledPin = 13;

unsigned long curMillis;
unsigned long prevStepMillis = 10;
unsigned long millisBetweenSteps = 23.66; // milliseconds

void setup() {
 
 Serial.begin(9600);
 Serial.println("Starting Stepper Demo with millis()");

 pinMode(stepPin, OUTPUT);
 pinMode(ledPin, OUTPUT);
   
}

void loop() {
 
 curMillis = millis();

 
}

void singleStep() {
 if (curMillis - prevStepMillis >= millisBetweenSteps) {
   prevStepMillis += millisBetweenSteps;
   digitalWrite(stepPin, HIGH);
   digitalWrite(stepPin, LOW);
 }
}
Z oryginalnego chciałem wyrzucić sterowanie kierunkiem obrotów bo to będzie niezmienne. czy moglibyście sprawdzić co źle zrobiłem?
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości