[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: