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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 15 lip 2025, o 16:36


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 
    Autor Wiadomość
    PostNapisane: 17 maja 2019, o 09:51 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 13 cze 2016
    Posty: 66
    Lokalizacja: Katowice
    Pomógł: 1

    Cześć,

    Robiłem sobie ostatnio prosty obrotomierz i finalnie udało mi się uzyskać jakieś wyniki ale nie do końca wydają mi się poprawne...
    Chodzi mi o to, że błąd to jakieś... 120obr/min w niektórych przypadkach nawet więcej - Zależy od prędkości :)
    Co mi nie daje spokoju to przede wszystkim, czy jeśli używam jednej zmiennej w przerwaniu INT0 to czy mogę ją zerować w przerwaniu TIMER0 ? Ponieważ tak robię :D - Zastanawiam się, czy tak teoretycznie może wystąpić "kolizja" jeśli w trakcie wykonywania się przerwania TIMER0 akurat odpali się przerwanie by input i oba te przerwania będą chciały zmienić tą wspólnie używaną zmienną... ?
    Generalnie jako tako coś działa ale wyniki są na tyle chaotyczne i czasami dziwne (nie zmieniają się kiedy trochę zwiększam prędkość), że powątpiewam w poprawność tego programu :)

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


    Może cały mój zamysł pomiaru prędkości obrotowej jest zły?
    Oczywiście wszystkie zmienne używane w przerwaniach są okraszone "Volatile" :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 maja 2019, o 10:23 
    Offline
    Moderator
    Avatar użytkownika

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

    iTTiny napisał(a):
    Zastanawiam się, czy tak teoretycznie może wystąpić "kolizja" jeśli w trakcie wykonywania się przerwania TIMER0 akurat odpali się przerwanie by input i oba te przerwania będą chciały zmienić tą wspólnie używaną zmienną... ?

    A procki AVR obsługują wielowątkowość ? żeby mogło do takiego zdarzenia dojść ? ;)

    Trzeba jeszcze sobie raz przećwiczyć temat działania przerwań. W dużym skrócie - normalnie gdy inaczej specjalnie tego nie załączysz, to w trakcie jednego przerwania nie może być obsłużone inne. Gdy podczas np obsługi przerwania (w trakcie) INT0 nadejdzie inne przerwanie - to zapali się jego flaga sprzętowa i będzie grzecznie czekać do zakończenia INT0, po czym nastąpi wykonanie jednej instrukcji z pętli głównej i od razu skok do przerwania tego co zapaliło flagę.

    Oczywiście można włączyć sobie atrybut NO_BLOCK dla procedury ISR(), no ale to już jest jazda bez trzymanki i trzeba b.dobrze wiedzieć co się robi - bo efekty złego przemyślenia mogą być o wiele gorsze do zdebugowania niż awarie stosu ;)

    _________________
    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: 17 maja 2019, o 12:40 
    Offline
    Użytkownik

    Dołączył(a): 09 paź 2016
    Posty: 71
    Lokalizacja: Olsztyn
    Pomógł: 1

    Nie zaglądałem do kodu, ale z opisu wynika, że mierzysz impulsy w czasie? Jeśli tak, to kiepska metoda. Lepiej odwrotnie.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 maja 2019, o 12:53 
    Offline
    Użytkownik

    Dołączył(a): 28 wrz 2016
    Posty: 215
    Pomógł: 14

    Zauważ, że 120 obr/min to jest 2obr/s, czyli 1 obr na 500ms. Więc masz pomiar obrotów z rozdzielczością 120obr/min.
    Żeby zmniejszyć rozdzielczość trzeba wydłużyć czas pomiaru. Ale to zła droga, bo wynik, który odświeża się po np. 10s jest bezużyteczny.
    Lepszym rozwiązaniem jest pomiar okresu, bo okres możesz zmierzyć z rozdzielczością np 1us, co przy czasie pomiaru 500ms, daje pomijalny błąd braku rozdzielczości.
    Zasada działania jest mniej więcej taka:
    -pierwszy impuls uruchamia timer w trybie licznika czasu
    - czekasz 500ms, w tym czasie licznik zlicza impulsy a timer odmierza czas
    -jak upłynie 500ms, czekasz na pojawienie się impulsu
    - impuls zatrzymuje licznik czasu.
    Otrzymujesz liczbę impulsów i czas tych impulsów. czas impulsów dzielisz przez liczbe impulsów, otrzymując okres. Okres przeliczasz na obroty i gotowe.

    _________________
    de gustibus non est disputandum



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 maja 2019, o 13:39 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 13 cze 2016
    Posty: 66
    Lokalizacja: Katowice
    Pomógł: 1

    Alef2 napisał(a):
    Zauważ, że 120 obr/min to jest 2obr/s, czyli 1 obr na 500ms. Więc masz pomiar obrotów z rozdzielczością 120obr/min.
    Żeby zmniejszyć rozdzielczość trzeba wydłużyć czas pomiaru. Ale to zła droga, bo wynik, który odświeża się po np. 10s jest bezużyteczny.
    Lepszym rozwiązaniem jest pomiar okresu, bo okres możesz zmierzyć z rozdzielczością np 1us, co przy czasie pomiaru 500ms, daje pomijalny błąd braku rozdzielczości.
    Zasada działania jest mniej więcej taka:
    -pierwszy impuls uruchamia timer w trybie licznika czasu
    - czekasz 500ms, w tym czasie licznik zlicza impulsy a timer odmierza czas
    -jak upłynie 500ms, czekasz na pojawienie się impulsu
    - impuls zatrzymuje licznik czasu.
    Otrzymujesz liczbę impulsów i czas tych impulsów. czas impulsów dzielisz przez liczbe impulsów, otrzymując okres. Okres przeliczasz na obroty i gotowe.
    Coś takiego widziałem i właśnie pod tym kątem myślałem jeszcze, żeby przerobić program. Niestety możliwość testu będę miał dopiero pod koniec miesiąca ale przygotuję sobie program już teraz a potem potestuje :)



    Wysłane z mojego POCOPHONE F1 przy użyciu Tapatalka



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 maja 2019, o 14:28 
    Offline
    Użytkownik

    Dołączył(a): 28 wrz 2016
    Posty: 215
    Pomógł: 14

    A jaki jest sposób wyświetlania obrotów?
    Pochwal się koniecznie swoja konstrukcją.

    _________________
    de gustibus non est disputandum



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 maja 2019, o 14:43 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 13 cze 2016
    Posty: 66
    Lokalizacja: Katowice
    Pomógł: 1

    Alef2 napisał(a):
    A jaki jest sposób wyświetlania obrotów?
    Pochwal się koniecznie swoja konstrukcją.
    Jak już pisałem, prosty obrotomierz, transoptor szczelinowy podłączony do int 0 i LCD 2x16 do wyświetlania wyników.
    Nie jest to żadna konstrukcja tylko bardziej bym powiedział ćwiczenia praktyczne :) Wpadł mi w ręce transoptor i chciałem coś z nim podziałać.. :)
    Dzięki za wszystkie uwagi, na pewno potestuje i będzie wszystko fajnie działało :D

    Wysłane z mojego POCOPHONE F1 przy użyciu Tapatalka



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 maja 2019, o 18:33 
    Offline
    Użytkownik
    Avatar użytkownika

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

    Jakie minimalne i maksymalne obroty przewidujesz do pomiaru?

    _________________
    http://www.sylwekkuna.com



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 maja 2019, o 18:39 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 13 cze 2016
    Posty: 66
    Lokalizacja: Katowice
    Pomógł: 1

    SylwekK napisał(a):
    Jakie minimalne i maksymalne obroty przewidujesz do pomiaru?
    Cóż, szczerze mówiąc nie mam min/max, to tylko ćwiczenie, trochę się tym pobawię i odłożę w kąt aż do momentu kiedy będzie mi to potrzebne w jakimś projekcie :)
    Zapewne do prostej konstrukcji wystarczy kilka tysięcy może 5 :)? Coś szybszego to nawet nie przychodzi mi do głowy żaden pomysł gdzie bym mógł wykorzystać pomiar do 10/20 tys obr/min ale kto wie... Jeśli zajdzie taka potrzeba to pewnie wtedy będę się nad tym głowił :)

    Wysłane z mojego POCOPHONE F1 przy użyciu Tapatalka



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 17 maja 2019, o 19:24 
    Offline
    Użytkownik
    Avatar użytkownika

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

    Przy niskich obrotach lepiej jest mierzyć odstęp między kolejnymi impulsami, natomiast przy wysokich obrotach ilość imp. w czasie. Zależy jeszcze jak dokładny chcemy wynik i jak szybko chcemy go uzyskać. Trenować można na różne sposoby dzięki czemu w konkretnej aplikacji będziesz wiedział co i jak użyć. Ja na ten przykład teraz walczę z silnikiem od pralki automatycznej. Jeszcze nie wiem do czego wykorzystam, ale postanowiłem zrobić mu regulator obrotów z użyciem PID. Tak, wiem, że są dostępne dedykowane regulatory jednak chce powalczyć na malutkim uC, bo umożliwi mi to rozbudowę o inne funkcje :) Problem o tyle skomplikowany, że chce regulację od około 120obr/min, a silnik może się kręcić nawet z 22000obr/min. Oczywiście to max i nie powinno się go nawet tak rozpędzać dlatego 12-13k mi wystarczy. Jednak to spory zakres i wybrałem tu pomiar między impulsami, bo mam natychmiastowy odczyt aktualnej prędkości co przyda się przy stabilizacji. Ograniczeniem będzie stabilizacja na wyższych obrotach, ale mi akurat zależy na tych niższych więc wybrany algorytm się tu raczej sprawdzi.

    _________________
    http://www.sylwekkuna.com



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2019, o 17:01 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 13 cze 2016
    Posty: 66
    Lokalizacja: Katowice
    Pomógł: 1

    Ok, więc tak... Dalej jest beznadziejnie ale coś mi się wydaje, że moja kolejna próba nie za wiele różni się podejściem od poprzedniej...

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



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


    W dalszym ciągu "rozdzielczoś" wyniku to 120obr/min...
    Na oscyloskopie przy max obrotach pokazuje okres nieco ponad 25ms, więc mam jakieś odniesienie :)
    Ktoś ma propozycję zmiany kodu ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2019, o 17:11 
    Offline
    Użytkownik

    Dołączył(a): 05 sty 2015
    Posty: 393
    Lokalizacja: Mielec
    Pomógł: 14

    Cześć, a nie lepiej mierzyć napięcie z tacho silnika, tak jak to robi fabryka?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2019, o 17:22 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 13 cze 2016
    Posty: 66
    Lokalizacja: Katowice
    Pomógł: 1

    Silnik AC, jeśli to możliwe to zależy mi na tym, żeby takie pomiary zrobić bez zabawy w dodatkowe rozbudowy układu.
    Poza tym zależy mi na "ćwiczeniu" samym w sobie, da się to zmierzyć w ten sposób tylko w tym momencie leży mój "pomiar" od strony programu :P I niezmiernie mnie to irytuje :P



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2019, o 17:49 
    Offline
    Użytkownik

    Dołączył(a): 05 sty 2015
    Posty: 393
    Lokalizacja: Mielec
    Pomógł: 14

    W pralkach beko siedzi atmega w programatorze, a prędkość czyta po tacho zamontowan fabrycznie na silniku, pomiar na ADC najprawdopodobniej, moje spostrzeżenia z naprawy.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2019, o 18:09 
    Offline
    Użytkownik

    Dołączył(a): 05 sty 2015
    Posty: 393
    Lokalizacja: Mielec
    Pomógł: 14

    Z us śmiało możesz przejsc na ms, przy 20000 obr/min wychodzi przerwanie co ~3ms i licz w czasie sekundy (1000ms) latwiej sie liczy,

    Ile impulsów masz na obrót?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2019, o 18:53 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 13 cze 2016
    Posty: 66
    Lokalizacja: Katowice
    Pomógł: 1

    Jeden impuls na jeden obrót, drobny element przecina transoptor szczelinowy podłączony do INT0 :)

    Wysłane z mojego POCOPHONE F1 przy użyciu Tapatalka



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 cze 2019, o 13:39 
    Offline
    Użytkownik
    Avatar użytkownika

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

    Szofer napisał(a):
    ... pomiar na ADC najprawdopodobniej...


    Można za pomocą ADC, ale jest to cholernie kłopotliwe i nawet w sterownikach przy pralkach czyta się przeważnie impulsy z tego co się orientuję. Przy pomiarze napięcia trzeba najpierw sygnał wyprostować, wyfiltrować i uśrednić. Po pierwszych testach porzuciłem ten sposób i mierzę impulsy "zero" z jednej połówki (wystarczająca dokładność). O ile pamiętam to chyba 4 impulsy na obrót mam. Tacho można podłączyć bezpośrednio pod port procka (podobnie jak i fazę z gniazdka) oczywiście przez odpowiedni rezystorek, który ograniczy prąd na pin (wewnętrzna dioda zbije napięcie do bezpiecznego poziomu). Rozwiązanie takie jest wygodne i potrzebuje tylko jednego dodatkowego elementu - rezystora około 20-50k co jest dużą zaletą. Wadą natomiast jest słaba czułość - musi być co najmniej kilka/naście obr/s dlatego po kolejnych testach zastosowałem dodatkowy stopień wzmacniający na tranzystorze dzięki czemu już przy niecałych 120obr/min (około 2obr/s - czyli bardzo wolno w stosunku do maksymalnej prędkości) mam czyste impulsy. Warto tu jeszcze zaznaczyć, że takie tacho przy 28000 obr/min daje ponad 100V(!) Nie ma się co jednak stresować i popadać w paranoje, bo ten właściwy zakres obrotów ogarnia się w 30V-35V :)

    EDIT: Dla tacho zamiast 22000 powinno być 28000 (poprawiłem)

    _________________
    http://www.sylwekkuna.com



    Ostatnio edytowano 8 cze 2019, o 12:33 przez SylwekK, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 cze 2019, o 02:25 
    Offline
    Użytkownik

    Dołączył(a): 28 wrz 2016
    Posty: 215
    Pomógł: 14

    polecam artykuł:
    http://mikrokontrolery.blogspot.com/201 ... z-diy.html
    masz gotowca

    _________________
    de gustibus non est disputandum



    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: 18 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 12 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