Photo of a control box inside

Część II: Jak monitorować sprzężenie zwrotne obciążenia siłownika liniowego?

Guest Writer
Guest Writer
PA Engineer

Witamy w części II naszego poradnika o tym, jak monitorować sprzężenie zwrotne obciążenia siłownika liniowego. W części I omówiliśmy proces okablowania oraz podstawowe kodowanie potrzebne do przykładu. W dzisiejszym poradniku szczegółowo omówimy różne sekcje kodu oraz sposoby ich edycji. Na początek przyjrzymy się sekcji kodu latchButtons().

Pierwszą rzeczą jest eliminacja drgań styków przycisków (debouncing): gdy wciśnięty zostanie lewy przycisk, należy obliczyć czas, jaki upłynął od poprzedniego naciśnięcia. W tym celu wykorzystujemy ostatnią zapisaną wartość w kodzie, a następnie funkcję millis() do sprawdzenia czasu. Gdy czas jest większy niż czas eliminacji drgań, funkcja sprawdzi, czy siłownik może się wysunąć. Po spełnieniu obu warunków funkcja będzie mogła kontynuować.

if (digitalRead(buttonLeft)==LOW)//left is forwards

{
currentTimedebounce = millis() - lastButtonpress;// check time since last press
if (currentTimedebounce > debounceTime && dontExtend == false)//once you've tripped dontExtend, ignore all forwards presses
{
leftlatch = !leftlatch;// if motor is moving, stop, if stopped, start moving
firstRun = true;// set firstRun flag to ignore current spike
fullyRetracted = false; // once you move forwards, you are not fully retracted
lastButtonpress = millis();//store time of last button press
return;
}//end if
}//end btnLEFT


Kolejna część to pętla wewnątrz funkcji motorForward(), a konkretnie dwa opóźnienia. Pętla zaczyna się od załączenia sterownika silnika, co uruchamia silnik siłownika liniowego. Jeśli to pierwszy przebieg pętli, wystąpi większe opóźnienie. Opóźnienie ignoruje skok prądu, który pojawia się przy uruchamianiu silnika. Nie ustawiaj zbyt dużego opóźnienia, ponieważ po starcie nie będziesz mieć nad nim kontroli. Gdy silnik ruszy, sekcja getFeedback() służy do sprawdzenia czujnika prądu.

while (dontExtend == false && leftlatch == HIGH)  {

digitalWrite(EnablePin, HIGH);
analogWrite(PWMPinA, speeed);
analogWrite(PWMPinB, 0);//move motor
if (firstRun == true) delay(firstfeedbacktimedelay);
else delay(feedbacktimedelay); //small delay to get to speed
getFeedback();
firstRun = false;
latchButtons();
}//end while

Zdjęcie wnętrza skrzynki sterowniczej

Następnie omówimy sekcje w procedurze get feedback(), która zaczyna się od odczytu pinu analogowego podłączonego do czujnika. Najpierw sprawdza, czy silnik znajduje się na krańcach – kod rozpoznaje osiągnięcie krańców, gdy prąd wynosi 0.

Niestety czasem mogą wystąpić błędne odczyty, dlatego warto ustawić licznik. Kod licznika musi doliczyć do wartości hitLimitsmax, zanim silnik się zatrzyma, a jeśli policzy mniej, zostanie zresetowany.

 

if (CRaw == 0 && hitLimits < hitLimitsmax) hitLimits = hitLimits + 1;  

else hitLimits = 0; // check to see if the motor is at the limits and the current has stopped


Po tym obsługiwane jest osiągnięcie krańców. Gdy siłownik liniowy porusza się do przodu i osiągnie kraniec, wyłączony zostanie prawy latch. Gdy silnik porusza się wstecz, wyłączony zostanie lewy latch. Poniższy kod pokazuje tylko prawy latch, ale kod dla lewego jest taki sam.

if (hitLimits == hitLimitsmax && rightlatch == HIGH)  {

rightlatch = LOW;
hitLimits = 0;
}//end if

Limit prądu jest sprawdzany, a maksymalna wartość zdefiniowana. Jeśli limit zostanie przekroczony, lewy latch zostanie wyłączony i silnik nie będzie się dalej wysuwał. Aby ponownie rozpocząć wysuwanie, należy odwrócić kierunek pracy silnika.
if (CRaw > maxAmps)  {

dontExtend = true;
leftlatch = LOW; //stop if feedback is over maximum
}//end if

To już koniec części II monitorowania sprzężenia zwrotnego obciążenia siłownika liniowego. Tym razem szczegółowo omówiliśmy wybrane sekcje kodu i wyjaśniliśmy, jak działają. Jeśli chcesz zamówić którekolwiek z użytych w przykładzie urządzeń, możesz złożyć zamówienie online lub skontaktować się z nami, aby zamówić telefonicznie. W razie pytań lub wątpliwości dotyczących naszych produktów również jesteśmy gotowi pomóc.