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

Niestabilny odczyt ADC w Xmega16a4U - zmiany ±3 na ostatnim miejscu wyniku

mas24 18 Lut 2015 10:49 1152 6
REKLAMA
  • #1 14450977
    mas24
    Poziom 16  
    Witam,

    Poznając procki Xmega, chciałem spróbować swoich sił z przetwornikiem ADC w tym procku. Poza dziwnymi jego cechami, jak OFFSET od 200 (czasem od 170) wartości z przetwornika, zauważyłem, że wynik jest niestabilny na ostatnim miejscu i zmienia się ±3, co by przemawiało za szybkimi zmianami pierwszych 2 bitów LSB.
    Program mam taki:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    funkcja WYSW odpowiada za wyświetlanie wyniku na wyświetlaczu LCD 3,5 cyfry, podłączonym bezpośrednio do procka (bez sterownika) i ona nie wprowadza tych zakłóceń - sprawdzałem.

    Pytanie teraz: jak pozbyć się tego rodzaju niestabilności?
  • REKLAMA
  • #2 14451063
    piotrva
    VIP Zasłużony dla elektroda
    To i tak mała zmiana - na poziomie tradycyjnego szumu (2 LSB).
    Ja swego czasu miałem szum na poziomie 50-60 LSB
    Offset to cecha normalna - przetworniki te umożliwiają mierzenie małych napięć ujemnych (np. jakbyś chciał LM35 podpiąć).
  • REKLAMA
  • #3 14451095
    BlueDraco
    Specjalista - Mikrokontrolery
    Jak napisał piotrva - jest to zjawisko całkowicie normalne. Wyniki pomiarów ADC należy filtrować. Ja używam filtra dolnoprzepustowego, który w C zajmuje jedną linię kodu:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #4 14451112
    tmf
    VIP Zasłużony dla elektroda
    Tylko uzupełnię, że żeby pozbyć się offsetu należy użyć pomiaru różnicowego, lub też ten ofset zmierzyć i odejmować od wyniku. Można go zmierzyć w stosunku do zewnętrznego GND lub wewnętrznej masy procesora.
  • #5 14451181
    mas24
    Poziom 16  
    BlueDraco napisał:
    Jak napisał piotrva - jest to zjawisko całkowicie normalne. Wyniki pomiarów ADC należy filtrować. Ja używam filtra dolnoprzepustowego, który w C zajmuje jedną linię kodu:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Ja tu widze 2 linie (nie licząc #define...) :)

    Wpisałem to, co podał Kolega, definiując zmienną "adcavg" jako 16 bitową a jako ADC podałem ADCA.CH0RES, ale nie pomogło, a przy zmianach ADC (mam podłączony potencjometr) wynik "przelatuje" ze starej wartości do nowej. Najprawdopodobniej coś źle zapisałem:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #6 14451469
    BlueDraco
    Specjalista - Mikrokontrolery
    Ta druga linia niekoniecznie jest potrzebna - adcavg zawiera przefiltrowany wynik konwersji, który ma o AVGSHIFT bitów więcej niż to, co wychodzi z ADC. Nie ma obowiązku obcinania dodatkowych bitów.

    A co konkretnie Ci nie pasuje w uzyskanym w ten sposób wyniku? Oczywiście częstotliwość pomiarów powinna być np. kilkanaście..kilkadziesiąt razy większa od częstotliwości wyświetlania czy ogólnie "korzystania z" wyniku.
  • REKLAMA
  • #7 14454760
    mas24
    Poziom 16  
    Chyba nadal coś robię źle, bo pomimo zastosowania poniższego kodu, wynik nadal jest niestabilny.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jednak konieczne było przesuniecie na końcu o 3 bity, bo głupoty wyświetlał.
    Nie wiem, czy to ma coś do rzeczy, ale w programie mam jeszcze przerwania od TCC0, służące do odświeżania wyświetlacza LCD bez sterownika.
REKLAMA