Warunek - wyhamowanie przed osiągnęciem zadanej pozycji - Wersja do druku +- Arduino Polska Forum (https://forum.arduinopolska.pl) +-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino) +--- Dział: Programowanie w Arduino (https://forum.arduinopolska.pl/dzial-programowanie-w-arduino) +--- Wątek: Warunek - wyhamowanie przed osiągnęciem zadanej pozycji (/watek-warunek-wyhamowanie-przed-osi%C4%85gn%C4%99ciem-zadanej-pozycji) |
Warunek - wyhamowanie przed osiągnęciem zadanej pozycji - Pan_Waldy - 19-02-2021 Witam,proszę o pomoc w ułożeniu warunku w programie bądź o rady/sugestie jak to najlepiej wykonać. Celem jest wstawienie do programu warunku który będzie odpowiedzialny za "płynne wyhamowanie cewki zaworu hydraulicznego" przed osiągnięciem zadanej wysokości tak aby nie było natychmiastowego zatrzymania co mogło by spowodować nieprzewidziane uszkodzenia mechaniczne. Przykład: - Znam aktualną pozycję ,ustawiam pozycję zadaną która jest np. większa od aktualnej i rozpoczyna się ruch (pozycja aktualna dąży do zadanej - tutaj wszystko odbywa się po odczycie wartości potencjometru który pełni rolę "ekonomicznego encodera"). I tutaj najważniejsze co chcę uzyskać że jeżeli aktualna pozycja będzie zbliżać się do zadanej to rozpocznie się zmniejszenie wypełnienia przez co "cewka a w zasadzie to czym steruje" zacznie zwalniać aż osiągnie zadaną pozycje i się zatrzyma. Puki co cewka a w zasadzie tranzystor sterowany jest 0/1 ale chcę to przerobić na pwm. I tutaj mój tok myślenia w przypadku kiedy rozpoczyna się praca w górę czyli aktualna pozycja jest mniejsza od zadanej pozycji: (zadana_ pozycja - aktualna_pozycja) = Y; x = (Y<= 30); //rozpoczyna się hamowanie, 30 to luźno przyjęta wartość po prostu chcę mieć jakąś stałą od której mogę uzależnić rozpoczęcie hamowania zarówno podczas dojazdu do zadanej pozycji góra jak i dół. pwm = map(x,30,0, 255,0); //tutaj chciałem wykorzystać przyjętą wartość do przeskalowania na odpowiednio zmniejszające się wypełnienie: analogWrite(cewka,pwm); // i bach pwm na tranzystor sterujący cewką edit, wyżej wypisane dane nie pokrywają się z zmiennymi w kodzie programu - jest to po prostu przykład. ALE nie wiem jak to wkomponować do wysterowanej już cewki bo przecież ma hamować dopiero "chwilę" przed osiągnięciem pozycji. Dlatego zwracam się z prośba o wsparcie w temacie bo może ja po prostu przyjąłem zły tok myślenia i można to w zupełnie inny sposób ułożyć. Kod programu puki co jest dużo "ifów" planuje to przerobić pewne rzeczy na switch-case, po za tym jest tu dużo innych rzeczy ale nas interesuje w zasadzie warunek dla zmiennej "jazda" - jest na samym dole: Kod: #include <EEPROM.h> RE: Warunek - wyhamowanie przed osiągnęciem zadanej pozycji - Jarewa0606 - 19-02-2021 Do takich celów używa się czujników liniowych, lub chociaż dwóch czujników określających minimum dwie pozycje pozycję.. Bo chcesz opierać się na czasie a skąd wiesz że siłownik zawsze w takim samym czasie się posuwał? jak on będzie zmienny zależny od obciążenia i od temp oleju..... Po drugie to co chcesz zrobić już dawno zrobiono za epoki kamienia łupanego, nazywa się to akumulator ciśnienia.... RE: Warunek - wyhamowanie przed osiągnęciem zadanej pozycji - Pan_Waldy - 19-02-2021 (19-02-2021, 18:01)Jarewa0606 napisał(a): Do takich celów używa się czujników liniowych, lub chociaż dwóch czujników określających minimum dwie pozycje pozycję.. Bo chcesz opierać się na czasie a skąd wiesz że siłownik zawsze w takim samym czasie się posuwał? jak on będzie zmienny zależny od obciążenia i od temp oleju.....Nie opieram się "na czasie" tylko na podstawie odczytu ADC z potencjometru. Czas jest tylko używany do tak jakby "krańcówek" RE: Warunek - wyhamowanie przed osiągnęciem zadanej pozycji - Jarewa0606 - 19-02-2021 A sory nie doczytałem... Skoro znasz pozycje wystarczy przerzut ADC do PWM tylko musisz określić punkt początkowy i punkt końcowy hamowania... ADC= readanalog(pin); // odczyt pozycji if(ostatni_ADC - ADC >0 ){ // pozycja UP poprzedni_ADC= ADC; // przypisz teraźniejszą wartość ADC ADC=constrain(ADC, punkt początkowyUP, punkt koncowyUP); // ograniczaj odczyt do zadanych pwm = map(ADC, punkt_początkowyUP, punkt_koncowyUP, 255,0); analogWrite(cewka,pwm); }else{ if(ostatni_ADC -ADC <0 ){ // pozycj DOWN poprzedni_ADC= ADC; // przypisz teraźniejszą wartość ADC ADC=constrain(ADC, punkt początkowyDOWN, punkt koncowyDOWN); // ograniczaj odczyt do zadanych pwm = map(ADC, punkt_początkowyDOWN, punkt_koncowyDOWN, 255,0); analogWrite(cewka,pwm); }else{ poprzedni_ADC= ADC; // przypisz teraźniejszą wartość ADC // tu można wyłączyć zawór bo siłownik stoi w miejscu...... } } RE: Warunek - wyhamowanie przed osiągnęciem zadanej pozycji - Pan_Waldy - 20-02-2021 Dzięki za propozycje, niedługo będę próbował to "wdrożyć w życie" jak co to będę jeszcze pytał. Wytłumacz proszę jeszcze mi co to jest constrain bo szczerze mówiąc nie spotkałem się jeszcze z takim czymś. RE: Warunek - wyhamowanie przed osiągnęciem zadanej pozycji - Jarewa0606 - 20-02-2021 Ogranicza liczbę do interesujących nas parametrów, po to żeby funkcja map nie szwankowała... Czyli jeżeli z ADC interesuje nas przedział 700-800 to ta funkcja ogranicza do tych liczb jeżli będzie poniżej 700 to przyjmie 700 a powyżej 800 to przyjmuje zawsze 800. , po to żeby w funkcji map jak masz określoną minimalną i maksymalną wartość zmiennej nie podawać poniżej i powyżej bo będzie problematyczne... |