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

[ATmega16][C] Oversampling i kalibracja ADC

trk40 12 Lip 2010 16:16 4163 7
REKLAMA
  • #1 8284683
    trk40
    Poziom 11  
    Robię woltomierz używajac adc z atmega16, przy pomiarach mam błedy na poziomie 10mV do 50mV. Kondensatory 100nF wpięte między gnd a Aref i Acc. Przy używaniu Aref i Acc jako źródła odniesienia wyniki takie same. Czy jest sposob aby to poprawić ? Skalibrować ?

    Miernik : EZ DM-441
    Miernik / Atmega
    5.001 4.9951
    4.094 4.101
    3.42 3.41
    2.80 2.79
    1.91 1.88
    1.299 1.265
    1.08 1.04
    0.77 0.73
    0.25 0.20

    Czytałem tez ze wewnętrzne źródło odniesienia ma pewien rozrzut produkcyjny - jak sprawdzić wartość mojego ?


    Próbowałem zrobić na podstawie jakiegoś przykładu oversampling do 11bitow ale wynik mam ten sam jak w normalnym pomiarze. Co robię nie tak?

    Kod:
    
    char str[10];
    uint8_t i=0;
    float wynik;
    unsigned short pomiar1,pomiar2,pomiar3,suma=0;
    
    ADMUX = (0<<REFS1) |(0<<REFS0);
    ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
    
    while(1)
    {	
    suma=0;
    for(i = 0; i < 16; i++)
        {
    	ADCSRA |= (1<<ADSC); 
    	while (ADCSRA & (1<<ADSC));  // while(!(ADCSRA & (1 << ADIF)))
    	suma+=ADCW;
        }
    	pomiar1=(suma>>2); //11bit
    	ADMUX |= _BV(0);
    	ADCSRA |= (1<<ADSC);
    	while (ADCSRA & (1<<ADSC));
    	pomiar2=ADCW; 
    	ADMUX&=(~(1<<MUX0));
    	ADMUX|=(1<<MUX1);
    	ADCSRA |= (1<<ADSC);
    	while (ADCSRA & (1<<ADSC));
    	pomiar3=ADCW;
    	ADMUX&=(~((1<<MUX0)|(1<<MUX1)));
    	
    	
    wynik=0.0012207*pomiar1;
    dtostrf(wynik, 7, 4, str);
    LCD_WriteText(str); 	
    wynik=0.0048828*pomiar3;  //=(pomiar*5)/1024;
    dtostrf(wynik, 7, 4, str);
    LCD_WriteText(str); 	
    
  • REKLAMA
  • #2 8284859
    janbernat
    Poziom 38  
    Internal Voltage Reference: 2.3min 2.6typ 2.9max [V].
    A napięcie mierzysz na Vref dobrym miernikiem.
  • REKLAMA
  • #3 8284922
    tmf
    VIP Zasłużony dla elektroda
    Popatrz na charakterystykę ADC w nocie, przecież to nie jest idealny układ. Oprócz błędów wnoszonych przez VRef, masz też błędy związane z samym samplowaniem, nieliniowość, offset. Dodatkowo musisz pamiętać o interferencji z układem cyfrowym - do super dokładnych pomiarów usypia się procesor, korzysta się z noise canceler itd. Już nie wspominając o prawidłowym poprowadzeniu mas i odsprzęgnięciu AVCC. Jak masz podpięte napięcie mierzone do ADC? I na koniec, skąd pewność, że twój miernik podaje prawidłowe wartości? Piszą, że dla napięcia stałego dokładność wynosi 0,1%, czyli dla 5V błąd wyniesie 5mV.
  • #4 8286242
    trk40
    Poziom 11  
    Internal Voltage Reference - mierzę gdy bity REFS0/1 sa ustawione na 1 i 1 , tak ? Bo wychodzi 2,7V

    Wiem ze przetwornik nie jest idealny ale czy jest sposob aby to skaliborac/poprawic programowo ?
    Na wejscie ADC powawalem napiecie potecjometr bezposrdnio do pinu.
    Skonsultuje wyniki z innym miernikiem ale raczej jest dobry.

    Ten oversampling dobrze realizuje ?
  • REKLAMA
  • #5 8286547
    arturt134
    Poziom 27  
    Daruj sobie oversampling. Zrób kalibrację.
    Wybierz dwa punkty: jeden blisko dołu zakresu, drugi blisko góry zakresu.
    Na osi x masz wartość binarną odczytaną z przetwornika ADC, w skrócie WBIN, a na osi y masz U[V].
    Równanie prostej łączącej te dwa punkty to: U= a*WBIN + b.
    Dla obu tych punktów musisz odczytać WBIN oraz U. Wartości odczytane podstawiasz do równania ogólnego prostej i masz układ dwóch równań z dwiema niewiadomymi. Wyznaczasz a i b - to twoje współczynniki kalibracji.
    Teraz dla każdej odczytanej wartości binarnej obliczasz U podstawiając do tego równania.

    Jeżeli okaże się, że układ ma sporą nieliniowość, to być może trzeb będzie go zlinearyzować wyznaczając kilka przedziałów, w których jest on liniowy. Wtedy takie współczynniki kalibracji musisz wyznaczyć dla każdego przedziału z osobna.

    To była kalibracja.... a teraz sprzęt. tak jak pisano wcześniej, jeżeli chcesz mierzyć dokładnie, to musisz usypiać procesor podczas pomiaru. Ponadto filtrowanie napięcia analogowego - daj kondensator 10u, rezystor szeregowy 33R i kolejny 10u. Użyj REF-a zewnętrznego. Popatrz na dokumentację, nawet tani LM385 (1,5zł w TME) ma lepsze parametry niż REF wewnętrzny.
    Nie wiem jaki masz układ analogowy. Może masz za dużą impedancję źródła sygnału? Tu najlepszy byłby wzmacniacz operacyjny, nawet taki za 1 zł.

    No i na koniec miernik. Skąd wiesz, że napięcie, które pokazuje jest dobre? Powinien zostać wywzorcowany (niekoniecznie od razu w poważnym akredytowanym laboratorium, ale przynajmniej poprzez porównanie z jakimś lepszym miernikiem). Nie posiadając wzorcowania, możesz się spodziewać, że jego błąd jest dosyć spory - najbezpieczniej założyć sobie wartość maksymalną z instrukcji obsługi.
  • REKLAMA
  • #6 8293447
    sepako
    Poziom 14  
    Pomiar w dwóch punktach jest dobry jeśli chcesz mierzyć w pobliżu tych punktów, prosta wg której będzie można obliczyć wynik da błąd zerowy w miejscach pomiaru ale co poza nimi? błąd pomiaru może być znaczny, niestety nie jest to sposób optymalny wyznaczenia prostej - lepszym sposobem jest tu aproksymacja np metoda najmniejszych kwadratów. Tez możesz aproksymować wielomianem 1 stopnia (lub wyższymi) czyli równaniem prostej, przy czym tu wyznaczysz równanie które minimalizuje błąd w każdym punkcie a ściśle mówiąc w punktach pomiaru (teoretycznie im więcej tym lepiej). W przypadku ADC dało to o wiele lepsze wyniki niż wyznaczenie na podstawie 2 punktów. Wyniki pomiaru w pobliżu zera proponuje nie brać pod uwagę do aproksymacji, i w ogóle lepiej nie mierzyć w pobliżu zera bo błędy są dość duże.
  • #7 8293770
    arturt134
    Poziom 27  
    Można to zrobić albo poprzez linearyzację, która wymaga małego nakładu obliczeń i prostej kalibracji (2 punktowej), ale sprawdza się tylko przy małych nieliniowościach.

    Przy dużych nieliniowościach zdecydowanie lepiej jest użyć wielomianu (im wyższego stopnia tym lepiej). Jednak metoda ta wymaga trochę większej ilości obliczeń i wielopunktowej kalibracji. O ile kalibracja elektryczna z reguły jest prosta, to przy różnego rodzaju czujnikach nieelektrycznych czasami trudno jest odtworzyć punkty kalibracyjne z wystarczającą dokładnością. Poza tym im więcej punktów kalibracyjnych, tym więcej pracy będzie ta kalibracja wymagała (czytaj: będzie drożej kosztowała).

    Musisz sam zdecydować, która metoda w twoim przypadku będzie bardziej adekwatna.
  • #8 8293922
    sepako
    Poziom 14  
    No zgadza sie trzeba wybrać metodę indywidualnie, najlepiej zrobić kilka/kilkanaście pomiarów w całym zakresie i zobaczyć jak układa się wykres i do tego dobrać metode.
    Ja do tego wykorzystuje jakąś archaiczną wersje mathcada sprawdza sie doskonale.
REKLAMA