Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATmega 16] [C] - Używanie ADC od podstaw

mily20001 30 Lis 2012 23:00 2643 19
  • #1 30 Lis 2012 23:00
    mily20001
    Poziom 11  

    Chcę nauczyć się obsługi ADC. Przeczytałem kilka artykułów/wątków na ten temat ale nadal nic mi nie wychodzi. Testowy program miał sczytywać napięcie z jednego z pinów portu A (podłączonego przez rezystor 22 KOhm i fotorezystor do masy). Wyniki są stabilne jednak coś jest nie tak - wynik jest zawsze bardzo podobny mimo dużych różnic w oświetleniu fotorezystora. Program jest to lekko zmodyfikowany program stąd . Połączenia są na 100% dobre ponieważ po odłączeniu masy wynik zaczyna wariować. Nie mam pojęcia co jest nie tak. Kodu nie wrzucam ponieważ jest brzydki i i tak go nie ogarniam. Prosiłbym o jakiś konkretny kod, najlepiej z dobrymi komentarzami sczytujący wartość z jednego z pinów analogowych atmegi. Z góry dziękuję za pomoc.

    0 19
  • Arrow Multisolution Day
  • #2 01 Gru 2012 00:05
    piotrva
    Moderator na urlopie...

    Po pierwsze - testy ADC zacznij od tak wyszukanego narzędzia jakim jest potencjometr.
    Poza tym fotorezystor powinieneś podłączyć tak:

    Code:

    VCC-------[==foto==]-------+---------[==22k==]--------GND
                               |
                               +-----Do ADC

    0
  • #3 01 Gru 2012 00:10
    mily20001
    Poziom 11  

    Ale czy nie będzie wtedy zwarcia (łączymy VCC z GND przez rezystor i fotorezystor)?

    0
  • #4 01 Gru 2012 00:26
    dondu
    Moderator Mikrokontrolery Projektowanie

    mily20001 napisał:
    Program jest to lekko zmodyfikowany program stąd . Połączenia są na 100% dobre ponieważ po odłączeniu masy wynik zaczyna wariować. Nie mam pojęcia co jest nie tak. Kodu nie wrzucam ponieważ jest brzydki i i tak go nie ogarniam. Prosiłbym o jakiś konkretny kod, najlepiej z dobrymi komentarzami sczytujący wartość z jednego z pinów analogowych atmegi.

    Skoro już wskazałeś źródło programu, to czego oczekujesz więcej, skoro tam jest wszystko o co prosisz łącznie z komentarzami. Jeżeli nie radzisz sobie z jednym gotowcem to z innym także sobie nie poradzisz.

    Zamiast więc szukać następnych, wklej jednak swój kod i pokaż schemat swojego układu - dokładnie jak masz podłączony mikrokontroler.

    0
  • Arrow Multisolution Day
  • #6 01 Gru 2012 01:19
    mily20001
    Poziom 11  

    @dondu: Problem w tym że tamten program jest na ATmegę 8 a nie 16 co wymusza pewne zmiany w programie.

    0
  • #7 01 Gru 2012 08:13
    dondu
    Moderator Mikrokontrolery Projektowanie

    Przepraszam, faktycznie nie zauważyłem, że w tytule masz ATmega16. W takiej sytuacji otwierasz datasheet obu mikrokontrolerów i porównujesz bity konfigurujące daną opcję, czy mają taką samą funkcję (99% przypadków), nazwę i są w rejestrze o tej samej nazwie.

    0
  • #9 01 Gru 2012 19:46
    mily20001
    Poziom 11  

    Ok, wielkie dzięki, działa. Jeszcze tylko jedno pytanie - jak ustawić 8 bitowy pomiar, ponieważ będę potrzebował mierzyć dość małe wartości.

    0
  • #10 01 Gru 2012 20:02
    tmf
    Moderator Mikrokontrolery Projektowanie

    To, że będziesz mierzył małe wartości nie znaczy, że musisz przejść na 8 bitów, a nawet znaczy, że zapewne zmniejszenie rozdzielczości ADC jest kiepskim pomysłem :)
    BTW, jeśli chcesz 8 bitów, to po prostu ustaw wyrównanie ADC do lewej i czytaj tylko ADCH.

    0
  • #11 04 Gru 2012 15:37
    mily20001
    Poziom 11  

    Jeszcze jedno pytanie. Chciałbym wykorzystać 3 porty ADC, jak coś takiego zrobić?

    0
  • #13 08 Gru 2012 15:22
    mily20001
    Poziom 11  

    Poszukałem, znalazłem na mikrokontrolery.blogspot.com przykładowy program, pozmieniałem porty i.. nie działa. Wywala błąd przy ustawianiu bitu na ciągły pomiar. Co można z tym zrobić?

    0
  • #14 08 Gru 2012 15:39
    mi14chal
    Poziom 28  

    Pokaż kod. Co znaczy nie działa? Jaki wywala błąd?

    0
  • #15 08 Gru 2012 18:27
    dondu
    Moderator Mikrokontrolery Projektowanie

    mily20001 napisał:
    Poszukałem, znalazłem na mikrokontrolery.blogspot.com przykładowy program, pozmieniałem porty i.. nie działa. ... Co można z tym zrobić?

    Coś pozmieniałeś, ale nie pokazujesz co, i chcesz byśmy Ci powiedzieli co z tym zrobić?
    Tym bardziej, gdy kod źródłowy spod tego adresu, był dla ATmega8, a Ty działasz na ATmega16.


    mily20001 napisał:
    Wywala błąd przy ustawianiu bitu na ciągły pomiar.

    To może trzeba porównać datasheet obu uC? Ja bym tak zrobił, zamiast pytać na forum.

    0
  • #16 09 Gru 2012 12:14
    mily20001
    Poziom 11  

    Więc mój program wygląda mniej więcej tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Po zmianie ADFR na ADATE (jeśli dobrze ogarnąłem datasheeta to jest to odpowiednik). adc4 jest cały czas równe 0. Połączenia są ok, ponieważ program odczytujący wartość tylko jednego ADC (PA5 konkretnie), działa poprawnie.

    0
  • #17 09 Gru 2012 12:30
    dondu
    Moderator Mikrokontrolery Projektowanie

    mily20001 napisał:
    Więc mój program wygląda mniej więcej tak:

    To nie jest cały program, to jest "mniej więcej jakiś do bani fragment programu".
    Wklej dokładnie całość oraz podaj jaki zegar ustawiasz i gdzie.
    Pokaż też komunikaty z kompilacji.

    0
  • #18 09 Gru 2012 22:06
    mily20001
    Poziom 11  

    Zegar 7372800Hz, ustawiony w makefile. Co do includów:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #20 12 Gru 2012 20:52
    mily20001
    Poziom 11  

    A oto i cały kod programu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Wiem że funkcja send() jest kiepsko napisana, ale na razie wystarcza mi fakt że działa.
    Po odpaleniu programu i krótkiego debuga na początku na wyświetlaczu zostaje ostatnia wartość - 123 (oznacza to że albo nic się nie wysyła albo wysyła się 0, które jest ignorowane). Chciałbym żeby pomiar nie używał przerwań - jak najbardziej można wyłączyć tryb freerun. Z góry dzięki za pomoc.

    0