logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega32][C] Odczytywanie tylko jednego kanału ADC zamiast kilku

matt90 06 Kwi 2014 21:46 1479 11
REKLAMA
  • #1 13483282
    matt90
    Poziom 8  
    Witajcie, mam problem z odczytem wartości z 2 kanałów ADC. Procesor to atmega32. Używam Timer0 żeby przełączać kanały, a na wyświetlaczu wyświeltane są 2 wartości, ale obydwie pokazują to samo- odczytywany jest tylko jeden kanał
    Inicjalizacja ADC
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Pętla główna
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Przerwanie Timer'a
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Oczywiście inicjalizacja pinów na początku jest. Proszę o pomoc[film=450.370][/film]
  • REKLAMA
  • #2 13483982
    2rs232
    Poziom 18  
    Pokaż jeszcze kod, który przełącza kanały ADC.
  • #3 13484082
    krru
    Poziom 33  
    Nie łapię synchronizacji w tym programie - przełączasz wejścia ADC na przerwaniach z timera, a zupełnie niezależnie, w głównej pętli startujesz przetworniki. Także odczyt wyników masz w przerwaniu z timera. Przetworniki działają prawie cały czas - zaraz po zakończeniu jednego pomiaru startujesz drugi, więc jest prawie 100% szansy, że przerwanie od timera wystąpi gdy przetwornik jest w trakcie przetwarzania.

    Po co ci w ogóle ten timer? Po prostu w pętli głownej raz startuj przetwornik na jednym kanale, raz na drugim. Jeśli chcesz jakoś równomiernie sterować przetwornikami to po prostu w przerwaniu z timera najpierw odczytaj stary wynik (o ile jest gotowy), zapisz do zmiennej, ustaw flage, potem zmień kanal i wystartuj jeszcze raz przetwornik. W pętli głownej tylko sprawdzaj flagę i jak trzeba to aktualizuj wyświetlacz. Oczywiście przerwania z timera muszą być na tyle wolno by przetwornik zdążył.
  • #4 13484255
    matt90
    Poziom 8  
    Zastosowałem Timer ponieważ wartości te muszą być cały czas odczytywane, a nie co jakiś czas. Z ADC odczytuje położenie gałki która napędza silniczki. Póki co jest to jedna gałka- dwa pomiary ADC. Ostatecznie będą to dwie gałki, więc 4 kanały ADC będę musiał wykorzystać.
    Więc zamiast Timera i przerwania powinien w pętli głównej wykorzystać taki kod jak mam napisany w funkcji Timer'a?
  • REKLAMA
  • #5 13486303
    krru
    Poziom 33  
    matt90 napisał:

    Więc zamiast Timera i przerwania powinien w pętli głównej wykorzystać taki kod jak mam napisany w funkcji Timer'a?


    Tak może być. Zaraz po sprawdzeniu że ADC skończył.
  • #6 13486933
    matt90
    Poziom 8  
    Nie za bardzo rozumiem... :/
    W pętli głównej powinno być:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Timer muszę mieć, bo w nim ustawiam początkową wartość, dzięki czemu wartości mam 8 bitowe, jak go wyłącze mam 10 bitów, a nie chcę aż tyle.
    Możecie pomóc, jak powinien wyglądać ten kod?
  • REKLAMA
  • #7 13487157
    LordBlick
    VIP Zasłużony dla elektroda
    matt90 napisał:
    Timer muszę mieć, bo w nim ustawiam początkową wartość, dzięki czemu wartości mam 8 bitowe, jak go wyłącze mam 10 bitów, a nie chcę aż tyle.
    Nie ma to większego znaczenia, ignorujesz dwa najmłodsze bity i z głowy…
    Warto również użyć przerwania od zakończenia konwersji…
  • REKLAMA
  • #8 13487866
    matt90
    Poziom 8  
    Napisałem w pętli głównej bez przerwania, pomiary są dobre. Tylko mam teraz problem z tym, że w pozycji neutralnej pokazuje mi 230, a zakres wyświetlania mam 0-255 więc nie jest to symetryczne, chciałbym aby startował powiedzmy od 140, można to jakoś zrobić?
  • #9 13488452
    Brutus_gsm
    Poziom 25  
    Tak na szybko wtrącę, że jeśli potrzebujesz wartości ośmiobitowej z pomiaru ADC, to można ustawić bit ADLAR w rejestrze ADMUX i odczytywać tylko starszy bajt, tj ADCH. Więcej informacji w nocie katalogowej.
  • #10 13489237
    matt90
    Poziom 8  
    Odczytuję wartość 8 bitową :) Problemem jest to, że po włączeniu zasilania mam wartość 230, więc jak ruszę pokrętłem lekko w jedną stronę to mam koniec zakresu, bo jest 255, a w drugą leci do 0. Jak to zrobić, żeby w pozycji neutralnej, kiedy nie ruszam miałbym np. 140?
  • #11 13489666
    Brutus_gsm
    Poziom 25  
    Zapewne wystarczy zmienić napięcie referencyjne, ale bez schematu i opisu czym jest twoja "gałka" będzie ciężko o prawidłową podpowiedź.
  • #12 13492768
    matt90
    Poziom 8  
    Wszystko działa, dziękuję za pomoc :)
REKLAMA