Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 mar 2024, o 15:08


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 75 ]  Przejdź na stronę 1, 2, 3  Następna strona
Autor Wiadomość
PostNapisane: 12 wrz 2018, o 12:47 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 62
Pomógł: 0

Witam! Postanowiłem unowocześnić mój sterownik do drzwi garażowych, zrobiony jeszcze na kościach TTL.
Chcę, aby silnik siłownika łagodnie ruszał w ciągu ok. 1,5 sekundy. Na początek stworzyłem taki kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Soft_start zawarłem w funkcji, jednak nie mogę jej przerwać przyciskiem STOP. Silnik można wyłączyć dopiero gdy funkcja zakończy działanie.
Niby te 1,5 sek. to niedużo, ale w sytuacji awaryjnej szybka reakcja może być ważna.
Proszę o sugestie, co w tym kodzie jest nie tak jak trzeba.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2018, o 13:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 lut 2014
Posty: 164
Pomógł: 3

w obsłudze przycisku stop ustaw sobie flage typu np bool, a w części soft_start zrób na początku IF'a który sprawdzi czy może wykonać instrukcje w funkcji. Czyli:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
::::::: C ::::::::::
:::::: C++ :::::::::



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2018, o 18:15 
Offline
Użytkownik

Dołączył(a): 05 wrz 2017
Posty: 169
Pomógł: 31

Hej
Bardzo dobrze, że zabrałeś się za stworzenie maszyny stanów ale jak byś sobie narysował graf stanów Twojego projektu to pewnie rzuciło by Ci się w oczy że funkcja ss blokuje całość aż do wykonania. Moim zdaniem dobrze było by soft start oprzeć o przerwania, tzn w opisie słowno muzycznym. Zwłoka 3ms odliczana przez timer i w czasie tych 3 ms program dalej wykonuje pętle maszyny stanów.
W pseudo kodzie było by to coś w ten deseń:
Flaga inicjowana globalnie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Funkcja SoftStart:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


w ISR timera
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2018, o 19:41 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 62
Pomógł: 0

Dziękuję Wam za porady, muszę to przetrwała i wypróbować (dopiero raczkuję w programowaniu). Odezwę się.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 wrz 2018, o 13:43 
Offline
Użytkownik

Dołączył(a): 18 kwi 2013
Posty: 181
Lokalizacja: Kraków
Pomógł: 30

Stop awaryjny, to raczej powinno się robić fizycznie za pomocą odpowiedniego przycisku przerywającego bezpośrednio obwód zasilania silnika. Jakieś zakłócenie, awaria sterownika i program może przestać działać, a wtedy już nic nie wyłączy silnika, jeśli stop awaryjny jest zrealizowany programowo.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 wrz 2018, o 09:02 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 62
Pomógł: 0

janusz17 napisał(a):
Stop awaryjny, to raczej powinno się robić fizycznie za pomocą odpowiedniego przycisku przerywającego bezpośrednio obwód zasilania silnika. Jakieś zakłócenie, awaria sterownika i program może przestać działać, a wtedy już nic nie wyłączy silnika, jeśli stop awaryjny jest zrealizowany programowo.

Masz oczywiście rację. Obecnie mam włączony bezpiecznik topikowy szybki 8.6A włączony w obwód silnika (silnik z wycieraczek od FSO Polonez). Prąd przy otwieraniu ok. 6A, przy zamykaniu 3,5A
Do tego jest komparator kontrolujący prąd silnika za pomocą bocznika ustawiony metodą prób na granicy wyłączenia przy otwieraniu.
Mam zamiar jeszcze dobudować fotokomórkę wyłączającą silnik, ale tylko podczas zamykania drzwi (choćby tylko po to, żeby kota na przytrzasnęło ;). I to uważam za wyłączenia awaryjne.
Opisany wyżej STOP ma umożliwiać ręczne natychmiastowe zatrzymanie drzwi z pilota lub przyciskiem.
Dodam jeszcze, że mam możliwość rozsprzęglenia napędu i otwarcia drzwi ręcznie w razie braku zasilania.
Mechanizm napędu i sterownik kilka razy udoskonalałem, wprowadzałem poprawki i przez to sterownik teraz bardziej wygląda na prototyp niż na początku :mrgreen:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 wrz 2018, o 07:22 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 62
Pomógł: 0

abel11 napisał(a):
Hej
Bardzo dobrze, że zabrałeś się za stworzenie maszyny stanów ale jak byś sobie narysował graf stanów Twojego projektu to pewnie rzuciło by Ci się w oczy że funkcja ss blokuje całość aż do wykonania. Moim zdaniem dobrze było by soft start oprzeć o przerwania, tzn w opisie słowno muzycznym. Zwłoka 3ms odliczana przez timer i w czasie tych 3 ms program dalej wykonuje pętle maszyny stanów.
W pseudo kodzie było by to coś w ten deseń:
Flaga inicjowana globalnie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Czy FlagaTimera w tym kodzie, to odpowiednik zmiennej pausa_3ms z mojej funkcji ss?

Nie bardzo rozumiem działania kodu, który napisałeś.
abel11 napisał(a):
Funkcja SoftStart:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Czy funkcja SoftStart musi mieć argument?. Zmienna i jest przepisywana do rejestr OCR0B. To rejestr timera CTC, pracującego w trybie PWM. Zmienna powinna inktementować od 0 - 255, ale ja ustawiłem wstępnie wartość minimalną na 15, aby pokonać bezwładność silnika przy rozruchu.

Nie wiem co ma robić funkcja StartTMR1ms, nie widzę jej ciała.

I jeszcze w ISR timera
abel11 napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Eclipse wyrzuca błąd składni. Jeśli to ma zmieniać wartość (stan) flagi na przeciwną, to nie powinno być tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

lub tak?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 wrz 2018, o 09:26 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

daj sobie spokój z bool

toż wystarczy byle zmienną uint8_t traktować jako flagę i ustawiać ją na jeden albo zero

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


albo zmieniać jej stan na przeciwny:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 wrz 2018, o 10:37 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 62
Pomógł: 0

Kierując się sugestiami abel11, napisałem funkcję ss w ten sposób.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Usunąłem deklarację zmiennej globalnej i oraz przeniosłem do funkcji linię
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

z sekcji
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Na razie teoretyzuję, bo teraz nie mogę tego sprawdzić na żywym organizmie, czyli attiny2313 ;)
Czy to ma szasę zadziałać?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2018, o 11:43 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 62
Pomógł: 0

Witam!
W kilku miejscach dokonałem zmian i uproszczeń, ale generalnie ciągle mam problem z funkcją ss, czyli z łagodnym włączaniem silnika.
Do wyjścia PWM (PD5) podłączyłem diodę LED, żeby widzieć jak zmienia się wypełnienie sygnału pwm.
istotne fragmenty kodu:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


jeżeli funkcję ss wywołuję w ten sposób:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

to LED pulsuje - łagodnie się rozjaśnia i szybko gaśnie, i tak w kółko, ale w założeniu rozjaśnienie ma
być tylko raz i dioda ma zostać rozjaśniona.
Dodaję więc warunek:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

... i kicha - dioda zaświeca się od razu na maksa.
Co jest nie tak z tym kodem?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2018, o 12:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Tak sobie patrzę na ten Twój kod i jeśli on tylko zamyka/otwiera i ma miękko startować oraz miękko domykać (kiedy do czujnika dojedzie) to wyraźnie przekombinowałeś. Innymi słowy masz tu zrobić prostą rampę i do tego nie trzeba skoku do specjalnej funkcji, a wystarczy dwa warunki i flaga określająca kierunek (zwalnianie/ przyspieszanie). Jeśli będziesz zainteresowany napisaniem tego programu od nowa to będę kontynuował, bo aktualnie jak dla mnie to jest to troszkę chaos :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2018, o 13:21 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 62
Pomógł: 0

SylwekK chętnie skorzystam, bo męczę już ten sterownik od dwóch miesięcy i nie działa tak jak bym chciał.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2018, o 13:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Na początek utwórz flagę, np. "rampa_kierunek", która będzie przyjmować wartość 1 dla spowalniania i 0 dla przyspieszania. Zawsze gdy silnik stoi przyjmuje ona wartość 0 i program grzecznie czeka na sygnał ruchu silnika. Jeśli taki się pokaże to w głównej pętli programu, oczywiście po wcześniejszym ustaleniu kierunku obrotów silnika - zamykanie/otwieranie i ustawieniu wstępnej prędkości PWM (czyli zmienna "predkosc_silnika=15"), wykonuje się coś takiego:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Gdy brama "nadepnie" na czujnik gdzie ma zacząć zwalniać wystarczy zrobić
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Tylko teraz haczyk ;) Wszystko się wykona bardzo szybko i wypadało by zrobić regulowany czas rampy, a więc należy jakiś timer programowy (bo zwykły delay jest paskudny) sobie utworzyć w przerwaniach i dodać:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zwróć uwagę, że w tym programie wartość prędkości zmienia się przez określony przez CIEBIE czas i to wystarczy. Prędkość ustabilizuje się sama i nic nie musisz już sprawdzać ani kombinować. Chyba nie będzie problemu ze zrozumieniem tej najprostszej idei działania rampy? 8-)

_________________
http://www.sylwekkuna.com



Ostatnio edytowano 27 lis 2018, o 14:15 przez SylwekK, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2018, o 14:10 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

SylwekK dobrze gada :) polać mu! ;)

a tak na poważnie, ja żeby było "ładniej" zrobiłbym zmienną od rampy tak:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i używał np tak:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


To tylko kosmetyka ale warto korzystać z dobrodziejstw C żeby było czytelniej :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2018, o 15:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

@Nefarious19, bardzo ciekawa i ułatwiająca późniejszą analizę programu sugestia :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2018, o 20:08 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 62
Pomógł: 0

SylwekK napisał(a):
Na początek utwórz flagę, np. "rampa_kierunek", która będzie przyjmować wartość 1 dla spowalniania i 0 dla przyspieszania. Zawsze gdy silnik stoi przyjmuje ona wartość 0 i program grzecznie czeka na sygnał ruchu silnika.

Nie nadążam. Jeżeli flaga rampa_kierunek przyjmuje wartość 0 gdy silnik stoi, to jak może przyjmować 0 dla przyspieszania?

Zmienną predkosc_silnika (robi to jest to samo, co w moim kodzie zmienna i) trzeba przypisywać do rejestru OCR0B.
Mam timer programowy w "tykający" przerwaniu.

Czy mam dalej zastosować maszynę stanów, czy zrobić to inaczej?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2018, o 22:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

No dobrze...

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pisałem to w 10 minut na kolanie więc mogłem strzelić gdzieś jakąś literówkę, ale generalnie to cały Twój program nie licząc przypisania pinów i definicji oraz uruchomienia timera. Uważnie go przeanalizuj. Robi wszystko co powinien łącznie z twoim przyciskiem awaryjnym (który zdecydowanie lepiej mieć poza programem).

Aha, zakładam, że kierunkiem obrotów dwa indywidualne przekaźniki rządzą stąd PKO - otwierający i PKZ -zamykający. Pamiętaj też, że krańcówki zawsze powinny rozłączać obwód.


Autor postu otrzymał pochwałę

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2018, o 13:12 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 62
Pomógł: 0

SylwekK napisał(a):
Pisałem to w 10 minut na kolanie więc mogłem strzelić gdzieś jakąś literówkę, ale generalnie to cały Twój program...
Pierwsze moje wrażenie to: :shock: WOW! tylko tyle???
A na poważnie, to stary sterownik był oparty na dość rozbudowanych przerzutnikach RS z bramek NAND i chyba taki tok myślenia chciałem zastosować w moim programie. Już widzę że moszę się jakoś przestawić z myśleniem.
SylwekK napisał(a):
Program robi wszystko co powinien łącznie z twoim przyciskiem awaryjnym (który zdecydowanie lepiej mieć poza programem).
Przycisk STOP w założeniu nie jest do awaryjnego wyłączania, ale ma umożliwiać zatrzymanie silnika, aby np. drzwi pozostały uchylone do wietrzenia garażu.
A przy okazji chyba warunek
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

dubluje badanie stanu przycisku STOP
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Czujniki zwalniania prędkości są dwa (przed pełnym otwarciem i przed domknięciem).Czy należy w tej sytuacji zmiennej rampa_kierunek przypisywać wartości 0, 1 i 2?

Jeśli możesz, wytłumacz mi działanie tego fragmentu (linijka po linijce), coś mi umyka. Czy zmienna rampa_kierunek ma być równa zero od włączenia aż do zadziała czyjnik zwalniający?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

timer w warunku if-a jest zmienna timera programowego i w przerwaniu powinna być dekrementowana?
SylwekK napisał(a):
Aha, zakładam, że kierunkiem obrotów dwa indywidualne przekaźniki rządzą stąd PKO - otwierający i PKZ -zamykający.
Tak, a szereg z nimi MOSFET sterowany sygnałem PWM.
SylwekK napisał(a):
Pamiętaj też, że krańcówki zawsze powinny rozłączać obwód.
No, tak. Całe życie człowiek się uczy. Ponieważ w układzie testowym jako krańcówek, używam microswichy, chciałem ujednolicić wszystkie styki, klawisze i obwody OC zdalnego sterowania (czterokanałowy chiński moduł po wylutowaniu przekaźników). Czujniki zwalniania też zwierają do masy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2018, o 15:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

oowan napisał(a):
Pierwsze moje wrażenie to: WOW! tylko tyle???

Tak, tylko tyle jak na główne zadanie kontroli silnika :)

oowan napisał(a):
Przycisk STOP w założeniu nie jest do awaryjnego wyłączania, ale ma umożliwiać zatrzymanie silnika, aby np. drzwi pozostały uchylone do wietrzenia garażu.

Nie pisałem tego w poprzednim poście, bo przypuszczałem, że chodzi właśnie o uchylenie bramy i zatrzymanie w tej pozycji. Nie uwierzysz, ale powiem Ci w sekrecie, że ten przycisk w ogóle nie jest potrzebny...:D No dobra, inne jego idealne zastosowanie to fotokomórka, po której przecięciu natychmiast wszystko się zatrzymuje. Z kolei obsługa Twoich DWÓCH klawiszy sterujących to osobny temat. Pomijając fakt, że muszą być oprogramowane bezkonfliktowo do reszty algorytmu (np. nie może być otwierania, kiedy brama już jest otwarta i stoi na krańcówce) to mogą spokojnie spełniać funkcję STOP. Po prostu wciśnięcie zamykania/otwierania uruchamia procedurę, a ponowne wciśnięcie któregokolwiek(!) przycisku zatrzymuje procedurę (wysyłają sygnał STOP). Można to bardzo prosto zrealizować.

oowan napisał(a):
...dubluje badanie stanu przycisku STOP...

Być może, nie patrzyłem w Twój kod. To można zrobić albo na bezpośrednim badaniu albo na przekazywaniu zmiennej co polecam, bo wtedy inne funkcje łatwiej zrealizować i podpiąć pod jeden konkretny stan (w tym przypadku STOP).

oowan napisał(a):
Czujniki zwalniania prędkości są dwa (przed pełnym otwarciem i przed domknięciem).Czy należy w tej sytuacji zmiennej rampa_kierunek przypisywać wartości 0, 1 i 2?

Absolutnie! Po wykryciu któregokolwiek czujnika ma być "1". Nie wiem jakie to czujniki, jeśli to są jakieś krańcówki zwierne to możesz je połączyć równolegle i podpiąć pod jeden wspólny pin procesora. Brama w momencie przejazdu i chwilowego zwarcia krańcówki da sygnał dla programu, że czas zwalniać.

oowan napisał(a):
Jeśli możesz, wytłumacz mi działanie tego fragmentu (linijka po linijce), coś mi umyka.

Najbardziej cieszy mnie, że nie przepisujesz żywcem tylko chcesz poznać tą prostą zasadę rampy :)

Startujemy. Zakładam, że zmienna "stan" jest różna od "0" czyli ruszyło zamykanie (lub otwieranie). W linii 1. warunek nie jest spełniony bo jeszcze nie dojechało do czujnika spowolnienia czyli zmienna "rampa_kierunek" ma wartość 0. Skoro tak to warunek w linii 3. jest spełniony i zaczyna być zwiększana z każdym obiegiem pętli (z uwzględnieniem timera) prędkość od 0 do 255. Po osiągnięciu maksa właściwie nic się więcej nie dzieje, silnik kręci brama się zamyka aż napotyka na czujnik spowolnienia czyli "rampa_kierunek" przyjmuje właśnie wartość "1". Od tej chwili warunek z linii 3. nie jest już spełniony i wykonuje się druga jego część po else czyli dekrementacja prędkości od 255 do 15. Wartość 15 musi być dobrana doświadczalnie aby obowiązkowo silnik miał siłę jeszcze domknąć bramę. Po zamknięciu, krańcówki dopełniają dzieła skoków w programie :) I nie ma tu znaczenia czy się otwiera czy zamyka, algorytm w obie strony działa identycznie.

oowan napisał(a):
timer w warunku if-a jest zmienna timera programowego i w przerwaniu powinna być dekrementowana?

Tak, to najzwyklejszy timer programowy jaki można znaleźć w Mirkowym BB. Dodam tylko, że w Twoim przypadku gdy chcesz uzyskać około 1,5s wolnego ruchu to przy przerwaniach ustawionych na 1kHz (tyk co 1ms) wartość odświeżania timera w pętli głównej powinna wynosić 6, bo 255-15 to 240 kroków, więc 1500ms/240 = 6,25ms. Gdy przerwania masz inne (lub minimalna prędkość to, np. 30) to analogicznie musisz to przeliczyć dla innych wartości. Czas rozpędu będzie nieco dłuższy ze względu na pełny zakres 255 kroków, ale myślę, że nie ma to większego znaczenia w tym przypadku, choć to też można obejść jednym warunkiem przy odświeżaniu timera :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2018, o 19:53 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 62
Pomógł: 0

SylwekK napisał(a):
Nie uwierzysz, ale powiem Ci w sekrecie, że ten przycisk w ogóle nie jest potrzebny... No dobra, inne jego idealne zastosowanie to fotokomórka, po której przecięciu natychmiast wszystko się zatrzymuje.

Na fotokomórkę przewidziałem osobne wejście, żeby mogła reagować tylko przy zamykaniu. Inaczej musiałbym czekać z wejściem do garażu, aż brama całkowice się otworzy. Było by to kłopotliwe.

Tak na marginesie, z fotokomórką jest inny kłopot - nie ma jak jej zabudować na krawędzi otworu drzwiowego. Od wewnątrz wiązkę podczerwienie przecinają sprężyny przeciwwagi, a na zewnątrz wysuwa się brama. Dlatego ładna chińska fotokomórka ciągle jeszcze leży w szufladzie i czeka na dobry pomysł.

SylwekK napisał(a):
Z kolei obsługa Twoich DWÓCH klawiszy sterujących to osobny temat. Pomijając fakt, że muszą być oprogramowane bezkonfliktowo do reszty algorytmu (np. nie może być otwierania, kiedy brama już jest otwarta i stoi na krańcówce) to mogą spokojnie spełniać funkcję STOP. Po prostu wciśnięcie zamykania/otwierania uruchamia procedurę, a ponowne wciśnięcie któregokolwiek(!) przycisku zatrzymuje procedurę (wysyłają sygnał STOP). Można to bardzo prosto zrealizować.

Niezły pomysł.

SylwekK napisał(a):
Po wykryciu któregokolwiek czujnika ma być "1". Nie wiem jakie to czujniki, jeśli to są jakieś krańcówki zwierne to możesz je połączyć równolegle i podpiąć pod jeden wspólny pin procesora. Brama w momencie przejazdu i chwilowego zwarcia krańcówki da sygnał dla programu, że czas zwalniać.

Nie ma tak lekko, każdy czujnik musi działać niezależnie. Gdyby były połączone równolegle, jak sugerujesz, to podczas otwierania po kilku sekundach zadziała czujnik "zwalniający zamykanie". Silnik zwolni i z minimalną prędkością pojedzie dalej. Pod koniec zadziała czujnik "zwalniający otwieranie", czyli ten właściwy, ale nie będzie to miało znaczenia. Potem krańcówka otwarcia wyłączy silnik. Przy zamykaniu sytuacja się powtórzy.
Dodam, że oprócz krańcówek, wszystkie przyciski/czujniki działają chwilowo.
Jako czujniki zwalniające mam do dyspozycji albo czujniki indukcyjne z wyjściem otwarty kolektor NPN albo dwa kontaktrony i magnes.

SylwekK napisał(a):
Czas rozpędu będzie nieco dłuższy ze względu na pełny zakres 255 kroków, ale myślę, że nie ma to większego znaczenia w tym przypadku, choć to też można obejść jednym warunkiem przy odświeżaniu timera

Myślę że silnik nie może zaczynać rozpędzania od zera, bo musi pokonać opory mechanizmu i sprężyn.

Tak jak przy zwalnianiu trzeba dać 15 (lub więcej, okaże się po testach).

SylwekK napisał(a):
Najbardziej cieszy mnie, że nie przepisujesz żywcem tylko chcesz poznać tą prostą zasadę rampy

Z natury jestem dociekliwy. Wolę wiedzieć jak coś działa niż zdawać się na przypadek. To pomaga z lokalizowaniu usterek i naprawach.
Dziękuję, że to doceniasz i dzięki za pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2018, o 20:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

oowan napisał(a):
Na fotokomórkę przewidziałem osobne wejście, żeby mogła reagować tylko przy zamykaniu.

Prościzna - mała modyfikacja warunku w linii "awaria && (stan==2)" i po sprawie :)

oowan napisał(a):
z fotokomórką jest inny kłopot - nie ma jak jej zabudować na krawędzi otworu drzwiowego.

Daj jakąś fotki (przy zamkniętej, otwartej, uchylonej) krawędzi bramy. Pomyślimy coś.

oowan napisał(a):
Nie ma tak lekko, każdy czujnik musi działać niezależnie. Gdyby były połączone równolegle, jak sugerujesz, to podczas otwierania po kilku sekundach zadziała czujnik "zwalniający zamykanie".


O patrz, umknęło mi to :D Nic to... Proste obejście to dodatkowy timer na 2-3s blokujący po starcie silnika odczyt z tego czujnika i gotowe :) A jak chcesz jednak na dwóch pinach to wybór badanego czujnika bezpośrednio w maszynie stanu można zrobić po odpowiednim dla zamykania i otwierania "case". Tak będzie najczytelniej.

oowan napisał(a):
Myślę że silnik nie może zaczynać rozpędzania od zera, bo musi pokonać opory mechanizmu i sprężyn.

Przy rozpędzaniu nie ma to większego znaczenia, że od zera. Po prostu przez krótką chwilkę silnik co najwyżej będzie popiskiwał, żeby w końcu ruszyć jak już będzie wystarczająca moc na zasilaniu. Nic mu się nie stanie, ale zrobisz jak chcesz - wystarczy w pierwszym "case" ustawić tylko "prędkosc_silnika" na jakąś wartość i tyle.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2018, o 10:40 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 62
Pomógł: 0

SylwekK napisał(a):
oowan napisał(a):
Na fotokomórkę przewidziałem osobne wejście, żeby mogła reagować tylko przy zamykaniu.

Prościzna - mała modyfikacja warunku w linii "awaria && (stan==2)" i po sprawie :)

Oczywiście, ale i tak musi być podłączona niezależnie. Nie sugerujesz chyba, żeby dać fotokomórkę i przyciski po linii I2C :P

SylwekK napisał(a):
oowan napisał(a):
Nie ma tak lekko, każdy czujnik musi działać niezależnie. Gdyby były połączone równolegle, jak sugerujesz, to podczas otwierania po kilku sekundach zadziała czujnik "zwalniający zamykanie".

O patrz, umknęło mi to :D Nic to... Proste obejście to dodatkowy timer na 2-3s blokujący po starcie silnika odczyt z tego czujnika i gotowe :)
Nad tym timerem muszę pomyśleć :!: zaoszczędziłbym dzięki temu jeden pin, który może wykorzystam do czegoś innego :idea:

SylwekK napisał(a):
A jak chcesz jednak na dwóch pinach to wybór badanego czujnika bezpośrednio w maszynie stanu można zrobić po odpowiednim dla zamykania i otwierania "case". Tak będzie najczytelniej.
To już będzie blisko do mojej pierwszej, umęczonej wersji kodu, bo tak to było zrobione ;)

OK, trzeba wrzeszcie te pomysły wszczepić w kod w Eclipsie...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2018, o 11:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

oowan napisał(a):
Nie sugerujesz chyba, żeby dać fotokomórkę i przyciski po linii I2C

Ależ skąd Ci to do głowy przyszło. Modyfikacja warunku, którą zaproponowałem spowoduje tylko tyle, że przy zamykaniu bramy będzie badana fotokomórka.

Działaj! :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 gru 2018, o 20:21 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 62
Pomógł: 0

Stworzyłem takie coś (tylko pętla główna i obsługa przerwania:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Reakcja na nciskanie klawiszy jest prawidłowa, ale ciągle nie działa przyspieszanie/zwalnianie. Dioda LED podłaczona do wyjścia PWM nie rozjaśnia się. Tak jakby do rejestru OCR0B nie była wpisywana zmienna predkosc_silnika



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 gru 2018, o 20:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

I nie będzie działać... Skaszaniłeś trochę mój algorytm i na pewno zasadę rozpoznawania momentu przejścia w tryb wolny :) Co jeszcze tego nie sprawdzałem. Po prostu to pierwsze mi się rzuciło w oczy. Dam Ci szansę i pozwolę odszukać błąd. Do dzieła ;-)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 gru 2018, o 10:27 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 62
Pomógł: 0

Cytuj:
Dam Ci szansę i pozwolę odszukać błąd. Do dzieła
O! Dzięki łaskawco! ;)
Co to jest moment przejścia w tryb wolny?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 gru 2018, o 14:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Ups... Z tym przejściem w tryb wolny jest "prawie" dobrze - przepraszam moje niedopatrzenie - na telefonie jednak trochę inaczej się formatuje kod i umknęły mi pewne szczegóły, a dopiero teraz siedzę przy kompie i wrzuciłem kod do eclipsa. Nie zmienia to faktu, że ten fragment

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


powinien być badany przy konkretnym "case" (zamykanie lub otwieranie). Nie będzie wtedy konfliktu z flagą "wolniej", o którym wcześniej pisaliśmy (czyli ruszy i zaraz zwolni) lub po opóźnieniu czasowym.

Czy dla tego przypisu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

zmienna "prędkość rampy" ma gdzieś w twoim programie zainicjowaną wartość (miała być chyba 6)??. Zamiast zmiennej pośredniej od razu możesz wpisać "timer = 6;" I tu właśnie może być pierwszy błąd, bo timer u ciebie ma cały czas wartość 0, co w połączeniu z karkołomnym przerwaniem:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

może się pogryźć. Swoją drogą nie jestem w stanie logicznie przeanalizować tego przerwania. Twoja konstrukcja timera programowego jest co najmniej dziwna i obawiam się, że tu też jest źródło błędnego działania programu. Zrób dwa zwykłe timery osobny dla jazdy i migania jak, np. Mirek w BB pokazuje i jeśli będzie działać to dopiero wtedy kombinuj takie potworki.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 gru 2018, o 19:51 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 62
Pomógł: 0

SylwekK napisał(a):
Czy zmienna "prędkość rampy" ma gdzieś w twoim programie zainicjowaną wartość (miała być chyba 6)??
Mam deklarację zmiennej globalnej w takiej postaci:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

SylwekK napisał(a):
... Zrób dwa zwykłe timery osobny dla jazdy i migania jak, np. Mirek w BB pokazuje
Z timerem i przerwaniem wzorowałem się (żeby nie powiedzieć żerżnąłem na żywca) właśnie na BB, tylko już nie pamiętam w którym to miejscu było. Obsługa migania, to już mój pomysł i działa (sam się dziwię :o ), ale to mogę tymczasowo zakomentować.
A... co jest takiego karkołomnego w obsłudze przerwania? Chyba jest krótkie i szybkie, zgodnie z zaleceniami w książce?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 gru 2018, o 19:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Zakładam, że wywołanie przerwania masz co 1ms (1kHz), zrób więc w przerwaniach po prostu coś takiego:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

To wszystko jeśłi chodzi o zmienną "timer" w przerwaniach. O tym, że musi to być "volatile" już nawet nie wspominam.
Migadełka, cnt i inne możesz sobie zostawić w jakiej Ci formie pasuje, ale to co powyższe zrób właśnie dokładnie jak podałem.

------------------------ [ Dodano po: 3 minutach ]

Jeśli się nie pomyliłem to wg Twojego starego timera w przerwaniach każdy krok wykonuje się co ...1,5s(!), a nie 6ms więc prawdopodobnie nie widzisz efektu rozjaśniania, bo długo to trwa :)


Autor postu otrzymał pochwałę

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2018, o 10:23 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 62
Pomógł: 0

SylwekK napisał(a):
To wszystko jeśłi chodzi o zmienną "timer" w przerwaniach.
:D Działa :D Wielkie dzięki :!: Teraz mogę tworzyć dalej, do następnej zagwozdki :?

SylwekK napisał(a):
Jeśli się nie pomyliłem to wg Twojego starego timera w przerwaniach każdy krok wykonuje się co ...1,5s(!), a nie 6ms więc prawdopodobnie nie widzisz efektu rozjaśniania, bo długo to trwa
Rzeczywiście przekombinowałem :oops:

Podczas analizowania procedury przerwania
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
nasunęło mi się pytanie:
Dlaczego zmienna statyczna cnt nie jest ustawiana na zero przy każdym wejściu w procedurę, tylko jej wartość zostaje zapamiętana zgodnie z "naturą" zmiennej static?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 75 ]  Przejdź na stronę 1, 2, 3  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO