Strony

czwartek, 27 czerwca 2013

Przetwornik ADC w AVR - część 03

Witam,

Tym razem króciutko, zapraszam na kolejną czyli trzecią już część poradnika do ADC. Zgodnie z zapowiedzią tym razem zajmiemy się już kodami źródłowymi, nie mniej jednak jak to zwykle bywa zanim powiem o ADC poruszymy temat np najprostszej komunikacji (i to tylko wysyłanie) przez RS232. Związane jest to z tym, że chciałem uprościć sobie konstrukcję układu testowego na płytce stykowej i mam nadzieję, że przy tej okazji przekonam ciebie także do tego aby coraz częściej korzystać z terminala przy wszelkich pracach z mikrokontrolerami. Natomiast poprzez to, że zastosuję prostą bibliotekę do terminala jako LCD, którą przedstawiłem na moim blogu, chciałbym zwrócić uwagę - że może być wam jednak ciężko użyć do takiego ćwiczenia innych terminali niż PUTTY, którego ja z lubością używam. Wiem, chociaż nie rozumiem, dlaczego wielu z was zamiast z putty korzysta z innych prostszych terminali, to okaże się właśnie że ta większość innych nie potrafi obsługiwać standardu VT100 :( .... a pokażę wam przy okazji najbliższych poradników że korzystanie z tych właściwości VT100 na prawdę dużo daje i postaram się was tym "zarazić" ;) A przecież zobaczycie że mając taką gotową biblioteczkę to korzystanie z tego staje się banalnie proste ;)



zapraszam na film (rozdzielczość HD 1280x720) w moim kanale: www.youtube.com/mirekk36



Uwaga! przed zażyciem skonsultuj się z lekarzem lub farmaceutą. 
Film trwa dwie godziny!
Może wywoływać senność, chrapanie, drganie powiek, wzmożoną ochotę na sok jabłkowy itp

;)

44 komentarze:

  1. Jak zwykle świetna robota!
    Można się czegoś nauczyć i pośmiać przy okazji :D
    Narobiłeś mi smaku na sok :)
    Czekamy na dalsze części!!

    OdpowiedzUsuń
    Odpowiedzi
    1. dzięki za dobre słowo

      eeeeh wkręcił mi się ten sok jabłkowy ;) i później musiałem go jakoś tuszować ;)

      Usuń
  2. 22:05 - Mireosław Karaś :>

    OdpowiedzUsuń
  3. No tak to się ciągnie za mną jak .... wiadomo co ;) często taką literówkę robię

    OdpowiedzUsuń
  4. Szczerze mówiąc to nawet nie wiedziałem kiedy mi te 2 godziny minęły :) Mam jeszcze pytanie odnośnie filtracji zasilania. Czy nadmiar kondensatorów filtrujących może również przeszkadzać w pomiarach ADC jak ich brak?

    OdpowiedzUsuń
    Odpowiedzi
    1. Ale masz na myśli te w filtracji zasilania VCC i GND a nie ew te na linii pomiarowej ADC ?

      bo jeśli chodzi o filtrację zasilania to co masz na myśli mówiąc nadmiar ;) nadmiar kondków 100nF nigdy nie zaszkodzi - wręcz odwrotnie. Tylko z elektrolitem nie ma co przesadzać bo zaszkodzić nie zaszkodzi ale też nie pomoże - po porostu szkoda wkładać za duże niepotrzebnie elektrolity.

      Usuń
    2. Tak miałem na myśli te w filtracji zasilania. To już wiem, że zwykłe kondensatory 100nF można spokojnie wrzucać. Rozumiem, że na liniach pomiarowych też trzeba wrzucić jakieś kondensatory. Tylko jakie i ile ? :)

      Usuń
    3. Nie nie na liniach pomiarowych ADC to spokojnie i uważnie - przecież mówię o tym w poradniku. Jeśli badamy wolno zmienne napięcia - czyli np okresowo napięcie akumulatora czy baterii to tak można dać taki mały filtr jak mówię w poradniku z tych dwóch rezystorów i kondka 1nF / 10nF

      ale można nawet i zamiast tego dać po prostu kondensator 100nF .....

      ale tu żadne tam jakieś większe ilości ;)

      a gdybyś chciał badać jakieś szybko zmieniające się napięcie to chyba rozumiesz że taka pojemność mogłaby wręcz zakłócać pomiar. Wtedy wręcz nie można dawać - żadnego dodatkowego kondensnatora na linii ADC

      Usuń
    4. Na liniach sygnałowych można zastosować przewody ekranowane w celu zmniejszenia zakłóceń.

      Usuń
    5. Te poradniki są genialne, zwłaszcza dla takich początkujących jak ja. Dużo się z nich uczę - dziękuję.
      Janusz

      Usuń
  5. Ja miałbym jeszcze pytanie odnośnie Vref. Jeżeli mam np. procesor ATmega328P gdzie jego Vref=1,1V, to rozumiem że bez względu na to czy go zasilę z 5V bądź z 3,3V to Vref powinno być zawsze takie samo?

    OdpowiedzUsuń
    Odpowiedzi
    1. No a jak mogłoby być inaczej ? ;) po to są napięcia odniesienia wbudowane .....

      Usuń
  6. Szanowny Panie Mirku,
    Porusza Pan w przygotowanym materiale kwestie RS232. Nie rozumiem dlaczego pan mówi że do przesyłania danych do komputera z mikrokontrolera wystarczy przejściówka RS232-USB. RS232 jest standardem przesyłania. Napięcia panujące na liniach sygnałowych mogą zmieniać się w granicach od -15V do 15V. Do tego celu wykorzystuje się układ scalony max232 firmy maxim który jest w stanie wytworzyć takie napięcie poprzez pompę ładunkową.W mikrokontrolerze mamy wbudowany interface USART/UART. Jak to się teraz do siebie ma? Nie umiem tego zrozumieć. Czy te przejściówki RS232- USB mają w sobie taki układ jak max232?

    OdpowiedzUsuń
    Odpowiedzi
    1. Kolega myśli o starym - archaicznym już poniekąd porcie COM w komputerach, pracującym właśnie w standardzie RS232 i posługującym się że tak powiem napięciami z zakresu jakie podałeś. Masz także rację, że do tego stareńkiego portu korzysta się ze scalaka MAX232. To JEDNO.

      Ale chyba nie wiesz o DRUGIM o wiele wygodniejszym na dzień dzisiejszy rozwiązaniu. Ba! przecież w wielu kompach już nawet nie ma starych portów COM - więc jak myślisz ? to wtedy co ? koniec? amba zjada komunikację RS232? ;)

      Nie ... wtedy się właśnie stosuje przejściówki USB/RS232 i to najlepiej takie pracujące przynajmniej w standardzie TTL .... rozumiesz ? wtedy żaden MAX232 nie jest potrzebny - po co ? Ot podłączasz przejściówkę do USB, w kompie tworzy się virtualny port COM, a po jej drugiej stronie masz piny Rx i Tx gotowe wprost do podłączenia do pinów procka bo działają w TTL ....

      jak nie możesz sobie tego wyobrazić - to postaraj się rzucić okiem na notęPDF super przyjemnego scalaczka FT232R ... ok ? Wtedy WSZYSTKO ci się rozjaśni

      ale jak nie to śmiało pytaj dalej

      Usuń
    2. Rozjaśniła mi sprawę nota PDF. Rozumiem że do FT232R podajemy sygnał prosto z UARTa który pracuje na poziomach napięcia TTL. Poprzez FT232R dane dochodzą do USB. Jednak tu nie mam nigdzie standardu RS232 ponieważ ten standard określa odpowiednie poziomy napięć i konstrukcji urządzeń. Na rysunku 7.1 noty jest schemat pokazujący "RS232 level converter" który napięcia z RS232 dostosowuje do poziomu TTL. Następnie są one podawane do FT232R. Dlatego uważam że używanie nazwy RS232 jest błędne. Zgodzi się Pan zemną?

      Usuń
    3. Absolutnie się nie zgodzę ;) i proponuję nie wymyślać nowych teorii - skoro już dawno takie coś istnieje. Wystarczy się na prawdę wokoło rozejrzeć ok ? ;)

      Ty mylisz panie kolego i to dosyć mocno standard sprzętowej warstwy komunikacji RS232 (bo tu jest mowa o zakresach napięć o jakich mówisz) z jej implementacją logiczną/programową ;) ... poczytaj sobie tutaj o standardzie komunikacji RS232 .... i z tego powodu nie można się zgodzić z twoją teorią - że nie można używać nazwy RS232 przy takiej przejściówce, bo kompletnie mieszasz pojęcia.

      Za pomocą takiej przejściówki nadal komunikujemy się z komputerem za pomocą starego jak świat standardu komunikacji RS232 ;) .... a nie USB przecież.

      tłumaczyłem ci wyżej - i tu masz rację, że od procka USART idzie do pinów TTL układu FT232 a dalej ? a dalej panie kochany to już firma ftdichip ;) zadbała o to aby te dane dotarły do kompa na virtualny port szeregowy. Gdzie od strony kompa niczym on się nie różni od strony użytkowania - w porównaniu do starego leciwego portu fizycznego COM

      teraz jaśniej ?

      Usuń
    4. Faktycznie, jeżeli spojrzeć od strony komputera dane które przychodzą poprzez USB niczym się nie różnią od tych przychodzących poprzez port COM, są tak samo interpretowane.

      Jednak w warstwie sprzętowej ten standard nie jest wykorzystywany. Fizyczne przejście na RS232 zapewnia nam "RS232 level converter".

      Strasznie zamotałem bo w dużej części literatury (starszej) jest mowa o tym MAX232 itp. Z tego też powodu nie było dla mnie to zrozumiałe.

      Dziękuję za udzielenie wyczerpujących wypowiedzi oraz za wyrozumiałość:)

      Usuń
  7. Po analizie materiału filmowego:
    Z niepokojem czekam na przejściówkę USB-RS232;
    oraz stwierdzam iż sok jabłkowy był „konieczny-niezbędny”:
    człowiek sam jeden zamknięty przez 2h produkuje się i tłumaczy „komputerowi” jak działają jego mniejsi bracia.

    Dziękuję i Pozdrawiam.

    OdpowiedzUsuń
    Odpowiedzi
    1. A dlaczego z niepokojem kolega czeka na przejściówkę ? czyżby obawa że będzie z nią coś nie tak ? chyba że coś źle zrozumiałem - ale postaram się, żeby była na prawdę dobrej jakości ;)

      Za to przez kolegę to dopiero teraz rozmasowałem sobie przeponę ze śmiechu ;) z tego:

      "tłumaczy komputerowi jak działają jego mniejsi bracia"

      hahahaha SUPER ;) ...

      Usuń
    2. Po pierwsze: to o jakość się nie boję – po prostu przydałaby się: będę cierpliwy i poczekam jeszcze (troszeczkę) - taka dodatkowa mała motywacja do działania.

      Co do drugiego: jak przyjrzeć się temu z boku to to tak wygląda.
      Jednoosobowe studio filmów pełnometrażowych edukacyjno-naukowych.
      Do Hollywood jeszcze trochę brakuje (efektów specjalnych), ale do Bollywood to już całkiem blisko.

      Pozdrawiam.

      Usuń
  8. Panie Mirku. Dziękuję za to że pan - taki Mistrz i fajny gość będzie mnie teraz uczył działania mikrokontrolerów.
    Umiem język Java ale C naucze się z Pana książki.
    W domysle mam cheć zaimplementowac algorytm sieci neuronowych, który już zaprogramowałem w javie. Dodam też że z trudem znalazłem pana stronę po niebywałej walce z internetem :P
    Prawdopodobnie kupię zestaw dla początkujących - czy może pan jakis polecić do 400 zł i link do niego?
    Pozdrawiam M. & godBlessU :)

    OdpowiedzUsuń
    Odpowiedzi
    1. No niezmiernie mi miło, że mogę pomóc swoimi poradnikami czy książkami ;) Naturalnie w razie pytań jestem do dyspozycji. Jeśli zaś chodzi o zestaw do nauki to myślę, że spokojnie mogę polecić coś z naszego sklepu internetowego, proszę zapoznać się z ofertą na:

      www.sklep.atnel.pl

      a gdyby były jakieś dodatkowe pytania to proszę śmiało pisać do mnie na maila - zawsze chętnie pomogę.

      Usuń
  9. Witam! W tym poradniku porusza Pan kwestię zabezpieczenia wejść mikrokontrolera. Bardzo się z tego cieszę, ponieważ do tej pory nigdzie nie znalazłem konkretnej odpowiedzi na to pytanie. Czy mógłbym uzyskać jeszcze odpowiedź dlaczego akurat takie? Tzn. w jakim celu stosuję się tak połączone diody schottky'ego, rezystory razem z kondensatorem oraz wtórnik napięciowy. Pozdrawiam.

    OdpowiedzUsuń
    Odpowiedzi
    1. Witam, no a jak kolega myśli przed czym mogą być tu jakiekolwiek zabezpieczenia ? No chyba przed niczym innym jak przed "przepięciami", które mogą się pojawiać w zależności oczywiście od tego w jakimś środowisku pracuje taki przetwornik oczywiście.

      Ktoś ostatnio na forum naszym zadał pytanie typu:

      "czy jeśli będę mierzył napięcia w zakresie 0-2V, to także muszę używać tych zabezpieczeń? skoro nigdy nie pojawią się wyższe?"

      no i tu jak w soczewce skupia się niezrozumienie tematu czym są przepięcia. To nie chodzi o to że np gdy będziemy mierzyli napięcia w wyższym zakresie np 0-32V to muszą być - bo przecież - no widać w poradniku, że i tak jest dzielnik napięcia - a zatem na procka i tak trafi 1,1V, albo 2,56V albo 5V max w zależności jakie źródło odniesienia wybierzemy i oczywiście czy dobrze dzielnik podłączymy. To nie są zabezpieczenia przed tym, że ktoś się pomyli z dzielnikiem ...

      Taki mocno uproszczony przykład powiem. Jeśli będziesz badał napięcia np w instalacji samochodowej - np 0-12V, to MUSISZ się liczyć z możliwością występowania szpilek ogromnych przepięć z uwagi chociażby na charakter pracy alternatora i w ogóle dużego poboru prądu podczas przełączania różnych urządzeń. Środowiska samochodowe są przykładem gdzie występują bardo trudne warunki pracy procków pod tym względem. Dlatego też przecież są specjalne układy scalone wypuszczane w tzw seriach "automotive" czyli specjalnie podrasowane na zakłócenia ale też niedostępne cenowo dla amatorów.

      Za to jeśli będziesz się bawił w domciu z bateryjką czy jakimś zasilaczem i do projektowanego urządzenia nie będzie np zależało czyjeś życie ;) (tu troszkę żartuję) ... to po choinkę ci zabezpieczenia. Przecież widziałeś że w poradniku robiłem wszystko bez nich.

      Dlatego wspomniałem o tych zabezpieczeniach ale też dodałem żeby nie popadać w panikę i zaraz nie dowalać ich w każdym wypadku albo wszystkich naraz.

      Np wtórnik napięciowy jest bardzo dobrym zabezpieczeniem ale i jego wejście także często zabezpiecza się dodatkowo dwoma diodami shottky.

      Reasumując - kiedy i jakie wybrać zależy od (przede wszystkim) zdrowego rozsądku. Mam nadzieję, że teraz troszkę jaśniej?

      Usuń
  10. Podczas transmisji w terminalu putty wyświetlają mi się inne litery niż przesyłam z atmegi8. Np jak wysyłam 'a' to wyświetla się '0' co może być tego przyczyną ...?

    OdpowiedzUsuń
    Odpowiedzi
    1. Przyczyną może być hmm na pewno jest to że nie dopasowałeś prędkości uart baudrate. Np nie przestawiłeś prawidłowo fusów w procku, albo różne prędkości ustawiłeś w terminalu i procku ... jak widzisz możliwości jest sporo

      Usuń
    2. Czy ten wzór jest poprawny dla procesora taktowanego prędkością 1MHz? Zrobiłem jak w ćwiczeniu tylko nie zmieniałem fusbitów na 8MHz - i wyświetlało inne znaki. Próbowałem różnych ustawień w Putty i za każdym razem to samo. W końcu postanowiłem przeprogramować fusbity na 8MHz i pięknie działa.
      Co trzeba poprawić we wzorze, żeby działało z każdą prędkością procesora?
      Może to ma znaczenie, a może nie, ale mam programator STk-500v2 oraz sprawdzałem na 2 kablach podłączonych do DB9 w komputerze.
      1 - prosty zrobiony na MAX232
      2 - oryginalny kabel do programowania central alarmowych firmy SATEL z TTL. Na obu tych kablach przy 8MHz działa prawidłowo. Przy 1MHz niestety nie.

      Usuń
    3. Jaki wzór ? co masz na myśli ?

      Usuń
    4. chodzi mi o ten z Poradnika: "RS232 UBRR - jak prawidłowo obliczać - TRICK"
      #define UART_BAUD 9600
      #define __UBRR ((F_CPU+UART_BAUD*8UL) / (16UL*UART_BAUD)-1)

      Sprawdzałem dla prędkości 9600, 19200 i przy 1MHz nie odczytuje prawidłowo a przy 8MHz jest wszystko OK. Sprawdzałem kilka razu kod Inicjalizacji UART i jest zgodny z tym poradnikiem. To że działa z prędkością 8MHz tzn że wzór jest dobry dla tej wartości, a dla 1MHz jest coś nie tak. Tylko nie wiem jak to sprawdzić co jest nie tak.

      Usuń
    5. a to dlaczego niby miałoby nie działać dla 1MHz ? ;)

      Tylko najpierw to musisz pan zwrócić uwagę jakie prędkości możesz wykorzystywać w RS232 dla ŚLIMACZEGO taktowania 1MHz ;)

      ty pewnie strzeliłeś sobie jakiś wysoki baudrate i oczekujesz cudów przy 1MHz

      a zajrzyj że do noty PDF procka na ostatnią stronę rozdziału USART - tam są tabelki ... pierwsza pozycja to wartości i procenty błędów akurat dla 1MHz - i zobacz na jakiej prędkości masz błąd mniejszy równy 2,5% ????? no dla jakiej prędkości baudrate ?

      Wtedy zrozumiesz o co chodzi i jak się dobiera prędkości do częstotliwości taktowania i dlaczego takie kwarce jak np 11,0592MHz są nazywane przyjaznymi dla RS232 ;) zajrzyj sobie dalej w tych tabelach do tej częstotliwości i spójrz na rubrykę błędów dla dowolnej prędkości

      teraz jaśniej ? ;)

      Usuń
    6. Dziękuję za wyjaśnienia i ma Pan jak zwykle rację.
      Dla U2X=0 błędy (bezwzględnie) są na poziomie 7,0% i 8,5%
      Ale gdyby zastosować Asynchronous Double Speed
      Mode (U2X=1) to dla 9600 błędy byłyby na poziomie 0,2%.
      Dla prędkości 2400 i 4800 dla obu U2X są na poziomie 0,2%.
      Ale raz jeszcze dziękuję = poradnik jest świetny = i idę do kolejnej lekcji.

      Co do prędkości wewnętrznego oscylatora to mi jest obojętne czy chodzi na 1MHz czy na 8MHz - więć jak na tej drugiej działa to się cieszę, ale w fazie nauki chciałem wyjaśnić wszystkie wątpliwości.
      Ale swoją drogą to dla błędów na poziomie 8,5% powinien przynajmniej 8 wyników na 100 pokazać a nie pokazał ani jednego prawidłowego przez całą godzinę co sprawdzałem.

      Usuń
  11. Przyczyną była wadliwa przejściówka rs232 , kupiłem inna tym razem na układzie ft232 i wszystko pięknie działa :)

    OdpowiedzUsuń
  12. Rewelacja. Po co mi głupie filmy ZUSA. Wolę Mirka i całe te forum.

    OdpowiedzUsuń
  13. Doskonałe poradniki, rozpływam się. Pozdrowienia Panie Mirku!!!

    OdpowiedzUsuń
  14. Nie mogę oprzeć się aby zadać pytanie dlaczego procesor wykonuje ten program z zablokowanym sei()???
    U mnie ten przykład ruszył dopiero po ustawieniu sei()
    przed wysłaniem czegokolwiek do terminala. Z zablokowanymi przerwaniami program sie wieszał.

    OdpowiedzUsuń
    Odpowiedzi
    1. To zależy z jakiej biblioteki do wysyłania danych przez UART korzystasz. Jeśli wysyłanie bezpośrednie bez udziału przerwań to chyba jasna sprawa, że sei nie jest potrzebne hmmm ? A jeśli biblioteka z przerwaniami - no to .... potrzebne sei ...

      Usuń
    2. Ale szybka odpowiedź Panie Mirku aż mnie zatkało.
      Przerabiając ten przykład skorzystałem z MKUART.c.h zamiast tworzonej tu MYUART.c.h Biblotekę uzupełniłem
      o obsługę putlong i dodałem nowy wzór na obliczanie __UBRR. Kompilowało się bez błędów ale przerwania musiałem załączyć aby program zadziałał. Dalej nie wiem dlaczego konieczne było uruchomienie przerwań..

      Usuń
    3. Jeśli skorzystałeś z biblioteki z książki no to jeszcze raz powtarzam, ona używa przerwań - więc nie za bardzo mogę zrozumieć, dlaczego ty się dziwisz, że bez sei() się zawiesza ? Wiesz co to sei() ? czy nie wiesz ? ... no przecież to globalne zezwolenie na przerwania właśnie.

      Usuń
  15. Faktycznie. Nie zauważyłem, że w tej biblotece jest zainkludowany plik przerwań avr/interrupt.h . Teraz jasne. Dzięki za grzeczne wyjaśnienie i dobranoc.

    OdpowiedzUsuń
  16. mam pytanie jeśli uruchomiłem przetwornik adc i na nóżce wybranej np pc5 nie mam nic podpięte i przyjmijmy że mam wykonaną filtracje zasilania powinno być 0 a nie jest w tym momencie w terminalu pojawia się wartość ok 500 a zmierzona miernikiem na nóżce wartość to 1,02v wartość 0 pojawi sie dopiero po podłączeniu do masy przez rezystor. Czy to jest normalny objaw?

    OdpowiedzUsuń
    Odpowiedzi
    1. Poczytać musisz sobie co to jest stan nieustalony na wejściu (Stan wysokiej impedancji, stan HI-z) wtedy zrozumiesz dlaczego to jest normalny objaw, że napięcie jak to się mówi "pływa" i na drugi raz nie będziesz zostawiał wiszącego wejścia jako wejścia ADC.

      Usuń
  17. mam problem z biblioteką którą pokazywał pan na odcinku, podczas jej kompilacji wyświetla mi się dłąd: (00:12:01 **** Incremental Build of configuration Release for project adc_nauka ****
    make all
    'Building file: ../MYUART/myuart.c'
    'Invoking: AVR Compiler'
    avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega328p -DF_CPU=8000000UL -MMD -MP -MF"MYUART/myuart.d" -MT"MYUART/myuart.o" -c -o "MYUART/myuart.o" "../MYUART/myuart.c"
    ../MYUART/myuart.c: In function 'uart_init':
    ../MYUART/myuart.c:18:2: error: 'UBRRH' undeclared (first use in this function)
    UBRRH = (uint8_t)(_UBRR>>8);
    ^
    ../MYUART/myuart.c:18:2: note: each undeclared identifier is reported only once for each function it appears in
    ../MYUART/myuart.c:19:2: error: 'UBRRL' undeclared (first use in this function)
    UBRRL = (uint8_t)_UBRR;
    ^
    ../MYUART/myuart.c:20:2: error: 'UCSRB' undeclared (first use in this function)
    UCSRB = (1<<TXEN);
    ^
    ../MYUART/myuart.c:20:14: error: 'TXEN' undeclared (first use in this function)
    UCSRB = (1<<TXEN);
    ^
    make: *** [MYUART/myuart.o] Błąd 1

    00:12:01 Build Finished (took 184ms) )
    wydaje mi się że całość zrobiłem dobrze i nie wiem co zrobić

    OdpowiedzUsuń
    Odpowiedzi
    1. zauważyłem co mam źle bo to nie jest biblioteka pod moją atmegę ale dalej kiedy próbuję ją zmodyfikować albo użyć tej z noty katalogowej to dalej mam problemy

      Usuń