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



Teraz jest 25 kwi 2024, o 08:17


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 45 ]  Przejdź na stronę Poprzednia strona  1, 2
Autor Wiadomość
PostNapisane: 28 wrz 2018, o 09:52 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Robert_1967 napisał(a):
Na kalkulatorze wychodzi dobrze, a na lcd źle.

Wyniki obliczeń na liczbach całkowitych w mikrokontrolerze zawsze są zaokrąglane w dół. Na kalkulatorze liczysz pewnie przy użyciu liczb ułamkowych.
Trzeba też pamiętać, że nawet przy stałej wartości ADC i obliczeniach na liczbach zmiennoprzecinkowych średnia wartość praktycznie nigdy nie osiągnie wartości ADC, chyba że wartość początkowa średniej (przed rozpoczęciem uśredniania) również będzie równa ADC, ewentualnie zastosujemy jakieś zaokrąglenia.
Jeśli chcesz zniwelować różnicę unikając stosowania liczb zmiennoprzecinkowych, spróbuj zmienić formułę tak, by prawidłowo zaokrąglała w górę w razie potrzeby i/lub zwiększ rozdzielczość poprzez obliczanie średniej przy użyciu wielokrotności ADC.
Przy obliczeniach na liczbach 32-bitowych i średniej z 10 pomiarów, bezpiecznie będzie po odczytaniu wyniku ADC pomnożyć go nawet przez 1000, wykonać obliczenia średniej, a przed wyświetleniem średniej ponownie podzielić ją przez 1000 i zaokrąglić. Ewentualnie taką zwielokrotnioną średnią można od razu przeliczać odpowiednio na wartość napięcia (wynik będzie wtedy w mV) uzyskując większą rozdzielczość.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 wrz 2018, o 10:12 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

Dzięki andrews

Akurat ten przykład zawiera liczby całkowite. Ja ustawiłem sobie peerkiem max. wartość i odczyt jest prawidłowy, tzn 1023 w linijce nr1 lcd. Następnie do kalkulatora wpisałem również 1023 i wykonałem działania, jak w poście wcześniejszym (te zakomentowane) i w linijce nr 3 na lcd wynik już się różni. W żadnym momencie podczas liczenia na kalkulatorze nie wyskoczyły mi liczby z przecinkiem. Kod jest tak krótki i oczywisty, że ja nie widzę błędu. Nie rozumiem, co tu nie gra. A może tak ma być, a ja znów drążę dziurę w całym ???. Ale to chyba oczywiste, że jeśli są wątpliwości, to staram się wyjaśnić na początku. Dzięki.

Chciałem dodać, ze natrafiłem na podobny chyba temat. Nie czytałem go jeszcze, ale chyba znajdę wyjaśnienie. Nie mniej jednak postaram się sprawdzić Twoją metodę. Pozdrawiam.

https://forum.atnel.pl/topic19382.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 wrz 2018, o 10:44 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Robert_1967 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.

Pokaż mi w takim razie, gdzie w Twoim kodzie wpisujesz do zmiennej wartosc_usredniona wartość 1023, tak jak to robisz podczas obliczeń na kalkulatorze.
Później wykonaj obliczenia na kalkulatorze, przyjmując wartość początkową wartosc_usredniona = 0, czyli to co powyżej powinno 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.

Możesz też sprawdzić, ile razy musi nastąpić uśrednianie (w Twoim przypadku obieg pętli while()), aby wartość średnia zbliżyła się do wartości ADC.


andrews napisał(a):
... średnia wartość praktycznie nigdy nie osiągnie wartości ADC, chyba że wartość początkowa średniej (przed rozpoczęciem uśredniania) również będzie równa ADC, ewentualnie zastosujemy jakieś zaokrąglenia.


Oczywiście tylko hipotetycznie. Nie chodzi o mi to, żeby inicjować średnią wartością ADC. Chodzi mi tylko o sposób działania tej metody uśredniania.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 wrz 2018, o 11:47 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

Dzięki andrews
Najmocniej przepraszam za moje głupoty :oops: . No tak. Nie przeanalizowałem wszystkiego na spokojnie do końca i wyskoczyłem z postem. Myślę, że teraz jest dobrze:

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


Nie pierwszy raz tak zrobiłem. Za szybko piszę posty i potem tak wychodzi. Postaram się poprawić. No ale dzięki Twojej cierpliwości i mojemu uporowi coś zostało w głowie. Mam nadzieję, ze teraz napisałem dobrze, ponieważ się spieszę, a muszę już odejść od komputera.

Tak, czy inaczej temat ciekawy i muszę jeszcze trochę przy tyn posiedzieć. Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 wrz 2018, o 11:55 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Robert_1967 napisał(a):
Mam nadzieję, ze teraz napisałem dobrze, ponieważ się spieszę, a muszę już odejść od komputera.


Obliczenia się teraz zgadzają, tylko pamiętaj o tym, o czym pisałem wcześniej - wykonując obliczenia w ten sposób wartość średnia nigdy nie osiągnie wartości ADC - będzie mniej więcej tak, jak pokazałeś na zdjęciu wyświetlacza.

EDIT:
Dodam jeszcze, że wykonywanie pomiarów wewnątrz głównej pętli programu nie jest (moim zdaniem) dobrym rozwiązaniem. Zdecydowanie lepiej jest inicjować pomiar w stałych odstępach czasu, w przerwaniu timera. Czas obiegu głównej pętli programu bardzo rzadko jest stały.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 paź 2018, o 21:03 
Offline
Użytkownik

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

andrews napisał(a):
że wykonywanie pomiarów wewnątrz głównej pętli programu nie jest (moim zdaniem) dobrym rozwiązaniem

Jak najbardziej. Najlepiej odpalić sobie TIMER, i wewnątrz przerwania wykonywać pomiar.
Temat mnie zainteresował, bo kiedyś próbowałem zrobić coś podobnego.
Jakbym się miał (zamierzam) tym zajmować, to zrobiłbym tak: co 1ms wykonywałbym pomiar, sumowałbym pomiary (jeszcze nie wiem czy 16, 32 czy więcej) by powiększyć rozdzielczość pomiaru. Lub też suma posłużyłaby mi do policzenia średniej. Brałbym też wartość maksymalna w przedziale uśredniania/oversamplingu. Wartość maksymalna byłaby czymś w rodzaju funkcji Peak Hold. I w ten sposób wyświetlacz pokazywałby wartość aktualną i maksimum z ostatnich kilku pomiarów.
Druga sprawa, to wyświetlacz LCD jest bardzo wolny, wyświetlacz VFD zgodny z HD44780 byłby to dużo lepszy (szybszy). Niestety ceny takich wyświetlaczy "powalają". Chyba, ze uda się znaleźć coś tańszego.
W każdym razie trzymam kciuki za powodzenie Twojego projektu.

_________________
de gustibus non est disputandum



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 paź 2018, o 06:35 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

Dzięki Alef2
Do końca tygodnia postaram się uruchomić coś na właściwym sygnale, czyli audio. rzecz w tym, że aktualnie nie mam czasu w domu, ponieważ inne priorytety i przygotowania do zimy ;) . Mogę tylko w pracy poświęcić trochę czasu, a więc dłubię na zestawie i w eclipse i pisze na forum.
Jeśli dzisiaj znajdę trochę części i spakuję, to będę mógł zmajstrować jakiś prosty na początek układ wejściowy i wysterować atmegę. Może złożę układ wejściowy kolegi Nefarious19 na stykówce i będę mógł wtedy podłączyć się pod kartę, póki co. Da mi to możliwość zobaczenia, jak te moje logarytmiczne wyświetlanie działa. W pracy nie mam wzmacniacza, a więc ten sposób będzie dobry.
Dzięki Wam za dobre rady. Pokombinuję z przerwaniami, chociażby dla celów edukacyjnych, ale ze swojej strony powiem, że finalnie nie ma co tak komplikować sobie projektu. Linijka ma tylko prawidłowo działać, obrazować to, co chcemy i jest to w sumie tylko taki bajer. Po kilku dniach lub godzinach się nacieszysz i potem zapomnisz :) . Nie oszukujmy się. Gdyby to miał być jakiś laboratoryjny przyrząd, liczenie tych wszystkich próbek, uśredniania itp...może miałyby sens ???. Tylkom nie zrozumcie mnie źle i piszcie dalej. Dla mnie każda rada jest cenna. Co do 1 ms, to ja bazuję puki co na rozdzielczościach, jakie sugeruje Mirek, czyli np. 10ms podstawy czasu. Moje programowanie, to czysta zabawa i projekty mało ambitne. Idzie bardzo powoli, ponieważ nie mam wiele czasu.
Mam nadzieję, ze jeszcze się czegoś więcej nauczę, ale na tą chwilę jest, jak jest. Jak tylko uruchomię, to napiszę i załączę filmik.
Co do pokazywania wartości szczytowej i zamrażania jej na chwilę (linijka opada, ale ostatnia cegiełka lub kreska w kolumnie jeszcze się pali), to już dawno chciałem tak zrobić w innym mierniku, ale na razie nie wiem zbytnio, jak. Widziałem gdzieś w internecie tak działający. Fajnie to wygląda. Temat z pewnością będę męczył. Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 11:17 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

Witam po małej przerwie.
Chciałem pokazać, jak zachowuje się mój bar w czasie wyświetlania. Nie mniej jednak nie to jest tematem tego postu. Chodzi mi zasadniczo o wyświetlenie i chwilowe zamrażanie wyniku. Być może zechcę zaimplementować pokazywanie np. dB lub % i szybkie migotanie cyfr jest nie do przyjęcia.
Nie podaję całego kodu, ponieważ wcześniej pisałem, ale tylko to, co dotyczy samego wyświetlenia i zamrożenia wartości w %. Z filmiku widać, jak to działa. Przy sygnale narastającym w czasie wynik jest automatycznie dodawany, a kiedy sygnał słabnie lub zanika, to pokazywana jest przez chwilę ostatnia najwyższa wartość.
I teraz moja prośba.
Proszę o ewentualne przeanalizowanie kodu, ponieważ już kiedyś w podobnej sytuacji dostałem reprymendę, że nie potrzebnie powtarzam tyle kodu i że jest źle itd... Ja oczywiście nie mam pretensji i nie dyskutuję, ponieważ się uczę i nie wiem. Z punktu widzenia ekranu działanie jest dobre, ale może trzeba podejść do tego inaczej. Jak to zoptymalizować. Proszę o cierpliwość i wybaczenie, jeśli nadal powielam ten sam błąd, ale chcę ten temat zakończyć i do niego nie wracać na forum (chodzi o to zamrażanie). Czyli działanie ma być następujące: Ma być zapamiętywana max. wartość i zniwelowany efekt migotania cyfr. Jeśli jest źle, to w którym kierunku iść, a żeby było prawidłowo. Nie proszę o gotowy kod, a o jakieś podpowiedzi, a żebym pomału doszedł do celu. Dziękuję.

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



Filmik z działania




Proszę mi podpowiedzieć, jak wyświetlać film na forum w oknie, jak inni to robią ?.

W znacznikach dajemy tylko to co po v= czyli 11 znakowy identyfikator filmu. Zielono Różowy J.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 11:38 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27225
Lokalizacja: Szczecin
Pomógł: 1041

Robert_1967 napisał(a):
                if(percent > peak_value)        peak_value = percent;
                {


chyba tu masz pan babola w kodzie, tak mi się wydaje - że świadomie tego nie zrobiłeś - bo można, ale czy zdajesz sobie sprawę z tego jak to działa ?

_________________
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: 5 paź 2018, o 11:49 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

Dzień dobry Panie Mirku.
Dzięki za wyrażenie opinii. Skoro tak Pan pisze, to pewnie jest coś na rzeczy. W takim razie przemyślę i może się kapnę ;) . Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 12:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1148
Lokalizacja: Kraków
Pomógł: 93

Ja wiem :)
Klamra otwierająca blok instrukcji jest w złym miejscu. Tak, jak jest zapisane, jeżeli warunek jest spełniony, wykona się tylko przypisanie wartości, natomiast reszta wykona się w każdym obiegu.
Mirek to fajnie zaznaczył :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 18:09 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

Dzięki Marhef
Kontynuować zabawę będę mógł dopiero w poniedziałek na stykówce. W domu mam zestaw atb i mógłbym dalej kontynuować, ale nie mam czasu :( . No tak to jest. Jak zaczęło działać na lcd, to nie drążyłem kodu, a jednak babol. Nie mogę sprawdzić, ale chyba tak jest prawidłowo ?

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


No i czy sam zamysł tej metody jest poprawny ?. Może można prościej. Myślę też, że w celu odciążenia pętli głównej można to całe wyświetlanie uzależnić od flag i poziomu adc. Np. jeśli przekroczymy adc 20, to zmień flagę i wykonaj to wszystko, a jak nie ma sygnału, to ten kod nie jest brany pod uwagę. Flaga sprawdzana w przerwaniu oczywiście. Mirek niejednokrotnie mi to wbijał do głowy. Czy dobrze myślę ?. Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 paź 2018, o 10:49 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

Jeszcze raz dzięki za podpowiedzi.
Poprawiłem j/w i jest ok. W zasadzie temat wyświetlania linijki i skala logarytmiczna są ogarnięte. Myślę jeszcze nad nad zoptymalizowaniem pod kątem nieblokowania pętli głównej. Czy można jeszcze coś z tym zrobić ?. Może ktoś ma jakieś sugestie ?. Dziękuję.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 paź 2018, o 12:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 369
Lokalizacja: Gliwice
Pomógł: 34

Robert_1967 napisał(a):
Jeszcze raz dzięki za podpowiedzi.
Poprawiłem j/w i jest ok. W zasadzie temat wyświetlania linijki i skala logarytmiczna są ogarnięte. Myślę jeszcze nad nad zoptymalizowaniem pod kątem nieblokowania pętli głównej. Czy można jeszcze coś z tym zrobić ?. Może ktoś ma jakieś sugestie ?. Dziękuję.


Należałoby to zrobić na zasadzie odświeżania.
Cyklicznie np 30 razy na sekundę odpalany jest pomiar i zarazem wyświetlanie (zapalenie/gaszenie) diod.
Właściwie to pomiar powinien być uruchamiany rzadziej niż te 30 razy na sekundę, lub dynamikę zmian wyniku pomiaru załatwiałoby odpowiednie uśrednianie pomiaru.
Podczas odświeżania następowałoby porównanie długości słupka z ostatnim pomiarem i następowałoby zapalenie kolejnej diody jeśli ostatnia dioda jest "poniżej" wartości zmierzonej, zgaszenie diody jeśli powyżej wartości zmierzonej.
Zgaszenie lub zapalenie diody możnaby opóźniać o czas, np. od 1 do 20 ms (skokowa regulacja o np. 2 ms), co by dodatkowo wpływało na dynamikę zmian. W takim wypadku nawet można zrezygnować z uśredniania pomiaru, bo "uśrednianiem" będzie owe opóźnienie w ms.

Całość byłaby nieblokująca, bo zapalenie lub gaszenie diody byłoby nieblokujące, łącznie z rozpoczęciem pomiaru, czy też odebraniem wyniku.
Wszystko oczywiście obsłudze przerwania od jakiegoś timera. Nadałby się nawet do tego timer programowy, bo dla patrzącego byłyby niedowychwycenia różnice między np. 1, a 1.1 ms.

W wideo od Reduktora Szumu, który prezentowałem w tym wątku, nawet było zaznaczone, że opadanie "wskazówek" ma swoje czasu w normach, warto zatem pomyśleć nad takim efektem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 paź 2018, o 06:12 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 352
Pomógł: 0

Dziękuję Zealota
Sorki, że dopiero piszę, ale nie było czasu. Twój pomysł wydaje się ciekawy i postaram się nad tym popracować. Jeszcze raz dzięki .Pozdrawiam.



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: 45 ]  Przejdź na stronę Poprzednia strona  1, 2

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