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



Teraz jest 5 sty 2025, o 12:32


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 7 lip 2015, o 21:13 
Offline
Użytkownik

Dołączył(a): 01 sty 2014
Posty: 116
Pomógł: 14

Witam!
Mój problem jest taki, że korzystam z płytki STM32VL Discovery. Próbuje zrobić balansującego robota. Dwa silniki krokowe sterowane przez stepsticki. Żyroskop i akcelerometr MPU6050. Problem pojawia się kiedy podłączam stepstick do uC. Program zawiesza się po około 2-10 sekund. Bez silników nic się nie zawiesza. Program zawiesza się w różnych pętlach oczekujących podczas transmisji I2C. Poprzedni mój robot na AVR zawieszał się w identyczny sposób. Czy silniki mogą jakoś wpływać na transmisje i2c?? Czasami program zawiesza się tak, że dopiero odłączenie i podłączenie zasilania może go ożywić.. Próbowałem rozwiązać ten problem kilka miesięcy temu, nie myślałem, że na STM znów będzie to samo.. Dlatego przypuszczam, że problem jest inny niż programowy.


Poniżej konfiguracja I2C i wyslanie danych.

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


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: 7 lip 2015, o 21:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 sie 2013
Posty: 795
Lokalizacja: Poznań
Pomógł: 59

Może po prostu niewłaściwe odfiltrowanie zasilania? Silnik krokowy generuje skok napięcia i procek staje?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lip 2015, o 21:17 
Offline
Użytkownik

Dołączył(a): 01 sty 2014
Posty: 116
Pomógł: 14

Zasilanie silnika krokowego jest całkowicie oddzielone od zasilania procesora. Przypuszczam, że stepsticki są tak zrobione, że to nie one robią problem. Ludzie w drukarkach 3D podłączają je tak jak ja i wszystko działa;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lip 2015, o 08:44 
Offline
Użytkownik
Avatar użytkownika

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

Pokaż kompletny schemat. To musi być problem z zasilaniem.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lip 2015, o 09:11 
Offline
Nowy

Dołączył(a): 09 maja 2013
Posty: 7
Pomógł: 0

W przypadku MPU6050 na I2C pojawiają się zakłócenia które łatwo zawieszają transmisje. Jeśli nie uda się wyeliminować źródła zakłóceń to należałoby je jakoś obsłużyć.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lip 2015, o 13:08 
Offline
Użytkownik

Dołączył(a): 01 sty 2014
Posty: 116
Pomógł: 14

SylwekK napisał(a):
Pokaż kompletny schemat. To musi być problem z zasilaniem.


Zastanawiałem się jak to narysować. W zasadzie połączenia są tylko
-MPU-STM
Linie SCL i SDA połączone z pinami PB10 i PB11. Podciągnięte do 3.3V przez rezystory 2k2

-STM-Stepstick:
Obrazek

sepako napisał(a):
W przypadku MPU6050 na I2C pojawiają się zakłócenia które łatwo zawieszają transmisje. Jeśli nie uda się wyeliminować źródła zakłóceń to należałoby je jakoś obsłużyć.


Właśnie zastanawiałem się czy próbować namierzyć źródło zakłóceń i spróbować zminimalizować jego wpływ na transmisje przez i2c czy udoskonalić mój program o obsługę błędów. Udoskonalenie programu jest i tak konieczne, bo wolałbym aby całość była niezawodna. Jak dam radę to spróbuje dzisiaj podłączyć silniki i MPU do dwóch procesorów. Wcześniej, kiedy robiłem coś podobnego na AVR myślałem, że przerwania jakoś zakłócają komunikacje, że jeśli wystąpią w nieodpowiednim momencie to procek się zawiesza. Teraz widzę, że pomimo całkowitej eliminacji przerwań dalej jest identyczny problem.


Zapomniałem napisać jeszcze, że podczas zawieszenia ustawione są bity:
BERR oraz ARLO w rejestrze SR1
BUSY w rejestrze SR2

Jeszcze jedna sprawa, czasami kiedy resetuje uC nie może on i tak połączyć się z MPU. Musze odłączyć i podłączyć zasilanie MPU.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lip 2015, o 14:27 
Offline
Użytkownik
Avatar użytkownika

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

Mało dokładnie, ale niech tam...
Dodaj po jednym 100nF - na głównym zasilaniu StepStick'a tuż przy płytce albo na niej jeśli się zmieści i drugi kondek na zasilaniu płytki sterującej (tam gdzie procek). To na początek i jeśli dalej będzie źle to bez dokładnego schematu raczej ciężko będzie coś stwierdzić.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lip 2015, o 14:40 
Offline
Użytkownik

Dołączył(a): 01 sty 2014
Posty: 116
Pomógł: 14

Zasilanie silników jest z osobnego źródła(bateria), całkowicie odseparowanego od zasilania uC (USB). Dodam kondensatory ale szczerze wątpię, że pomogą;(

Mam następne problemy;) Chcę obsłużyć jakoś błędy które powstają, przerwać niepoprawną transmisję i rozpocząć od nowa. Co powinienem robić w przerwaniu?

Po pierwsze kasuje flagi. Czy zależnie od błędu mam ustawiać odpowiedni bit ręcznie i próbować ruszyć transmisję dalej( chodzi mi o to, że jeśli i2c zawiesi się na pętli po wysłaniu sygnału startu - ustawić bit SB ręcznie?) czy próbować przerwać wszystko i jakoś ruszyć od nowa? Wydaje mi się, że lepiej wystartować od nowa. Ale jak to zrobić? Wysłać sygnał STOP i co dalej? Jak wyjść z zawieszonej pętli?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lip 2015, o 15:08 
Offline
Użytkownik
Avatar użytkownika

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

Pisałem to już kilka razy, kiedyś przy testach na stykówce po prostu zapomniałem dodać taki kondek na głównym zasilaniu chociaż był przygotowany i bez silnika krokowego wszystko pięknie działało, natomiast po podłączeniu silnika działy się CUDA(!) Kiedy dołączyłem kondek ... jak ręką odjął. Rób jak chcesz.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lip 2015, o 15:24 
Offline
Użytkownik

Dołączył(a): 01 sty 2014
Posty: 116
Pomógł: 14

Dodałem, jakby trochę lepiej;) Ale cały czas problem występuje. Zastanawia mnie fakt, że czasami zawiesza się tak bardzo, że trzeba odłączyć zasilanie od MPU6050 aby można było coś zrobić.. Bez tego zawiesza się już podczas wysyłanie STARTu.


Częściowo rozwiązałem problem;) zasilam stepstick z 5V, prosto z USB. STM zasilany jest przez regulator a silniki z całkowicie osobnego źródła.

Zostaje jedno pytanie. Jeśli już nastąpi zawieszenie. Trzeba odłączyć od zasilania MPU6050 i podłączyć z powrotem aby można było się skomunikować. MPU po crashu trzyma linie SDA na 0V. Czy jest jakiś sposób na "HARD RESET" tego układu albo w jakiś sposób "odwieszenie" go??



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lip 2015, o 19:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 maja 2013
Posty: 432
Lokalizacja: Gostyń / Poznań
Pomógł: 25

Sterowac zasilanie, przez tranzystor moze? Wtedy jak nie gada sam sobie go zresetujesz...

_________________
Podpis...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lip 2015, o 19:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Mam taki pomysł aby
aby przed transmisją ustawić Watchdog-a na czas potrzebny do udanej transmisji
jeśli transmisja się zawiesi to watchdog wykona reset jeśli przejdzie
zablokować watchdog-a .

Zaraz po resecie trzebaby wyłączyć watchdog żeby znowu nie resetował uC.

Nie wiem czy to zadziała nigdy jeszcze nie używałem watchdog-a,
wiem tylko że potrafi zresetować uC :D

edit :

oj sorry
nie doczytałem dokładnie Tobie chodzi o reset układu a nie procka. :oops:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lip 2015, o 20:14 
Offline
Użytkownik

Dołączył(a): 01 sty 2014
Posty: 116
Pomógł: 14

eMCe2 napisał(a):
Sterowac zasilanie, przez tranzystor moze? Wtedy jak nie gada sam sobie go zresetujesz...

No właśnie zastanawiałem się czy tak można;) w ostateczności będzie trzeba tak zrobić;(

Żaba też jest to jakieś wyście ale raczej też ostateczne.

Na razie jestem o jeden krok dalej. W 70% działa;) Tzn nie zawsze za pierwszym razem udaje się odpalić wszystko bez odłączanie MPU

Uruchamiam zegar dla I2C dopiero po inicjalizacji GPIO i robie restart I2C poprzez
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Czytałem o tym problemie ale myślałem, że nie dotyczy on mnie, ponieważ w swoim programie resetowałem I2C w taki 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.



Przede mną ostatnie zadanie i pytanie ( mam nadzieje ). Mianowicie próbuje w przerwaniu wywołanym jednym z błędów w transmisji I2C przywrócić komunikacje z powrotem.

Obsługa mojego przerwania wygląda następująco:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I jeszcze procedura odbioru danych:

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


Niestety nie do końca to działa.. Jak poprawnie obsłużyć błędy w transmisji ??



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lip 2015, o 07:08 
Offline
Nowy

Dołączył(a): 09 maja 2013
Posty: 7
Pomógł: 0

Jeśli funkcja inicjalizacji I2C wygląda tak jak w I2C_Config_DW(void) powyżej to nie masz ustawionego bitu 8 w rejestrze I2C1->CR2. Można ustawić Bit 9 ITEVTEN oraz Bit 8 ITERREN: wtedy odpowiednio obsługujesz to w przerwaniach void I2C1_EV_IRQHandler(void) oraz void I2C1_ER_IRQHandler(void). U mnie obsługa tego drugiego jest dość prosta czyli jesli wystąpi jakikolwiek błąd restartujesz MPU.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obsługa tej pierwszej jest już bardziej skomplikowana (kody są pisane dla procesora STM32F407VGT6).
Natomiast obsługa odbioru wygląda 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: 9 lip 2015, o 21:03 
Offline
Użytkownik

Dołączył(a): 01 sty 2014
Posty: 116
Pomógł: 14

sepako napisał(a):
nie masz ustawionego bitu 8 w rejestrze I2C1->CR2


Dopisałem to kiedy zaczynałem obsługiwać przerwania. Przerwanie wykonywane jest poprawnie.

sepako napisał(a):
U mnie obsługa tego drugiego jest dość prosta czyli jesli wystąpi jakikolwiek błąd restartujesz MPU.


No właśnie chodzi o to jak zrestartować to MPU jak nie ma z nim komunikacji a restart I2C w uC nic nie daje;(

Powiedzmy, że jest w miarę dobrze;) Od czasu kiedy zasilam stepstick 5V procesor nie zawiesza się:) Musiałem ręcznie zwierać SDA i SCL do masy;p czasami to przechodzi a czasami nie. Czasami nie da się zrestartować procesora i zawiesza się on w pierwszej lub drugiej pętli i2c.. no ale na razie zostawiam temat i idę dalej.

Dzięki za pomoc;)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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