Witam,
Nadeszła kolejna część poradnika. Teraz będziemy się bawili w terminatora, którego zadaniem będzie bezwzględna walka z tzw. skaczącymi napięciami i wartościami ADC ;) . Zaprzęgniemy do tego celu różne metody. O niektórych już tak na prawdę rozmawialiśmy w poprzednich częściach poradnika, czyli np o prawidłowej filtracji zasilania bo złe podejście do tematu w tym zakresie, to właśnie podstawowa pożywka dla tych sprężynujących wartości, że tak powiem. Ale spokojnie są jeszcze inne metody, które należy stosować wraz z filtracją. Powalczymy więc ze średnimi arytmetycznymi ale także wytoczymy grubsze działa (przynajmniej z nazwy) ;) ... czyli np zastosujemy tzw cyfrowy filtr dolnoprzepustowy (ale nie obawiajcie) się to nie jest trudne - zobaczycie. A także inne metody. Mam nadzieję, że takie praktyczne podejście być może wam się kiedyś przyda w waszych projektach i rozważaniach. Należy mieć jednak na uwadze, że ja tu mówię o podstawach, które trzeba koniecznie zrozumieć raz a dobrze, dopiero wtedy można myśleć o bardziej zaawansowanych projektach, z którymi już dalej sami dacie sobie radę. Jeśli czegoś nie poruszę w tym cyklu poradników to mam nadzieję, że dalej już sami doczytacie i nie będzie to sprawiało już takich kłopotów jak na samym początku, gdzie nie wiadomo było w co w ogóle ręce włożyć ;)
Zapraszam na film w wersji HD. Jednak ten odcinek będzie składał się z dwóch części: 04a i 04b
kolejna część 04b - przedstawiam w niej alternatywny, nieco inny ale mam nadzieję że również dla was rewelacyjny sposób przeliczania sobie napięć z wartości ADC wewnątrz procka ;) .... przy okazji także pod koniec filmu będzie smażenie atmegi8 ;) ...
Poniżej można pobrać kod źródłowy całego ćwiczenia z poradnika:
;)
Kiedy Ty masz czas na naukę javy jak co chwile poradniki wypuszczasz :D ?
OdpowiedzUsuńCześć Mirku, mam propozycje może poruszyłbyś w ramach kursu przebiegi szybko zmienne pochodzące z mikrofonu. Tak żeby dało się podpiąć do AVR mikrofon i zrobić z niego taka przystawkę mikrofonową USB do pc :) Myślę że to by było praktyczne i fajne wykorzystanie zdobytej wiedzy.
OdpowiedzUsuńTakich tematów z ADC - fajnych, są tak na prawdę setki jak nie tysiące ;) ... dostaję sporo maili w tej sprawie i każdy oczekuje czegoś innego. Nie dam rady :( zrobić poradnika o WSZYSTKIM :(
Usuńa jeśli chodzi o zbieranie danych z mikrofonu przez procek to proszę bardzo sporo jest opisane w mojej drugiej, zielonej książce:
http://atnel.pl/jezyk-c-pasja-programowania.html
przy okazji transmisji dźwięku drogą radiową za pomocą modułów RFM70 - tam można złapać w tym zakresie sporo natchnienia - mam nadzieję.
Witam mirku bardzo dobry poradnik, nie przejmuj się dziećmi neostrady, które wszystko muszą mieć podane na tacy i najlepiej żebyś im wysłał procesor już zaprogramowany. Podziwiam twoją cierpliwość i chęć tłumaczenia czasem naprawdę prostych rzeczy w jeszcze prostrzy sposób (jak choćby proporcji) te dzieci i tak będą tylko ogladać i narzekać bo cóż im pozostanie skoro nie są zwyczajne jakiegokoliwek wysiłku i nie poznają tego uczucia związanego z własnoręcznie napisanym programem, tylko będą tupać nogami że im znowu w życiu nie wyszło, no cóż polska kraj piękny, ale pełno zj**ów genetycznych :) Pozdrawiam serdecznie
OdpowiedzUsuńWiem wiem, że tłumaczę na prawdę wydawać by się mogło proste rzeczy jak mówisz jak np te proporcje, ale to dlatego że sam wiem i tak miewam czasem, że jak coś nowego poznaję a się zatnę nawet na najprostszej rzeczy to potem nie mogę dalej już zaskoczyć .... a tymczasem takie łopatologiczne wyjaśnienie sporo mi daje - tak też staram się tworzyć poradniki - i wielu ludzi to docenia...
Usuńchoć właśnie - masz rację, że nie powinienem się przejmować jak zauważyłeś ;) hyhyhy "dziećmi neostrady" czyli malkontentami bo niepotrzebnie tylko zdrowie tracę ;)
dzięki za dobre słowo.
Jak zawsze ciekawie, choć ostatnio coraz bardziej. Nie mogę się już doczekać kolejnego odcinka.
OdpowiedzUsuńJest szansa na pojawienie się podobnego cyklu ale dotyczącego "wszystkich" trybów timerów ? Jest dużo informacji w bluebooku ale zawsze można nieco dopowiedzieć, przynajmniej tak mi się wydaje.
Pozdrawiam
Pomysłów na poradniki kłębi mi się w głowie jak .... drzew w gęstym lesie ;) ... zobaczymy więc - zobaczymy. Wszystko po kolei
Usuńna razie muszę po kolei realizować mój plan ... a mam nadzieję, że jeszcze uda mi się zainteresować kolejnymi poradnikami po ADC ;)
Na pewno będziesz miał min 1 zainteresowaną osobę poradnikiem o ADC - będę nią ja ;) a tym bardziej się cieszę, że napisałeś poradnikami o ADC a nie poradnikiem, bo mam nadzieję, że następna część nie będzie ostatnią i że pokażesz inne tryby pracy niż tylko pojedynczy pomiar ale i Free Running a może i wspomnisz coś o przerwaniach i trybie uśpienia ale nieco więcej niż do tej pory ;)
UsuńDobrze postaram się pokazać tryb "free runing mode" i może o tym usypianiu - zobaczymy ;)
UsuńA ja krzyczałem: "Mirek masz zwarcie" , ale nie słuchałeś. Za to rodzina zleciała sie do pokoju zobaczyć co za horror sobie oglądam. I w ten oto sposób zyskałeś nowych fanów. Prawie dali się nabrać, że to program "na żywo". Twoje poradniki coraz bardziej prowokują do interakcji, aż chciało by sie w nich uczestniczyć aktywnie. Powinieneś na wstępie ostrzegać, że to uzależnia i potem nie można przestać oglądać. Aż strach pomyśleć co będzie jak przestaniesz robić poradniki wideo.
OdpowiedzUsuńPozdrawiam i czekam na więcej.
Kurczaki to może za słabo krzyczałeś ;) .... a na poważnie to cieszę się, że udaje mi się zainteresować was tymi moimi poradnikami ;) no i pozdrawiam serdecznie w takim razie nowych fanów - czyli twoją rodzinkę ;)
UsuńPostaram się nie przestać robić poradników bo pomimo sporej liczby malkontentów to jednak więcej zauważam osób, takich jak ty, które piszą, że przydają im się poradniki w takiej formie więc jeszcze raz dzięki za ciepłe słowa.
1. Mirek znasz C i C++.
OdpowiedzUsuń2. Znasz podstawy elektroniki analogowej.
3. To, że się nie wypowiadasz dobrze po Angielsku to nie jest twoja główna winna, czasy gdy zmuszano ciebie do głupiego nauczania się Rosyjskiego były ciemnotą.
4. Potrafisz wykorzystać praktycznie swoje umiejętności w programowaniu, elektroniki, itd.
5. Co więcej potrafisz wytłumaczyć dlaczego coś jest takie a takie, a nie same suche fakty, co duża rzesza wykładowców akademickich tak robi, na tak zwane na odpierdol, sam jak mailem programowanie W C++, to wykładowcy potrafili nie wiele, a ich śmieszne zadania na 5 szybko rozwiązałem.
6. Wielu malkontentów, to ludzie, którzy nie maja wiedzy, tylko piszą co im ślina poniesie.
7. Prawda jest taka, że elektronika cyfrowa w naszym kraju jeszcze kuleje, bo dla wielu jest za trudna
No nie pozostaje mi nic jak podziękować za te słowa a co do pkt.3 to DOKŁADNIE jak mówisz - eeeeh gdybym ja w tamtym czasie miał możliwość wyboru albo żeby chociaż na siłę uczyli mnie angielskiego zamiast rosyjskiego - to dzisiaj ? .... pewnie gadałbym z akcentem James'a Bond'a ;)
UsuńNaprawdę kawał solidnej roboty! Z niecierpliwością czekam na kolejne poradniki, naprawdę ułatwiają one poznawanie mikrokontrolerów, ale też zachęcają do samodzielnego poszerzania wiedzy :)
OdpowiedzUsuńW załączonych plikach, jak kiedyś, błędnie autor. Nie dawno słyszałem, że mądrzy ludzie często popełniają błędy w pisowni, ponieważ nie czytają całych słów i zdań i nie istotna jest kolejność liter. :)
OdpowiedzUsuńTażke uawżam, że nie jset wanża koljeność lietr w słwoach byelby tlyko pirewsza i ostantia były na sowim mijescu.
UsuńNo Panie Mirek, gratuluję. Wyjaśnione tak, jak się należy. Bardzo chętnie spijam wszystkie porady :)
OdpowiedzUsuńPanie Mirku mam pytanie. Czy nie łatwiej w programie zapisywać tej maksymalnej wartości napięcia u pana 12V zamiast połowy? Czy ma to jakieś znaczenie jaką wartość zapiszemy w programie, bo proporcja i tak zostaje dalej taka sama ??
OdpowiedzUsuńAleż można ;) nie wiem jednak w czym to może być łatwiej - na to samo wychodzi - a ja i tak jak wspominałem na filmie zwykle robię 3 pomiary i uśredniam aby mieć lepszą liniowość ;)
UsuńWitam, czy mógłby mi Pan napisać czy robię jakiś błąd w następującym toku myślenia odnośnie tych wartości dotyczących proporcji i zmieniania ich poprzez UART - mianowicie, gdybym przygotował układ i okazało się, że te wartości by się jakoś rozkalibrowały (np byłyby wyznaczone dla płytki stykowej, a chciałbym je wyregulować w układzie na PCB, ale bez programowania całości) to gdybym zrobił funkcję, która poprzez UART odbiera 2 bity, gdzie pierwszy bit określałby o którą zmienną chodzi, a drugi jej nową wartość to w przypadku resetu mikrokontrolera te zmiany by się nie zapisały, ponieważ inicjowałyby się tymi podanymi w programie, ale gdyby te zmienne przechowywane byłyby w pamięci EEPROM taka zmiana zostałaby na zawsze tak ?
OdpowiedzUsuńTak warto to zapisać sobie w EEPROMIE, żeby po restarcie mikrokontrolera działało cały czas
UsuńMirku mam pewien problem z otworzeniem projektu. Odpalam eclipse juno classic. Zaznaczam to co chcę odpalić (Twój projekt) z tego folderu : E:\ Eclipse \ Gotowe Projekty \ ADC \ ADC.
OdpowiedzUsuńGdy eclipse się otwiera pokazuje mi się ekran startowy Eclipse (ten który się odpalał przy pierwszym uruchomieniu Eclipse, jak na czystej instalce). Dla zobrazowania sytuacji mam do wyboru opcje: Tutorials, Overview, Samples, What's new, i w prawym górnym rogu Workbench.
Gdy przechodzę do Workbench'a mam perspektywę bez plugina. Muszę wtedy wchodzić i zmieniać ją na C/C++.
A tyle razy wszędzie powtarzam i w poradnikach też - INDIGO, Eclipse Indigo i od razu będzie lepiej. Sam używam Indigo.
UsuńNiestety nawet Indigo nie pomógł. Jedyne co się zmieniło to to że nie pokazał się ekran startowy Eclipse. Przeszło od razu do projektu który nie został wyświetlony. Project explorer jest pusty i nic więcej się nie dzieje. Eclipse jakby nie widzi projektu lub ma problemy z jego otworzeniem, choć wtedy by mnie poinformował.
OdpowiedzUsuńSpróbowałem otworzyć sam folder MYUART jednak wtedy działo się to co na Juno. Dodam że to już nie pierwszy raz gdy mam taki problem, ale gdy takie błędy miałem to wystarczało zmienić folder który ma otworzyć Eclipse. Niestety tutaj nie mogę już nic zmienić
A powiedz mi w ogóle jak ty otwierasz ten projekt - bo coś czuję że zupełnie źle się zabierasz :(
Usuńja to robię tak:
1. pobieram projekt
2. rozpakowuję gdzieś na dysku
3. odpalam Eclipse z normalnym założonym wcześniej przeze mnie dobrze działającym workspace (a ty tu robisz jakiegoś ZONKA)
4. wybieram opcję "IMPORT EXISTING PROJECT" i wskazuję folder do którego rozpakowałem pobrany projekt
5. zaznaczam ptaka "copy project to my workspace"
6. klikam ok i się cieszę
Szok działa :) Dzięki Mirku
OdpowiedzUsuńJa robiłem tak że workspace'm był folder ADC. Robiłem kompletnie inaczej :) Jeszcze raz dzięki :)
No to będziesz zawsze w szoku, tak jak ja do dzisiaj - że w Eclipse zawsze pięknie działa Import ;) w ten sposób można nawet naprawiać uszkodzone workspace'sy ;)
Usuńcieszę się, że ruszyło - powodzenia teraz z ADC.
Bez poprawek kodu od razu zabrałem się za wgrywanie kodu, zaprogramowałem uC poprzez usbasp a TXD oraz RXD podłączyłęm do FT232. Odpaliłem puTTY aby sprawdzić czy moja przejściówka FT232 wgl jest sprawna (prędkość 9200). Przy odłączaniu i podłączaniu programatora UsbAsp wyskakują jakieś krzaczki. Nie chodzi mi teraz o pomoc w rozwiązaniu krzaczków lecz pytanie brzmi czy FT232 jest działające?
OdpowiedzUsuń*FT232 jest działające biorąc pod uwagę to że coś się pokazuje.
OdpowiedzUsuńNie rozumiem za bardzo o co chodzi? :( proponuję pokazać dokładny schemat jak kolega to podłącza i skąd zasila .. ale to już na naszym forum
Usuńwww.forum.atnel.pl
bo tam łatwiej takie rzeczy przedstawić
Mirek kawał dobrej roboty, wszystko jest wytłumaczone jak chłop krowie na miedzy, już chyba prościej się nie da, szacuneczek Panie kolego... nie dawaj się malkontentom zawsze znajdzie się parę zakalców co potrafią humor zepsuć, "jeszcze się taki nie narodził co by wszystkim dogodził"
OdpowiedzUsuńCześć,
OdpowiedzUsuńJest jakaś konkretna przyczyna, że używasz średniej kroczącej ? W/g mnie do "uśredniania" wyników lepsza jest mediana, gdy pojawi się jakieś zakłócenie, np szpilka o 2x wartości mierzonej da to od razu przełożenie na wynik, przy medianie wartość ta zostanie odrzucona.
Pozdrawiam
Eagle
A powiedz mi proszę - skąd to pytanie ? gdzie jest powiedziane że JA używam zawsze średniej kroczącej ? ;) Może nie do końca zrozumiałeś cel poradnika hmmm ?
Usuńupps.. w sumie nie przeglądnąłem całego artykułu na temat ADC, trafiłem tu bo szukałem info na temat ustawienia preskalera dla ADC. Posłuchałem Twojego poradnika i trafiłem na fragment o średniej kroczącej( tam gdzie pokazujesz wskazania na metexie i konsoli). Zresztą przeszukując pozostałą część netu, natrafiam niemal wyłącznie na uśrednianie wyniku. Fakt jest to proste w realizacji w porównaniu do mediany. Pomiary, które robię nie są jakieś nadzwyczaj wymagające 2-5 pomiarów/sek. Zastanawiam się co się stanie gdy ADC będzie taktowany najwolniejszym zegarem. Sygnał wejściowy zmienia się liniowo max 1V/1h, aspekty oszczędnościowe też odpadają bo jest zasilane z sieci. Więc pytania mam następujące:
OdpowiedzUsuń1) Jest jakaś zaleta w filtracji poprzez średnią kroczącą vs mediany.
2) Jaki negatywny efekt będzie ustawienie najniższej prędkości ADC.
No widzisz jak sam wspomniałeś sam algorytm liczenia średniej za pomocą mediany jest ciut bardziej wymagający czasowo niż takiej średniej kroczącej ... To zwykle determinuje zastosowania w projektach. Z tego co ty opisujesz i SZCZEGÓLNIE przy padaniu tak wolno zmiennych przebiegów nie dość że można to nawet warto pokusić się o medianę ... chociaż z drugiej strony pomyśl - robisz załóżmy średnią kroczącą w takiej sytuacji jak twoja. Załóżmy że zdarzy się w jednym z pomiarów SZPILA ... no bo akurat tak coś trafiło ... rzeczywiście przy wolnozmiennym przebiegu dość znacznie odbije się ona na ciągłości pomiarów ale ...
Usuńno ale zawsze można zamiast jednego pomiaru np 1 na sekundę dokonać ich np 20 i uśrednić zwykłą średnią arytmetyczną co jest bardzo szybkie a pozwoli znacznie zminimalizować szpilę z jednego czy dwóch takich chwilowych pomiarów a dopiero średnia z tego pójdzie do średniej kroczącej ...
Tyle że jeśli nie zależy nam zbytnio na czasie to co za problem właśnie w takim przypadku użyć mediany ... ?
Jak widzisz - problem z uśrednianiem nie jest wydumany , bardzo często jest potrzebny choć nie zawsze przecież ;) np przy próbkowaniu sygnału audio z tak wolnym przetwornikiem jaki jest w prockach AVR to wręcz niemożliwe ;)
reasumując i odpowiadając na twoje pytania
1. mediana ma te zalety o których wspomniałeś na początku swojej wypowiedzi i jeśli mamy czas, siłę i chęci to pewnie warto tą metodę wykorzystać. Nie wskażę tutaj wyraźnych zalet bo jak zwykle - wszystko zależy od konkretnego projektu.
2. no przy tak wolno zmiennych przebiegach ustawienie prędkości ADC na minimum wcale nie zaszkodzi
thx,
UsuńPozdrawiam
Eagle
Mam jeszcze pytanie odnośnie metody skalowania napięcia.
OdpowiedzUsuńNa przykładach jest zrobione to metodą proporcji dla jednego odczytu
w filmie dla 6V accu1_vol.ref_adc ustawione jest na 494 i tutaj wszystko jasne. Było też wspomniane o tym, żeby pomierzyć dla jeszcze innych wartości napięcia i wtedy dokładność się zwiększy (chociaż dokładność 0,01V i tak jest świetna). Ale co w przypadkach gdy mamy np odczyty z amperomierza np ACS715 (wersja 30A), który ma dokładność 133mV/A ale w temp. 25oC startuje na wartości 503mV. Czyli dla 0A = 503mV.
Mój pomysł to odjąć wartość 503mV od odczytu przed proporcją tak żeby matematycznie się zgadzało i ustawić wg tego pomysłu z filmu, ale może spotkał się Pan już z takim przypadkiem i zna jakieś dokładniejsze rozwiązanie.
Dokładnie jak mówisz - warto sobie nawet podejrzeć w arduino takie fajne ala polecenie funkcję o nazwie map() ... zresztą pisałem sobie kiedyś implementację tego w C .... bardzo fajnie się w takim przypadku przydaje ponieważ podajemy zakres w jakim ma ograniczać np od wartości x do y z zakresy 0 - 1024 i mamy co trzeba ;) ... zresztą zobacz poniżej (chociaż nie wiem czy tu będzie dobrze formatowanie widać:
Usuńint map( int x, int in_min, int in_max, int out_min, int out_max ) {
int a = (x-in_min)*(out_max-out_min);
int b = (in_max-in_min);
return ( a + (b/2)) / b + out_min;
}
albo druga mega przydatna:
Usuńint constrain( int val, int min, int max ) {
if(val < min) return min;
else if(val > max) return max;
return val;
}
Heh nie sądziłem że nawet tutaj przyda się proporcja. :D Chyba się przeprowadzę do Szczecina, bo chętnie na te kursy bym przychodził, a nawet czasem przy piwie pożartował, bo humor to mi się ciągle poprawia a czas leci nieunikniony ;)
OdpowiedzUsuńZapraszam bo dobre piwko się znajdzie więc będzie można pogadać ;)
UsuńPanie Mirku taka mała podpowiedź. W eclipsie aby przenieść linijkę kodu (nawet blok kodu) wystarczy ustawić kursor w danej linii (zaznaczyć blok) i wcisnąć alt + up/down :)
OdpowiedzUsuńJak ja lubię TAKIE SMACZKI ;) wielkie dzięki za tą podpowiedź - oby mi się utrwaliła w pamięci ... działa świetnie...
UsuńAlgorytm "zlecenia" pomiaru ADC
OdpowiedzUsuń1. Zleć wykonanie pomiaru
2. Czekaj na sygnał zakończenia pomiaru
3. Odczytaj wynik pomiaru (i zapisz do ringbuffera)
Inna możliwość:
1. Czekaj na sygnał zakończenia pomiaru (not busy)
2. Odczytaj pomiar (i zapisz do ringbuffera) (oczywiście zapisz wielkość odchyłki)
[...]
3. Zleć wykonanie pomiaru
Bufor cykliczny -> Ringbuffer
Druga opcja algorytmu pomiaru nie pozostawia procesora w waitloop. Wówczas pomiędzy punktem 2 i 3 można zliczyć średnią z odchyłek. Optymalnym rozwiązaniem długości ringbuffer'a jest żeby była ona potęgą liczby 2. W przypadku długości 16 obliczenie sprowadzi się do 16 krotnego dodawania, natomiast dzieleniem będzie ignorowanie w wyniku najmłodszych 4 bitów, czyli przesunięcie w prawo o 4 bity otrzymanego wyniku. Pojedyncza odchyłka jest w wielkości bajtu, a ich suma powinna być "zbierana" do wielkości 16 bitowej. Obliczenie wyniku średniej wartości w ringbufferz'e będzie (dzielenie przez 16) prostą sekwencją rozkazów SWAP AND i OR, albo 4 krotnym przesunięciem bitów (w prawo) w słowie (Word) 16 bitowym.
Jeszcze prościej wyglądałoby zwiększenie reprezentatywności otrzymywanych próbek przy ringbufforz'e o wielkości 256. Wówczas średnia byłaby sumą 256ciu dodawań bajtów do wielkości 16 bitowej, a sam wynik znajdowałby się w starszym bajcie słowa (HI byte in Word). 256 krotne dodawanie bajtu do wartości 16 bitowej będzie de facto 512 krotnym dodawaniem dla kontroli przeniesienia (LO/HI byte). Pomimo, że wydawać się to może zawrotną liczbą, cały ciąg dodawań będzie i tak wielokrotnie krótszy niż oczekiwanie na wynik pomiaru - po prostu zajmiemy procesor do wydajnej pracy zamiast bezczynnego oczekiwania na zmianę bitu zajętości.
Odchyłkę możemy obliczać poprzez odjęcie wyniku pomiaru od wartości najmniejszego pomiaru po uprzednim sprawdzeniu, czy nasz pomiar nie jest aby tą wartością minimalną. Jeżeli okaże się że jest on wartością minimalną powinniśmy skorygować o to całą zawartość ringbuffera (o różnicę pomiędzy "starą" wartością minimalną i "nową").
Można również przeprowadzać obliczenia w kodzie U2 tym razem na wartości 24 bitowej (wówczas będzie to 768 dodawań) dla bezpieczeństwa, wówczas można określić jakie są tętnienia. (seria dodawań wówczas będzie nie od wartości minimalnej, tylko od wartości ostatniej średniej).