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

Odczyt ADC/ATMega32 - ADC - wariujący odczyt

marciano8 23 Paź 2014 00:49 978 3
  • #1 23 Paź 2014 00:49
    marciano8
    Poziom 8  

    Dzień dobry kolegom.

    Napisałem program na ATMegę32 w którym dokonuję odczytu trzech napięć (U1, U2 i U3) poprzez piny ADC mikrokontrolera i wystawiam na wyjście PWM wartośc napięcia wynoszącą U_WYJ=U1-U2-U3.

    Wartość napięcia U_WYJ na wyjściu przy podanych zerowych napięciach U1, U2, U3 na piny ADC nie utrzymuje stałej wartości a zmienia się w zakresie ok. +/-0,2V wariując w sposób chaotyczny wokół zera.

    Podobnie sytuacja wygląda przy podaniu stałej wartości napięcia U1 i zerowych wartości napięcia na U2 i U3 - napięcie wariuje chaotycznie wokół zadanej wartości U1 (w podobnym przedziale ok. +/-0,2V).

    Jeżeli programowo zadam dla U1, U2 i U3 zerowe wartości - problem ustępuje i na wyjściu PWM pojawia się pożądana stała wartość. Stąd wniosek, że źródłem tych wariacji jest problem z odczytem ADC.

    Czy ktoś z kolegów miał podobną sytuację? Co może być potencjalną przyczyną takiego zachowania się sygnału?

    Poniżej wklejam fragment kodu źródłowego przedstawiający funkcje realizujące odczyt ADC podczas przerwania wywołanego przepełnieniem się licznika Timer/Counter2.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Funkcje te wykonywane są w przerwaniu:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Przerwania wywoływane są co 17778 mikrosekund a realizacja odczytu wszystkich trzech ADC wynosi 3339 mikrosekund (dla każdego z trzech ADC - 113 mikrosekund plus czas oczekiwania 1000 mikrosekund za każdym razem po ustawieniu ADC jako wejścia). Zatem czas realizacji odczytu jest krótszy od czasu co który następuje przerwanie.
    Preskaler dla ADC równy 128, dobrany dla taktowania 14745600Hz, zapewnia też nieprzekroczenie dopuszczalnej wartości 15kSPS.
    Nadmienię, że dla sygnałów sinusoidalnych problem się zmniejsza lub znika (im wyższa częstotliwość sinusoidy tym problem bardziej maleje, przy wyższych częstotliwościach sinusoida jest już nieodkształcona). Mocno zauważalne wariacje występują przy podawaniu stałej wartości napięć.
    Przy programowo zadanych wartościach U1, U2 i U3 - brak wariacji, zatem problem pochodzi z odczytu ADC.

    Czy któryś z kolegów miał podobny problem związany z niestabilnością odczytu ADC?

    Pozdrawiam.

    0 3
  • #2 23 Paź 2014 01:12
    dondu
    Moderator Mikrokontrolery Projektowanie

    Raczej: Dobra noc!
    ... bo post raczej nocny :)

    Program to jedno, a schemat to drugie: http://mikrokontrolery.blogspot.com/2011/03/avr-adc-podlaczenie.html

    Co nam w tym względzie możesz powiedzieć (lub pokazać schemat), skoro podejrzewasz ADC o niestabilność?

    ... jeszcze nie patrzyłem na program, bo od schematu zacząć należy.

    0
  • #3 23 Paź 2014 17:38
    marciano8
    Poziom 8  

    Tym razem dobry wieczór! :)

    Schemat zrealizowany jest poprawnie. Zasilanie AVcc podawane jest poprzez dławik a przy pinie AVcc jest kondensator podłączony do masy.
    Sygnał wariuje w zarówno dla Vref zwartego do AVcc jak i w przypadku podłączenia Vref poprzez kondensator do masy i programowego ustawienia wewnętrznego napięcia odniesienia odpowiadającego napięciu zasilania.

    0
  • #4 24 Paź 2014 12:13
    dondu
    Moderator Mikrokontrolery Projektowanie

    Nie zrozum mnie źle, ale często jednak okazuje się, że nie do końca jest poprawnie :)
    Także PCB może mieć wpływ na problem, o którym piszesz.
    Ale przyjmuję, że jednak faktycznie wszystko jest poprawnie.

    Analizując załączone fragmenty programu nie znalazłem błędu.
    Zakładam oczywiście, że F_CPU masz ustawione w opcjach projektu.

    Swoją drogą _delay_ms(1) w przerwaniach to ostateczność, ale w Twoim przypadku jest to jakieś rozwiązanie.
    Jednak przesunąłbym je za instrukcje zmiany kanału.

    Jak duże są te "szalone odczyty", bo widzimy jedynie odczytanie ADC do zmiennych U1, U2 i U3, a podajesz, że wariowanie ma miejsce po przeliczeniu na napięcie?
    Czy sprawdzałeś same odczyty ADC?

    EDIT:
    No i jeszcze pytanie o trzy instrukcje ustawiające piny jako wejściowe:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    z programu nie widać byś po dokonaniu pomiaru na danym kanale ustawiał je jako wyjściowe, stąd pytanie w jakim celu robisz to za każdym pomiarem?

    EDIT2:
    Volatile jest Ci znane? :)

    0
  Szukaj w 5mln produktów