14-02-2019, 00:21
Zbudowałem układ sterowania silnikiem krokowym za pomocą Arduino Uno. Ogólnie wszystko działa, ale mam problem z zaprogramowaniem układu. Sterowanie ma wyglądać mniej więcej w ten sposób, że najpierw silnik obraca się z pełnym krokiem i zmienia kierunek obrotu, następnie zmienia się podział kroku na 1/2 np. na 3 s następnie na 1/4 3s, 1/8 3s, i 1/16 3s.
Problem wygląda tak, że jak napisałem prosty kod w oparciu o delay to nie mogę zmieniać częstotliwości obrotów silnika za pomocą potencjometru, dlatego próbowałem napisać program w oparciu o funkcję millis, jednak chyba nie rozumiem do końca tej funkcji gdyż nie potrafię zaprogramować układu tak, aby chodził jak w oparciu o delay. W programie z funkcją millis podział kroku nie zmienia się tak jak w programie z delay. Będę bardzo wdzięczny jeśli ktoś pomorze mi to odpowiednio zaprogramować
Niedziałający program z funkcją millis.
Problem wygląda tak, że jak napisałem prosty kod w oparciu o delay to nie mogę zmieniać częstotliwości obrotów silnika za pomocą potencjometru, dlatego próbowałem napisać program w oparciu o funkcję millis, jednak chyba nie rozumiem do końca tej funkcji gdyż nie potrafię zaprogramować układu tak, aby chodził jak w oparciu o delay. W programie z funkcją millis podział kroku nie zmienia się tak jak w programie z delay. Będę bardzo wdzięczny jeśli ktoś pomorze mi to odpowiednio zaprogramować
Kod:
#include <Stepper.h>
#define PIN_KROK 2 /* impuls sterujacy*/
#define PIN_ODCZYT A0 /* odczyt z potencjometru*/
#define MAX 800 /* max obroty */
#define PIN_KIERUNEK 1 /*zmiana kierunku DIR */
#define PIN_STOP 6 /* zatrzymanie */
#define PIN_MS 5 /* MS1 pół krok*/
#define PIN_MS 4 /* MS2 1/4 krok*/
#define PIN_MS 3 /* MS3 */
void setup() {
pinMode (PIN_KROK, OUTPUT);
pinMode (PIN_KIERUNEK, OUTPUT);
pinMode (PIN_MS, OUTPUT);
}
void loop()
{
unsigned int potencjometr = map(analogRead(PIN_ODCZYT),0,1023,0,MAX);
tone (PIN_KROK, potencjometr);
digitalWrite(1,HIGH);
delay(1000);
digitalWrite(1,LOW);
delay(1000);
/*--------------------------------------------------------------------- */
digitalWrite(5, HIGH); /* zmiana na pół krok*/
delay(2000);
digitalWrite(5, LOW); /* powrót do 200 kroków*/
/*----------------------------------------------------*/
digitalWrite(4, HIGH); /* zmiana na 1/4 kroku*/
delay(2000);
/*----------------------------------------------------*/
digitalWrite(5, HIGH); /* zmiana na 1/8 kroku*/
delay(2000);
/*----------------------------------------------------*/
digitalWrite(3, HIGH); /* zmiana na 1/16 kroku*/
delay(2000);
/*----------------------------------------------------*/
digitalWrite(3, LOW); /* powrót do 200 kroków */
digitalWrite(4, LOW);
digitalWrite(5, LOW);
}
Niedziałający program z funkcją millis.
Kod:
#include <Stepper.h>
#include <AccelStepper.h>
#define PIN_KROK 2 /* impuls sterujacy*/
#define PIN_ODCZYT A0 /* odczyt z potencjometru*/
#define MAX 800 /* max obroty, */
#define PIN_KIERUNEK 1 /*zmiana kierunku DIR */
#define PIN_STOP 6 /* zatrzymanie */
#define PIN_MS 5 /* MS1 pół krok*/
#define PIN_MS 4 /* MS2 1/4 krok*/
#define PIN_MS 3 /* MS3 */
#define RESET 7 /* reset pololu */
int potencjometr;
unsigned long aktualnyCzas ;
unsigned long zapamietanyCzas ;
unsigned long zapamietanyCzas1 ;
unsigned long zapamietanyCzas2 ;
unsigned long zapamietanyCzas3 ;
unsigned long zapamietanyCzas4 ;
unsigned long zapamietanyCzas5 ;
void setup() {
pinMode (PIN_KROK, OUTPUT);
pinMode (PIN_KIERUNEK, OUTPUT);
pinMode (PIN_MS, OUTPUT);
}
void loop()
{
potencjometr = map(analogRead(PIN_ODCZYT), 0, 1023, 0, MAX);
tone (PIN_KROK, potencjometr);
aktualnyCzas = millis();
if (aktualnyCzas - zapamietanyCzas >= 1000UL) {
zapamietanyCzas = aktualnyCzas;
digitalWrite(1, HIGH);
}
if (aktualnyCzas - zapamietanyCzas1 >= 2000UL) {
zapamietanyCzas1 = aktualnyCzas;
digitalWrite(5, HIGH);
}
if (aktualnyCzas - zapamietanyCzas2 >= 3000UL) {
zapamietanyCzas2 = aktualnyCzas;
digitalWrite(5, LOW);
digitalWrite(4, HIGH);}
if (aktualnyCzas - zapamietanyCzas3 >= 4000UL) {
zapamietanyCzas3 = aktualnyCzas;
digitalWrite(5, HIGH);}
if (aktualnyCzas - zapamietanyCzas4 >= 5000UL) {
zapamietanyCzas4 = aktualnyCzas;
digitalWrite(3, HIGH); }
if (aktualnyCzas - zapamietanyCzas5 >= 6000UL) {
zapamietanyCzas5 = aktualnyCzas;
digitalWrite(5, LOW);
digitalWrite(4, LOW);
digitalWrite(3, LOW);}
}