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



Teraz jest 18 kwi 2026, o 08:12


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 12 gru 2015, o 20:16 
Offline
Użytkownik

Dołączył(a): 07 paź 2015
Posty: 79
Pomógł: 0

Szanowni Forumowicze.
Od pewnego czasu pracuję nad robotem mobilnym sterowanym za pomocą atmegi8L. Mój problem w tym momencie to regulacja prędkości silnika DC. Jak chcę to zrobić? Mam enkoder, który generuje sygnał prostokątny w zależności od prędkości obrotowej silnika. Doświadczalnie sprawdziłem - przy pomocy oscyloskopu - że silnik pracuje optymalnie gdy enkoder pokazuje 40ms pomiędzy zboczem narastającym i opadającym. Tę wartość przyjąłem jako wzorcową dla regulatora. Sygnał z tego enkodera chcę podawać na pin INT0 i liczyć odległość pomiędzy zboczami za pomocą przerwania zewnętrznego oraz timera 8-bitowego. Silnikiem steruję przez mostek L293DNE i na prędkość silnika wpływam sygnałem PWM i chcę regulować ten PWM programowo/automatycznie w zależności od prędkości zadanej w zmiennej n_0. Poniżej przedstawiam fragment kodu z mojego programu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zegar taktuje 1MHz więc preskaler dałem 1024 żeby impulsy wychodziły co ok. 1ms. Zrobiłem to po to aby wartość liczbowa odpowiadała zadanemu czasowi w zmiennej n_0.
Wg mnie powinno wszystko działać, ale nie działa. Jak uruchomię program i pojazd to zawsze wartość OCR1B leci do 500. Już nie wiem czego się chwycić. Bardzo proszę o wskazówki, świeżym okiem pewnie lepiej się coś zauważy :) Jeśli potrzeba jeszcze jakichś informacji odnośnie układu to dopiszę.
Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 gru 2015, o 21:04 
Offline
Użytkownik
Avatar użytkownika

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

Ile impulsów na obrót daje ci silnik? pomiar tylko jednego impulsu i wg niego regulowanie PWM raczej nie da dobrych efektów, bo odstępy chyba nie będą idealne. Jeśli masz trzy śmigiełka w enkoderze to czytaj zmianę stanu dzięki czemu podwoisz ilość impulsów, a to już pozwoli wiarygodnie zmierzyć częstotliwość i to od niej uzależniaj obroty. Jeśli zajdzie taka potrzeba można użyć zmiennej doganiającej z niewielkim opóźnieniem (czyli po prostu opcja bardzo delikatnej rampy) dzięki, której zmiany prędkości będą bardziej płynne. Aha, sam pomiar częstotliwości nie musi być wykonywany w przerwaniach INT. Możesz spokojnie ustawić zwykłe przerwania, czytać dowolne porty (sądząc po czasie nadchodzenia kolejnych impulsów wystarczyć powinno nawet 1kHz) i tam mierzyć częstotliwość.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 gru 2015, o 21:27 
Offline
Użytkownik

Dołączył(a): 07 paź 2015
Posty: 79
Pomógł: 0

Mam 8 impulsów na obrót (magnes neodymowy 8-polowy).
Odnośnie przerwań - jeśli nie INT to gdzie? :)
Jeśli będę reagował na zmianę stanu to sytuacja będzie taka, że raz zmierzę odległość między zboczem opadającym a narastającym albo na odwrót, a żeby obliczyć częstotliwość to muszę wiedzieć między jakimi zboczami liczę odległość, czy tak?

Jednak moją największą bolączką w tym momencie jest to, że OCR1B ciągle leci do 500, nieważne co zrobię. Jak sobie z tym poradzić?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 gru 2015, o 22:40 
Offline
Użytkownik
Avatar użytkownika

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

Cytuj:
Mam 8 impulsów na obrót (magnes neodymowy 8-polowy).

No to spokojnie 16 tyknięć masz jak na talerzu :)

Cytuj:
Jeśli będę reagował na zmianę stanu to sytuacja będzie taka, że raz zmierzę odległość między zboczem opadającym a narastającym albo na odwrót


...i co w tym złego? Tak między nami to ostatnio moja ulubiona metoda mierzenia obrotów, a przede wszystkim bardzo łatwa do zrealizowania. Mam nawet wrażenie, że łatwiejsza niż liczenie konkretnego zbocza :) Do jego kontroli wystarczy jedna prosta linia programu(!) i jeden nikomu niepotrzebny bit :)

Cytuj:
żeby obliczyć częstotliwość to muszę wiedzieć między jakimi zboczami liczę odległość, czy tak?

Wystarczy, że zmierzysz w jednostce czasu ilość impulsów lub policzysz np. 10 czy 20 impulsów i zmierzysz czas w jakim tego dokonałeś.

Cytuj:
Jednak moją największą bolączką w tym momencie jest to, że OCR1B ciągle leci do 500, nieważne co zrobię. Jak sobie z tym poradzić?


Nie chce mi się dogłębnej analizy prowadzić, ale to badanie jest trochę dziwne dla mnie:
if ((n_0r < n_0) && (OCR1B >= 0 && OCR1B < 500))
i po nim zwiększanie rejestru.
Spodziewasz się w tym rej czegoś mniejszego od zera lub większego od 500, bo tak jak jest teraz to mam wrażenie, że zawsze będzie zwiększać jego wartość.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2015, o 00:50 
Offline
Użytkownik

Dołączył(a): 07 paź 2015
Posty: 79
Pomógł: 0

Te warunki to na wypadek gdyby jakimś cudem OCR1B zrobiłoby się ujemne.

Już nie mam pomysłu na tę regulację. Próbowałem zliczać impulsy w czasie (u mnie powinno być 5 zmian stanu na 256ms, czyli na jeden cały zakres timera 8-bitowego z preskalerem 1024 i zegarem 1MHz), próbowałem podziałać z regulatorem PI (który mi zbytnio nie wyszedł) i nic mi nie wychodzi, jakbym w ogóle nic nie robił tylko od razu strzelił OCR1B na maksa czyli 500.
Proszę o jakieś dalsze wskazówki jak to poprawnie wykonać, bo już ręce i nogi opadają.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2015, o 18:47 
Offline
Użytkownik

Dołączył(a): 07 paź 2015
Posty: 79
Pomógł: 0

Oto jak próbuję policzyć ilość impulsów w czasie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Mam dwa przerwania - jedno do rejestracji i zliczania impulsów z enkodera, a drugie w momencie przepełnienia timera. Czyli regulacja odbywa się co przepełnienie. W okresie jednego przepełnienia powinny pojawić się 4 zmiany stanu z enkodera. Jednak ten kod działa tak, że ILOSC_IMPULSOW w ogóle zdaje się nie mieć znaczenia i OCR1B ustala się na poziomie 400, a to daje 8 zmian stanu z enkodera w jednostce czasu jakim jest jedno przekręcenie się licznika timer/counter0. Jakim cudem ILOSC_IMPULSOW w ogóle nie ma znaczenia w tym kodzie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 gru 2015, o 21:28 
Offline
Użytkownik
Avatar użytkownika

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

Spróbuj 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.


Jeśli przerwania masz ustawione prawidłowo to powinno działać.

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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Majestic-12 [Bot] i 7 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