LinkedIn YouTube Facebook
Szukaj

Wstecz
SoM / SBC

[PRZYKŁAD] Sterownik silników KAmodMPC17C724 i KAmduino UNO

Po podłączeniu całości można przejść do oprogramowania na platformę Arduino. Poniższy program ma za zadanie spowodować, żeby silnik nabierał coraz wyższej prędkości, następnie zwalniał, zmieniał kierunek i tak w kółko. Poniżej znajduje się omówienie kodu programu:

Na początku definiowane są numery pinów, do których podłączone są piny modułu KAmodMPC17C724. Definicje są zgodne z połączeniem pokazanym w tabeli na poprzedniej stronie. Oczywiście w przypadku podjęcia decyzji o zmianie sposobu połączenia należy też zmienić poniższe definicje.

#define IN1A_PIN     3
#define IN1B_PIN     4
#define IN2A_PIN     5
#define IN2B_PIN     6
#define PSAVE_PIN    2

W funkcji setup inicjalizowane są wszystkie piny cyfrowe jako wyjścia. Następnie potencjał linii PSAVE ustawiany jest na potencjale masy, co ustawia sterownik w stan włączenia. W tym programie silniki przez cały czas są włączone, ale warto pamiętać, że przełączenie tej linii w stan wysoki wyłącza silniki.

void setup() {
  pinMode (IN1A_PIN, OUTPUT);
  pinMode (IN1B_PIN, OUTPUT);
  pinMode (IN2A_PIN, OUTPUT);
  pinMode (IN2B_PIN, OUTPUT);
  pinMode (PSAVE_PIN, OUTPUT);
  digitalWrite(PSAVE_PIN, LOW);
}

Funkcja ustawMPC17C724 uaktualnia parametry sygnałów wysyłanych do sterownika. Kierunek silnika ustawiany jest jako stan zmiennych kierunek1 oraz kierunek2. Prędkość ustawiana jest jako 8-bitowa wartość typu int. Musi więc mieścić się w zakresie 0…255. Prędkość silnika zależy od wypełnienia sygnału PWM. Parametry sygnału na pinie, na którym możliwe jest zaaplikowanie sprzętowego PWM (na płytce KAmduino Uno: 3, 5, 6, 9, 10, lub 11) można ustawić funkcją analogWrite. Argumentami analogWrite są: numer pinu oraz wypełnienie sygnału. Częstotliwość sprzętowego PWM wynosi w Arduino domyślnie 490 Hz. W funkcji ustawMPC17C724 jest już uwzględniony fakt, że wpływ wypełnienia przesyłanego po pinu IN1A/IN2A ma różny wpływ na prędkość w zależności od kierunku działania silnika. Użytkownik przesyłając prędkość do funkcji w zmiennych predkosc1 i predkosc2 może to zrobić w sposób naturalny (0 – brak ruchu, 255 – najwyższa prędkość). Warto zwrócić uwagę, że przy małych wartościach wypełnienia silnik w ogóle nie ruszy.

void ustawMPC17C724 (uint8_t predkosc1, uint8_t predkosc2, bool kierunek1, bool kierunek2) {
  digitalWrite(IN1B_PIN, kierunek1);
  if (kierunek1==false)
     analogWrite (IN1A_PIN, predkosc1);
  else
     analogWrite (IN1A_PIN, 256-predkosc1);
  digitalWrite(IN2B_PIN, kierunek2);
  if (kierunek2==false)
  
     analogWrite (IN2A_PIN, predkosc1);
  else
     analogWrite (IN2A_PIN, 256-predkosc1);
}

W funkcji loop odbywa się sterowanie sekwencja ruchu silnika. Silnik przyspiesza do maksimum,  zwalnia do zera, a następnie zmienia kierunek i rozpoczyna sekwencję od nowa. Gdy oba silniki podłączone są w ten sam sposób, powinny poruszać się w przeciwnych kierunkach przez cały czas działania programu. Opóźnienia w pętli dodane są po to, aby można było zaobserwować powolne zwiększanie i zmniejszanie się prędkości obrotów.

void loop() {
  int i;
  for (i=0;i<256;++i){ // I faza - przyspieszanie
    ustawMPC17C724(i,i,false,true); 
    delay(20);
  }
  delay (1000);
  for (i=255;i>0;--i){ //I faza - zwalnianie
    ustawMPC17C724(i,i,false,true);
    delay(20);
  }
  for (i=0;i<256;++i){ //II faza - przyspieszanie
    ustawMPC17C724(i,i,true,false);
    delay(20);
  }
   delay (1000);
  for (i=255;i>0;--i){ //II faza - zwalnianie
    ustawMPC17C724(i,i,true,false);
    delay(20);
  }
}

Działanie przykładu można zaobserwować na poniższym materiale wideo: