• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Interpolowanie zakresu ruchu
#1
Thumbs Down 
Cześć
Borykam się często z problemami niestabilnych odczytów z czujników i/lub samym  niedokładnym elementem które takie wynik oddaje lub zaklóceniami związanymi z elektrostatyką z racji tego chciałbym po części (pisze po części bo wiadomo ze odpowiedni uklad sam w sobie pewnien takie zakłócenia tłumić) wyeliminować takie zakłócenia. Mam np joysticki kotre wariują lub odczyty z potencjometrów  obrotowych które z kolei sa zamontowane na osi po której porusza się urządzenie skad idą przewody do skrzynki rozdzielczej gdzie jest wysokie napięcie łapią różne zakłócenia i oprócz wyizolowania fizycznego tych elementów i przewodów chciałbym stworzyć filtrację programowo na take zakłócenia, samo wyliczanie średniej z kilu pomiarów w odstępie czasu nie przyniesie zawsze efektów więc chciałbym stworzyć taka interpolację ruchu według cosinusa lub tangesa hiperbolicznego TEORETYCZNE dałoby to efekt uśrednionego wyniku pomiaru w przypadku gdy drastycznie zmieniałby sie odczyty w różnych odstępach czasu to średnia dalaby dość "wyfiltrowany" wynik co dałoby możliwość pracy nad takimi danymi.

Teraz pytanie czy ktoś kiedyś robił podobne nazwijmy to prosto "uśredniane wyniku" wykorzystując tą interpolację według cosinusa lub tangesa hiperbolicznego i jak to ugryźć / napisać, na co zwrócić uwagę, nad czym pomyśleć?
Pozdrawiam
 
Odpowiedź
#2
Dla przykładu podam problem z jedn z jednego z moich projektów.

Mam oto sterownik podnośnika gdzie steruję 2 silnikami 3 fazowymi poprzez 4 przekaźnik (1 przekaźnik steruję stycznikiem do jednego silnika w jednym kierunku drugi w drugim kierunku i analogicznie do drugiego silnika) na co przychodzą dwa odczyty z czujnikow położenia walu podnośnika dzeki którym ustalam zakres pracy oraz tak jak to nazwałem "autopoziomowanie" dzeki czemu jeden z podnośników a sa ich dwa wyrówna się z drugim w zależności od kierunku jazdy potem będą pracować równocześnie. Dodatkowo dwa wejścia cyfrowe do obsługi kierunku jazdy i jedno wyjście na diodę która mruga dzeki czemu użytkownik może stwierdzić działanie układu. Testując sterownik "na sucho" czyli na biurku wszystko jest w porządku lecz kiedy zamontuje się taki układ w miejscu docelowym zaczyna wariować (układ sterujący znajduje się w oddzielne puszce) po aktywacji układu dioda pracuje normalnie lecz kiedy wybierze sie który kolwiek kierunek jazdy to przekaźnik zaczynają się włączać i wyłączać w ekspresowym tempie (dioda pracuje nieustanie tak samo czyli mruga) w dodatki te od kierunku jazdy w górę jak i przeciwnym, po puszczeniu przycisku wszystko wraca do normy i dioda pracuje cały czas tak samo a przekaźnik zostają wyłączone.

Mój wniosek iz układ sie nie zawiesza lecz skaczą odczyty z czujnika co za sprawą funkcji autopoziomowania przekaźnik zostają włączane tak jak sie należy według programu a w rzeczywistości daje to efekt który nie pozwala na pracę urządzenia. Stąd pytanie o interpolację odczytów. Dodam ze w fazie testów testowałem na arduino gdzie kable nie były ułożone tak jak sie należy i autopoziomowanie przebiegło pomyślnie. Oczywiście koło wlacznika sterującego jest wyłącznik zasilania w razie W i też krańcówki które mają rozłączać zasilania do styczników w razie jak nie zadziała limit programowy

PS. Nie zamieszczałem kodu ani schematu układu ponieważ uznałem iz jest to niepotrzebne z racji pytania o samą technikę wykonania interpolacji a nie błędnego działania programu lecz jeśli ktoś chce to mogę zamieści to co trzeba
 
Odpowiedź
#3
A próbowałeś średnią rosnącą/malejącą? ona jest bardziej odporna na jednorazowe zakłócenia bo wylicza z ostatniej średniej i nowego odczytu (a nie z kilku odczytów).


srednia = srednia*ilosc_probek
srednia= srednia+odczyt
srednia = srednia/(ilosc_probek+1)
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#4
Co oznacza ilość próbek + 1? Chyba Rozumiem ze dodatkowo dzielimy poprzednia średnia. Średnią biorę z próbek które pobrałem tak? i potem wstawiam Twój kawałek kodu? Ja średnia obliczam że wstawiam wartości po kolei w ostępie czasu do tablicy i potem je dodaje do siebie i dzielę przez ilość próbek. A nie powinienem mieć dwóch ziemnych do średniej? Jedna do zapisu nowej średniej a druga średnia którą dodaje do nowej średniej?
 
Odpowiedź
#5
Uśredniania po hiperbolach nie robiłem, bardziej bym jednak stawiał na zakłócenia od działających silników/styczników/przekaźników. Wyciąganie wniosków na podstawie migania led jest trochę na wyrost, odczyty z czujników można wyrzucić do bazy danych i przeanalizować, na bieżąco je wysyłać na UART/RS485 i analizować na wykresie komputera.
Filtrowanie wskazań czujników można zrobić na podstawie wiedzy o danym procesie. Np. jak mam bojler 100 litrów wody i grzałkę 2kW to wiem, że temperatura nie zmieni się o więcej niż 0.01oC w ciągu 1s, choć bezpieczniej założyć 1oC, wiem kiedy włączam grzałkę i kiedy może mi się zmieniać, spokojnie wyeliminuje mi wskazania -127,0, 85. Takich odczytów w ogóle się do średniej nie wrzuca. A jak błędnych odczytów, takich grubo błędnych, jest więcej niż 1/10 to układ pomiarowy raczej nie jest przewidywalny. To już nie jest układ sterowania tylko wróżenia z fusów. Chyba da się przewidzieć, że jak stycznik włączysz na 1s to układ nie może przejechać 10m?
Gdyby wszystkie przekaźniki mogły pracować sterowane 3.3V to nie robiono by ich na 12V, 24V i 230V.
A to co pisaliście o PullUpach w innym wątku to nie do końca. Im większy rezystor tym mniejszy prąd, te wewnętrzne w AVR mają 20-100k i działają znakomicie, ale na biurku. Jak ktoś ma zakłócenia to trzeba schodzić niżej kosztem większego zużycia prądu. Tak samo jeśli ma być wysoka prędkość działania lub niższe VCC. Dlatego I2C pullup może działać OK 10k przy pracy 100kHz, ale do 400 już bardziej 5k, a im niższe VCC i dłuższa linia to mniejszy rezystor. DS przy większej liczbie urządzeń i większej długości kabli też nie zadziałają z 4.7k. Im mniejszy rezystor tym łatwiej sygnał przywrócić do VCC, trudniej przypadkowo ten stan zakłócić, ale trudniej ściągnąć do GND bo się zbliżamy do zwarcia.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#6
Odczyt jest płynny z tych potencjometrów i wartość zmienia się powoli podczas pracy osi. Można bez problemu przewidzieć prędkość zmiany tych odczytów. Też już prędzej myślałem o tym aby wyfiltorwac te skoki lub spadki odczytów właśnie w taki sposób aby nie rejestrować wartości większych niz jakas wartość jeżeli nie upłynął odpowiedni czas. Wiadomo iż prócz samej filtracji programowej fizyczne zakłócenia też staram sie wyeliminować, i będę ekranowalł puszkę / przewody z których ekran podłącze do GND, pododaje rezystory odsprzegajace itp, lecz program też niech filtruje wszystko dobrze aby płynnie chodziło.

Dodam ze takie zjawisko co opisywałem prędzej występuje bez podłączenia fazy na przekaźnik ani bez uruchomienia silników ani żadne urządzenie nie jest włączone prócz małego zasilacza zasilającego płytkę porostu włącznik jak i przewody od czujnikow oraz przekaźnik ida przez rozdzielenie 400v, pracy silników nie testowałem bo przy takich sytuacjach na przekaźnikach dałoby zwarcie międzyfazowe.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości