• 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
Accelestepper i kłopoty
#13
Funkcja czas() jest do wszystkiego w programie. Niektóre rzeczy muszą być robione w każdym loop i tylko wtedy nie używam funkcji czas() i jej zmiennych.
Arduino jest oparte o gotowe funkcje, normalnie w C z AVR można realizować polecenia bezpośrednio na rejestrach uC, wtedy taka najmniejsza jednostka programowa trwa 62ns przy zegarze 16MHz, 16mln operacji w sekundę. Ale do każdego uC trzeba napisać inny program. Arduino upraszcza to ujednolicając polecenia do różnych uC analizując funkcjami jaki zestaw poleceń wykonać w każdym przypadku i to powoduje spadek wydajności do <1mln /s. Ale to tylko przy miganiu LED, są funkcje, które zajmują po 20ms i wtedy można ich zrobić w 1s tylko 50. Jak będą wywoływane zbyt często to będzie to działać jak Windows z komputerem sprzed 3 dekad. Jak wstawiasz w loop delay 2000 to pewnie tworzysz funkcję, która potrwa powyżej 2000ms, a to nie zadziała dobrze. Porównaj sobie teraz, jak zacznie pracować Twój PC, gdy mu zmienisz ilość cykli zegara z 3GHz do 1kHz, tak z 3mln x wolniej, życia braknie.
Jeśli silnik ma mieć prędkość 3000 to nie możesz zrobić loop trwającego dłużej niż 1s/3000. Może trzeba zmniejszyć podział mikrokroków kosztem płynności jazdy. Albo znaleźć bibliotekę do stepera opartą o przerwania, tak by sterowanie nim było niezależne od długości loop. Może uC z zegarem 240MHz (ESP32) zamist 16MHz.
Funkcja czas jest do zarządzania czasem, możesz wymyślić inną, opartą o timer sprzętowy, albo inną opartą jak moja o millis(), ale z delay zrobienie programu jest nierealne. To jest tylko do szybkiego pokazania jednej, max dwu funkcji, tak by spowolnić ich działanie do możliwej dla zaobserwowania dla człowieka, do zrobienia DEMO. W każdym programie użytkowym jakoś trzeba czasem zarządzać.
Funkcja czas ustawia flagi różnych okresów czasu na 0 (bez względu na ich stan) i sprawdza czy minął czas>=tik, jeśli tak ustawia flagę fnTik tego najmniejszego okresu. Wartość okresu tik można sobie ustalić wg potrzeb. W tym loop gdy to nastąpi można to wykorzystać np. do okresowego sprawdzania stanu pinu z przyciskiem. Dalej w funkcji czas jeśli minął okres tik, zwiększana jest suma tików nTik i jak przekroczy liczbę równą sekundzie ustawiona jest flaga dla sekund. W tym konkretnym obiegu loop gdy to się stanie zadziałają wszystkie funkcje w bloku if(fsekundy). Jednocześnie jest zwiększany licznik sekund, analogicznie minut, godzin, dni i ich flagi. Gdy minie dzień od poprzedniego dnia tylko raz w jednym obiegu funkcji loop będzie taki stan flagi fdni, np. by nasypać psu do miski karmy, bez wstawiania delay na 24h.
Potem można wykorzystać to w różnych funkcjach i nie trzeba przywoływać w każdej funkcji millis(), która trwa z 10us. Można łatwo coś wykonać co 200ms, jest to wtedy gdy jest flaga fnTik==1 i liczba tików taka, że reszta z dzielenia przez 20 jest równa 0: if (fnTik and (nTik%20==0)).
Do każdego zadania jest odpowiednie narzędzie, do wielu długich zadań pasuje maszyna stanów z konstrukcją switch case. Podziel sobie całe zadanie na etapy do zrealizowania, np. pozycja 0 i oczekiwanie na ruch, przejazd silników do pozycji 1, oczekiwanie, przejazd do pozycji 2, oczekiwanie, powrót do pozycji 0 i powtórzenie cyklu. Oczywiście oczekiwanie to nie delay, to liczenie i sprawdzanie czy upłynęło już tyle ms/us by przejść do kolejnego punktu zadania. Potem kolejnym krokiem jest budowanie zestawu takich funkcji do różnych przejazdów kamery, z różnymi parametrami prędkości.
Tu jest przykład jak tworzyć taką funkcję: https://www.youtube.com/watch?v=v8KXa5uRavg .
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Wiadomości w tym wątku
Accelestepper i kłopoty - przez andrzejn - 01-02-2022, 22:09
RE: Accelestepper i kłopoty - przez kaczakat - 02-02-2022, 00:39
RE: Accelestepper i kłopoty - przez andrzejn - 02-02-2022, 00:52
RE: Accelestepper i kłopoty - przez kaczakat - 02-02-2022, 04:06
RE: Accelestepper i kłopoty - przez andrzejn - 02-02-2022, 10:39
RE: Accelestepper i kłopoty - przez andrzejn - 02-02-2022, 11:00
RE: Accelestepper i kłopoty - przez kaczakat - 02-02-2022, 14:34
RE: Accelestepper i kłopoty - przez andrzejn - 02-02-2022, 21:12
RE: Accelestepper i kłopoty - przez kaczakat - 03-02-2022, 02:15
RE: Accelestepper i kłopoty - przez andrzejn - 04-02-2022, 15:45
RE: Accelestepper i kłopoty - przez kaczakat - 04-02-2022, 23:53
RE: Accelestepper i kłopoty - przez andrzejn - 05-02-2022, 20:07
RE: Accelestepper i kłopoty - przez kaczakat - 05-02-2022, 21:22
RE: Accelestepper i kłopoty - przez andrzejn - 08-02-2022, 21:15
RE: Accelestepper i kłopoty - przez kaczakat - 08-02-2022, 21:31
RE: Accelestepper i kłopoty - przez andrzejn - 09-02-2022, 12:05
RE: Accelestepper i kłopoty - przez kaczakat - 09-02-2022, 20:39
RE: Accelestepper i kłopoty - przez andrzejn - 10-02-2022, 20:43

Skocz do:


Przeglądający: 1 gości