Skocz do zawartości

lubniewicz

Użytkownicy
  • Zawartość

    53
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    2

lubniewicz wygrał w ostatnim dniu 19 sierpnia 2019

lubniewicz ma najbardziej lubianą zawartość!

Reputacja

29 Bardzo dobra

O lubniewicz

  • Ranga
    4/10

Informacje

  • Płeć
    Mężczyzna

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Zbielu ładnie ale mi cos dalej nie pasuje. Zobaczyłem te logi, jak Ty obliczyłeś pwm? To powinna byc suma członów pid. Ps. W kolumnie I jest suma uchybow?
  2. Wrzuć logi do analizy. Rozumiem ze te dane masz przez uart? Dane wyrzycasz co 10 ms?
  3. Tak bo masz regulator hmm.... "przeregulowany". Ta wiedza jest cenna ale podzielę się nią . Słuchaj regulator musi dążyć do tego aby obiekt regulowany miał jak najmniejszy uchyb. Uchyb to różnica pomiędzy wartością zadaną a rzeczywistą, tak w mega skrócie. Załóżmy, że robot ma mieć kąt 90 stopni, a obecny kąt wynosi 88 stopni, więc uchyb to -2 stopnie (co do znaku to kwestia umowna). Jeżeli przeregulujesz nastaw na P to robot będzie tak jakby przeskakiwał np zamiast 90 stopni będzie regulowany na 88 -->> 93 -->> 88 -->> 93 wpada w oscylacje mniejsze i większe. Wysoka wartość współczynnika przy członie proporcjonalnym nie pozwoli osiągnąć zadanego kąta w tym przypadku 90 stopni. Założenie jest takie, że człon "P" robi około 70-80% całej regulacji (różnie zależy od regulowanego obiektu) a resztę roboty 30-20% już robi dużo dokładniejszy człon całkujący "I". I tutaj jest Twoje pytanie a jaki ba być Windup no własnie taki aby człon całkujący ograniczyć do tych powiedzmy 40% (czyli tak aby zapewnił 100% plus mały zapas). Czyli już w mega skrócie Człon "P" zgrubnie ustawia obiekt prawie do wartości zadanej, człon "I" uzupełnia braki do wartości zadanej bo jak wiesz mamy wzór P+I+D. Człon "D" jest tak jakby amortyzatorem tłumi drgania (jak w zawieszeniu samochodu). W członie D można przez przypadek pomylić znaki i zamiast pomagać to bardziej przeszkadza ale to już temat na inną rozmowę. Podsumowując ten wywód P prawie na 100%, a resztę robi I. Jak dasz za duży współczynnik na P to będzie bardzo nerwowy i może wpaść w duże oscylacje, tak jak tłumaczyłem będzie przestrzeliwał na lewo i prawo. P ma być zgrubny, a I na uzupełnienie. Rozumiesz?
  4. Dokładnie, wykorzystaj timer. Ustaw aby dawał przerwanie co pewien czas. W przerwaniu wystaw flage, a w pętli glownej sprawdzaj ta flage. Jak bedzie wystawiona to wykonaj funkcje. Chodzi mi abys do samego przerwania nie wrzucał obliczen. Wystaw tylko flagę. Ok działaj. Nagraj jakiś filmik później.
  5. Rzeczywiście odpalasz funkcje co 200hz? Jak to zrobiłeś? Na timerach? Wywoływanie pid czy obliczanie kata w pętli glownej to absurd! Wywoluj funkcje co pewien czas 100 czy tam 200 hz. Tylko bez delay.
  6. Dt ma wynikać z częstotliwości wywolania funkcji w której wykorzystujesz do obliczeń dt. Hmmm rozumiesz? Obliczaj kat co 100hz (na razie tyle) i od razu wykonuj regulator stabilności.
  7. A zmienne nie są przepełnione? Ogólnie tutaj jest według mnie zonk. Robisz podstawowy błąd... Zakładasz że dt moze sie zmieniać... Niestety dt musi buc stałe to podstawa. Regulatory ustawiasz pod stale dt. Nie możesz raz ustawic regulator a dt plywa. Według mnie musisz to poprawić, chyba ze chcesz aby to działało tak sobie... Ps. Zmien to. Daj stale dt poprzez zastosowanie timeroe programowych lub sprzętowy. Dobrze ze wyliczas dt ale niestety to musi być stale.
  8. Jak sprawdzasz? Sorry muszę być pewny że robisz to dobrze. Te czasy sa bardzo ważne, musze miec 200%pewności. Nie napisałeś taktowania. Pamietaj ze float obciąża atmege. Konkretnie odpowiadaj
  9. Będę dociekliwy i upierdliwy . Skąd wiesz ze jest taka częstotliwość? Jakie taktowanie procka? Czy robiłeś te pomiary na analizatorze stanow logicznych?
  10. Zaraz przejrzę kod. Z jaka częstotliwością wywołujesz regulator?
  11. Rozumiem. Będę czekał. Jest dużo darmowych programów na Androida które można wykorzystać do komunikacji np roboremo. Może lepiej z tego skorzystaj?
  12. Jestem już, nie mogłem wcześniej odpisać - obowiązki zawodowe. Robot będzie już stał na ... kołach. Robot będzie trzymał około 0 st. lecz będzie uciekał na boki bo jeszcze nie będzie miał PID prędkości, który będzie zadawał kąt. Pamiętaj, że te nastawy które teraz zrobimy mogę ulec delikatnie zmianie, ponieważ dopiero finalną regulacje zrobi się mając w sumie 3 PID. Więc nie zdziw się jak będziemy musieli jeszcze te nastawy zmienić. Będę mówił w skrócie o poszczególnych członach jako P, I, D. Jak powiem że masz zwiększyć np D to będę miał na myśli zwiększenie "ram_rejestr.p_kd". Proponuje na razie nie zakładać blokady WINDUP. Proponuje jednak aby kontrolować, aby suma błędów nie była za duża. To wyjdzie w regulacji. Ok zaczynamy: Ustaw kąt zadany na 0st. Zlikwiduj ograniczenie windup i wyświetlaj po UART jaki masz wynik na całym członie P, I, D oraz suma błędów (osobna dla każdego). Kąta już nie musisz wyświetlać po UART. Robota postaw pionowo. Zwiększaj P aby robot zaczął oscylować w pobliży 0st, mam tutaj na myśli np w granicy od -5st do 5st. Ważne aby oscylował. Trzymaj robota w pionie, dłońmi trzymaj go z tyły i z przodu aby nie pojechał. Robot ma oscylować. Jak będzie oscylował to zmniejsz P tak aby już nie oscylował. To ma być tak na styk. Wiem, że mój opis jest mało dokładny ale lepiej nie umiem tego opisać. Resztę roboty przejmie człon I. Zwiększaj I aby robot znowu zaczął balansować. Jednocześnie sprawdzaj jaką masz sumę błędu. Nie może być ta wartość za duża. Szczegółowo o tym później napiszę. Teraz zwiększaj D, aż oscylacje będą mniejsze, krótsze. D można porównać do amortyzatora samochodowego. Jak dobrze to ustawisz to robot powinien trzymać około 0 stopni i powoli odjeżdżać w tył lub przód. Mam tutaj na myśli, że może i musi przyspieszać w dany kierunek i ma trzymać około 0st. Nie może oscylować w miejscu ma delikatnie odjeżdżać w tył lub przód. Jak to zrobisz przejdziemy dalej. PS. W żadnym wypadku dane wysłane po UART nie mogą blokować częstotliwości wywołania procesu 10ms. Ja to sprawdzałem na analizatorze stanów logicznych. To jest bardzo ważne.
  13. W razie problemów, wątpliwości pisz. Przed przystąpieniem może zobacz sobie ciekawy wykład o PID. Dużo Tobie to powie:
  14. Nie dajesz -10. To było dla mnie takie ułatwienie aby nie wpisywać dużej wartości ram_rejestr.p_kd. Mam tutaj na myśli, że zamiast wpisać 500, ja wpisałem tylko 50. Minus był dlatego, że wcześniej miałem: position.gyro_0 = gyro_()*(-0.01). W Twoim przypadku nie patrz na to. Powiem Tobie o co chodzi. Odejmuję od napięcia jakie mogę otrzymać maksymalnie (i jakie miałem w trakcie regulacji) czyli 14.4V wartość aktualnego napięcia czyli np 12.1V mnożę to przez współczynnik i dodaję +1. Czyli to jest zwykła funkcja liniowa. Tą funkcję linową i współczynnik wyznaczyłem doświadczalnie. Wyglądało to tak że zebrałem parametry prąd, napięcie, moc dla danych wartości PWM. Teraz niezależnie od napięcia na akumulatorze silniki pobierają stałą moc. Jest podbijane napięcie poprzez zwiększenie PWM. Tak w skrócie aby nie zaciemniać podam przykład: PWM 128 przy napięciu 14.4V = 7.2V, natomiast już dla napięcia dla aku 11.2V = 5.6V. Rozumiesz już. My musimy niezależnie od naładowania aku utrzymać stałe napięcie przy danym PWM. Oczywiście najlepiej zmierzyć prąd i napięcie. Nie zawracaj sobie na razie tym głowy. To było takie moje usprawnienie, bo widziałem, że robot zaczął się inaczej zachowywać przy pełnym i pustym akumulatorze. Na razie odpuść temat później sam sobie zrobisz kompensację. Nie sugeruj się moimi współczynnikami sam sobie to kiedyś zrobisz. Po prostu z: temp = -constrain((pTerm + iTerm + dTerm)*multipler, -power, power) usuń multipler. Chcę Tobie tylko wskazać na problem ze regulator może inaczej działać przy innym zasilaniu niż jak miałeś w czasie regulacji. Tak, wyplucie. Pisałem skrótami bo wiem, że to zrozumiesz.
  15. To dobrze, bo dałeś mi niezłą łamigłówkę. Lecimy dalej. Robimy zgodnie z umową regulator kąta. Czyli na wejście regulatora podajemy kąt obliczony i kąt zadany. Kąt zadany to w chwili obecnej będzie 0 stopni. Później zrobimy kolejny regulator który będzie obliczał ten kąt. Podsumowując tworzymy regulator PID, wejście aktualny kąt, oraz kąt zadany na sztywno 0 stopni. Na wyjściu musimy otrzymać PWM. Może później damy jakiś filtr dolnoprzepustowy, zobaczymy. Tam też dodamy korektę po napięciu, bo wiadomo, że im mniejsze napięcie tym musimy dać więcej PWM, ponieważ regulator się rozjedzie. Obliczmy błąd: errors = (targetPosition - currentPosition); Obliczony błąd sumujemy: integrated_errors += errors*1.00; Wprowadzamy Windup błędu (czyli granicę do której sumujemy błąd. Jest to ważne aby człon całkujący nie nasycił się za mocno) integrated_errors = constrain(integrated_errors,-ram_rejestr.i_lim, ram_rejestr.i_lim); Człon proporcjonalny pTerm = ram_rejestr.p_kp *errors*1.00; Człon całkujący iTerm = (ram_rejestr.p_ki/10.00) * integrated_errors*1.0; Człon różniczkujący (ten parametr -10 to tylko dlatego aby zmienna "ram_rejestr.p_kd" była mniejsza) dTerm = ram_rejestr.p_kd * parametry.angular_velocity * (-10.00); Wprowadzamy ograniczenie - zmienna 8 bit PWM temp = -constrain((pTerm + iTerm + dTerm)*multipler, -power, power) Korekta po napięciu multipler = (144.0000 - parametry.u12/100.0000)*0.0086+1.0000; Wynik return temp; Dobra możesz działać. Myślę, że się domyślisz. Zrób dodatkowo aby: ram_rejestr.p_kp, ram_rejestr.p_ki, ram_rejestr.p_kd czyli nastawy regulatora, oraz ram_rejestr.i_lim czyli windup można było ustawiać zdalnie. Jak to zrobisz to powiem Tobie jak to wyregulować, a potem zrobimy kolejne dwa regulatory. PS. Ten PID ustaw w tym samym procesie, poniżej tego filtru komplementarnego. Oczywiście te mnożniki w członach "x10" i "x-10" możesz wywalić. Po prostu nastawy będą dziesięć razy mniejsze, nie chciałem się bawić w float .
×
×
  • Utwórz nowe...