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



Teraz jest 25 gru 2025, o 22:23


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 10 gru 2016, o 17:34 
Offline
Użytkownik

Dołączył(a): 05 lis 2015
Posty: 92
Pomógł: 0

Cześć wszystkim, chciałem prosić o pomoc w opanowaniu tematu jak powyżej. Już mówię o co chodzi... Wysyłam daną liczbę przez UART do mikroprocesora. Wartość zapisuje pod pierwszy element w tablicy. Następnie podczas ponownego wysłania liczby do tablicy, chciałbym ponownie zapisać aktualną wartość pod pierwszy element tablicy. Natomiast następną ( tą wcześniejszą umieścić pod 2 element w tablicy) i tak regularnie przesuwać wartości w prawo. Taki mechanizm chciałbym później wykorzystać do liczenia średniej.

Na razie naskrobałem coś na pętli for:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


To co wyżej to tylko tak pokazałem , ze tak się kieruje aby zmieniać elemtny tablicy, ale w ten sposób kopiuje mi się ta sama wartość do wszystkich elementów . Ogólnie to kod mam w funkcji , nie wysyłałem wszystkiego ponieważ jest na pewno źle, bo próbowałem coś na wskaźnikach itp. Kazdy elemnent tablicy podglądam sobie na lcd.
Wiem ze Pan Mirek bardzo fajnie pokazuje uśrednianie w poradnikach, ale ja chciałbym aby to było na tzw. ruchomych elementach w tablicy.


Jeśli ktoś się mną zainteresuje to bardzo mnie to ucieszy.
Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2016, o 18:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
A jest jakiś powód że musisz pomiar ładować do pierwszej komórki, całość przesuwać aby szykować miejsce dla następnego pomiaru?

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2016, o 18:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

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



zobacz co się dzieje po kolei .
kopiujesz do drugiej pozycji z pozycji pierwszej , a do trzeciej z już uaktualnionej pozycji 2.
może przesuwaj od prawej - kopiując 5-tą z 4-tej, 4-tą z 3-ciej, 3-cią z 2-giej, 2-gą z 1-szej.
coś jakoś:
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: 10 gru 2016, o 19:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 mar 2014
Posty: 356
Lokalizacja: Pruszków
Pomógł: 15

Jeśli potrzebujesz obliczać średnią to po co przesuwać te dane wrzucaj je po kolei a później po prostu oblicz średnią.
Z całej tablicy a jeśli chcesz wiedzieć która była zapisana ostatnia przechowuj pozycję tablicy w jakiejś zmiennej.

Pozdrawiam Paweł.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2016, o 20:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 cze 2014
Posty: 820
Lokalizacja: Tam gdzie PYRY są
Pomógł: 64

mucios15 napisał(a):
opiuje mi się ta sama wartość do wszystkich elementów


Tak się zachowuje bo tak napisałeś.

Przeanalizuj na spokojnie co się tam dzieje.

Wchodzisz w pętle, przepisujesz wartość z pierwszego elementu do kolejnego i zapisujesz nowe dane do elementu 0. A potem znów przesuwane dane do drugiego elementu i znów do pierwszego wpisujesz te same dane.

Spróbuj to samo ale nie w pętli a po fladze od uarta zapisać dane do elementu 0.

aha, i jak chcesz uniknąć nadpisywania wartości to musisz w drugą stronę jechać chyba co??

Teraz do elem 1 wpisujesz wartość z 0 i dalej popychasz ją kolejno do 2, 3, 4, 5.

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

_________________
IntegraMETEO
WordCLOCK
IntegraTOUCH



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2016, o 23:58 
Offline
Użytkownik

Dołączył(a): 05 lis 2015
Posty: 92
Pomógł: 0

O ile się nie myle to aby liczyć średnią kroczącą muszę przeprowadzić przesuwanie w tablicy. Dlatego wiedzieć jak to zrobić. Dziękuję za podpowiedzi. Pokombinuje i dam znać o efektach.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2016, o 10:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2014
Posty: 279
Lokalizacja: Kraków
Pomógł: 4

A może mechanizm bufora cyklicznego by zastosować? ;)

_________________
http://forum.atnel.pl/topic15633.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2016, o 14:41 
Offline
Użytkownik

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

mucios15 napisał(a):
O ile się nie myle to aby liczyć średnią kroczącą muszę przeprowadzić przesuwanie w tablicy

Można i tak, chociaż nie jest to konieczne. Wszystko zależy od tego jaką średnią ruchomą chcesz liczyć. Bo jest ich na prawdę wiele.
Jak słusznie zauważył kolega Mellanogaster, bufor cykliczny jest tu rozwiązaniem wręcz idealnym.
W skrócie wygląda to tak: bieżący odczyt wpisujesz do tablicy o indeksie i, zwiększasz indeks i sprawdzasz, czy nie przekroczył zakresu, jeśli przekroczył to zerujesz indeks. Program mógłby 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.

_________________
de gustibus non est disputandum



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2016, o 16:07 
Offline
Użytkownik

Dołączył(a): 05 lis 2015
Posty: 92
Pomógł: 0

Ja robię to tak i działa w miarę dobrze :)

oczywiście w kodzie mam zadeklarowane potrzebne zmienne oraz tablicę.

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


w sumię to nie wiele się różni ode tego co Wy oraz Pan Mirek zaproponowaliście.

Teraz powiem jak chce to wykorzystać. Chcę to wykorzystać w dwóch miejscach w programie, przy odbiorze danych z uartu ( przesył wartości jedna po drugiej).
Oraz chcę wykonywać pomiar ADC co 30 sekund np. if(licznik_sek==30). Chciałbym aby wartość pomiaru, która będzie w zmiennj pomocniczej trafiała na pierwsze miejsce w tablicy, była przesuwana i tak w koło . Mi się wydaje że liczona średnia z tych pomiarów to będzie tzw. moving average. Czy dobrze mi sie wydaje , czy jestem w błędzie i powinienm jeszcze dokładnie doczytać co to jest moving average. Wiem ze jest kilka rodzajów tej średniej ( np. ważona średnia ruchoma) . Ale mi chodzi o tą podstawową.
Ogólnie to zastanawiałem się czy w chwili if(licznik_sek==30) nie wykonywać już 10 pomiarów a nie tylko 1 . Ale pomyslaem ze przy pomiarze wolno zmiennych napięć no to w czasie dokonania tych 10 pomiarów , to wartosci nie bedą miały wielkiego rozrzutu. A tak wgl to przecież gdybym chciał w 1 sekundzie zapełnić tablice 10 elementową wartościami pomiarów, to podejrzewam ze chyba by to nie funkcjonowało do końca dobrze przy takim zapisie if(licznik_sek==30) , ponieważ czas w jakim dokonuje się tutaj pomiar wynosi 1 sekundę, a awięc to chyba za krótko aby wpisyać 10 wartości do tablicy .
Takie dziwne kwestie mi po głowie krążą, większość z nich jest spowodowana brakiem większego doświadczenia, to odrazu mówię zresztą i chyba widać. Ale dlatego pisze tematy w dziale rybnym, żeby nie bruździć moimi zagadkami w miejsu gdzie są poważne rozważania ;p



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2016, o 16:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

tak sobie myślę, :?
teraz aktualizujesz tablicę OK .Od ostatniej wartości.
Możesz ją aktualizować przecież także co licznik_sek==30.
Tylko tak myślę że lepiej jest wystawić flagę w "licznik_sek==30" i po zakończeniu pomiaru i aktualizacji ją skasować, żeby nie powtórzyła się operacja _ ponieważ " licznik_sek==30" jest spełnione przez 1000ms. :roll:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2016, o 18:25 
Offline
Użytkownik

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

mucios15 napisał(a):
Takie dziwne kwestie mi po głowie krążą

Wcale nie dziwne!
Wbrew pozorom pytanie czy "za jednym zamachem" wykonać 10 pomiarów, czy wykonywać je w odpowiednich odstępach czasu nie jest bez sensu.
Jeżeli źródłem niedokładności jest sam przetwornik, to nie ma znaczenia czy dokonujemy na raz 10 pomiarów czy co jakiś czas.
Jeżeli natomiast źródłem zakłóceń jest układ zewnętrzny i wolnozmienny (w stosunku do ADC) to należy pomiarów dokonywać w określonych odstępach czasu.
Można też ująć to inaczej:
-pomiary wykonywane na raz uśrednią na szumy ADC,
-pomiary dokonywane w określonych odstępach czasu uśrednią wszystkie szumy.

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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


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