LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
SoM / SBC

[ARDUINO, EAGLE i TY] Biblioteki Arduino dla sterownika H silnika elektrycznego

Aby uzyskać kierunek pracy odwrotny do poprzedniego wystarczy zamienić wartości napięć na portach sterujących.

void loop()
{
int predkosc; 
digitalWrite(sterowanie_silnikami[0],HIGH);
digitalWrite(sterowanie_silnikami[1],LOW);
analogWrite(pwmA, predkosc);
//dla silnika A
digitalWrite(sterowanie_silnikami[2],HIGH);
digitalWrite(sterowanie_silnikami[3],LOW);
analogWrite(pwmB, predkosc);
//dla silnika B
   delay(10);
}

Programowanie w ten sposób przysparza wiele problemów oraz możliwości popełnienia błędów. Przy kolejnych linijkach przejrzystość programu ulega rozmyciu dlatego też opracowano funkcję która w znaczący sposób upraszcza obsługę powyższego układu.

Założenia funkcji:

  • sterowanie silnikiem za pomocą polecenia ustaw_predkosc(x,y), gdzie:

x – numer silnika

y -wartość prędkości

  • umożliwienie ustawienie pracy silnika w kierunku odwrotnym za pomocą wartości ujemnych
  • wymuszenie dostosowania programu do założeń sygnału PWM (wartości (0;255))
  • zabezpieczenie przed wprowadzeniem nieznanego silnika do programu

Rozpoczynamy pisanie funkcji.

  1. Definicja funkcji
void ustaw_predkosc(int silnik, int predkosc)
{
}

Od tej pory wywołanie funkcji będzie odbywało się poprzez wpisanie

ustaw_predkosc(1, 127) //ustawienie prędkości silnika A na 50%
  1. Ustawienie kierunku pracy silnika w zależności od znaku przy wartości pwm
// do nagłówka
 int kierunek;

 if (predkosc>0) 
  {
    kierunek=1;
  }
// dla prędkości dodatnich kierunek pracy silnika ustalony jako „do przodu”
  else
  {
    kierunek=2;
// dla prędkości ujemnych kierunek pracy silnika ustalony jako „do tyłu” 
    predkosc=predkosc*(-1);
//wartość prędkości ponownie zostaje ustalona jako wartość dodatnia
  }
  1. Ustawienie zabezpieczeń przed doborem wartości przekraczających przedział (0;255)
    if (predkosc>255)
  {
    predkosc=255;
  }
  1. Wymuszenie wyboru silnika 1 lub silnika 2
  if (silnik!=1&&silnik!=2) {predkosc=0;}
//w przypadku wstawienia wartości spoza zakresu {1,2} wartość prędkości silnika zostanie ustawiona na 0

Postulaty zabezpieczeń zostały rozpisane, pozostaje jedynie dopisać przypadki zachowań silników. Schematem do opisu tego przypadków będzie poniższy wzór.

  if ((silnik==x)&&(kierunek==y)) 
  //wybór kierunku i prędkości pracy silnika
  {
    digitalWrite(sterowanie_silnikami[z1],LOW);
    digitalWrite(sterowanie_silnikami[z2],HIGH);
    analogWrite(pwm, predkosc);
  }

gdzie:

  • x – numer silnika
  • y – kierunek pracy
  • z1,z2 – porty sterujące
  • pwm – port pwm
  • predkosc – prędkość pracy

Wykorzystując wszystkie powyższe adnotacje funkcja powinna przyjąć następującą postać:

void ustaw_predkosc(int silnik, int predkosc)
{
 

  //dobranie silnika oraz kierunku jego pracy
  
 if (predkosc>0) 
  {
    kierunek=1;
  }
  else
  {
    kierunek=2;
    predkosc=predkosc*(-1);
  }
  //zabezpieczenie przed wprowadzeniem blednych wartosci
    if (predkosc>255)
  {
    predkosc=255;
  }
  //zabiezpieczenie przed brakiem oznaczenia silnika
  if (silnik!=1&&silnik!=2) {predkosc=0;}
  
  if ((silnik==1)&&(kierunek==1)) 
  //wybór kierunku i prędkości pracy silnika
  {
    digitalWrite(sterowanie_silnikami[0],LOW);
    digitalWrite(sterowanie_silnikami[1],HIGH);
    analogWrite(pwmA, predkosc);
  }
  
  
  if ((silnik==1)&&(kierunek==2))
  {
    digitalWrite(sterowanie_silnikami[0],HIGH);
    digitalWrite(sterowanie_silnikami[1],LOW);
    analogWrite(pwmA, predkosc);
  }
  
  if ((silnik==2)&&(kierunek==1))
  {
    digitalWrite(sterowanie_silnikami[2],LOW);
    digitalWrite(sterowanie_silnikami[3],HIGH);
    analogWrite(pwmB, predkosc);
  }
  if ((silnik==2)&&(kierunek==2))
  {
    digitalWrite(sterowanie_silnikami[2],HIGH);
    digitalWrite(sterowanie_silnikami[3],LOW);
    analogWrite(pwmB, predkosc);
  }
}

Umieszczając powyższą funkcję poniżej programu zyskujemy możliwość sterowania silnikami przy wykorzystaniu adnotacji:

void loop()
{
  
  //wykorzystanie funkcji ustaw prędkość
  ustaw_predkosc(1, 120);
  ustaw_predkosc(2, 45);
   delay(10); //opóźnienie
//pojazd powinien poruszać się po okręgu
}

Dla uatrakcyjnienia kodu do portu A0 został doprowadzony sygnał z potencjometru który reguluje szybkość pracy silnika. Taki efekt otrzymamy przy wprowadzeniu następujących linijek kodu:

void loop()
{
  
potencjometr=analogRead(A0)/5;
  //wykorzystanie funkcji ustaw prędkość
  ustaw_predkosc(1, potencjometr);
  ustaw_predkosc(2, potencjometr/4);
   delay(10); //opóźnienie
//pojazd powinien poruszać się po okręgu
}