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



Teraz jest 20 maja 2019, o 23:34


Strefa czasowa: UTC + 1





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

Dołączył(a): 13 cze 2016
Posty: 46
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 ]
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: 24306
Lokalizacja: Szczecin
Pomógł: 915

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: 48
Lokalizacja: Olsztyn
Pomógł: 0

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: 152
Pomógł: 12

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: 46
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: 152
Pomógł: 12

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: 46
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: 1589
Lokalizacja: Lipsko
Pomógł: 115

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: 46
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: 1589
Lokalizacja: Lipsko
Pomógł: 115

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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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