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



Teraz jest 28 mar 2024, o 16:22


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: 61
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: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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: 61
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: 61
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: 1960
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: 61
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: 1960
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: 61
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: 61
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: 61
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: 1960
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 8 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO