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

ADC w ATmega8: przeskoki bitów, dokładność odczytu, napięcie referencyjne

nojmi 06 Lut 2007 01:11 1428 8
REKLAMA
  • #1 3533975
    nojmi
    Poziom 20  
    Posty: 473
    Pomógł: 9
    Ocena: 18
    1. Przy odczycie z adc przeskoki na 2 ostatnich bitach przy rozdzielczości 1024 jest normalnością czy szukać problemów w zasilaniu bądź programie?

    2. Dokładność odczytu będzie taka sama przy pomiarze wartości w zakresie 1-1.5V dla Vref=2,5V i w zakresie 2-3V dla Vref=5V? Czy lepiej tolerowane są te wyższe wartości.

    Może pytania dziwne, ale chce wydobyć z ADC atmegi zupełnego maksa. No i...

    3. Czy wewnętrzne napięcie referencyjne atmega8 można doprowadzać do innych układów poprzez Aref czy dać sobie spokój i zastosować dodatkowe źródło odniesienia.
  • REKLAMA
  • #2 3534023
    megao
    Poziom 25  
    Posty: 691
    Pomógł: 66
    Ocena: 92
    To może być wina zbyt dużych tętnień na zasilaniu. Do przetwornika najlepiej doprowadzić napięcie zasilające przez dławik, bardzo ważny jest też dobór kondensatorów blokujących na zasilaniu.

    Wyższe wartości mierzonych napięć są w mniejszym stopniu podatne na zakłócenia.
  • REKLAMA
  • #4 3535172
    nojmi
    Poziom 20  
    Posty: 473
    Pomógł: 9
    Ocena: 18
    No dobra, a jeżeli zasilanie mam ok - kondensatory i dławik zgodnie z dokumentacją. Programowo raczej też w porządku - przerwanie a do tego noise canceler. Częstotliwość próbkowania z największym podziałem (128) ale w sumie przy mniejszym bez znaczenia bo wyniki pomiaru z takim samym błędem (2 bity niestabilne).

    Czy przypadkiem "+/- 2 LSB Absolute Accuracy" z dokumentacji nie oznacza przypadkiem, że takie wahnięcia są dopuszczalne i nic nie da się poradzić?
  • REKLAMA
  • #5 3535256
    Dar.El
    Poziom 41  
    Posty: 5450
    Pomógł: 750
    Ocena: 889
    Witam
    Jeśli Atmel podaje sposób na zwiększenie rozdzielczości, to znaczy że ta niestabilność jest spowodowana twoim błędem. Co źle zrobiłeś, nie można stwierdzić, bez większej ilości danych. A co się dzieje jak mierzysz napięcie referencyjne ?.
  • #6 3535320
    nojmi
    Poziom 20  
    Posty: 473
    Pomógł: 9
    Ocena: 18
    No tak. Mierzone napięcie referencyjne zmienia się ale o jedną wartość w jednym kierunku (jeden bit niestabilny). Co to może oznaczać?
  • REKLAMA
  • #7 3535330
    Dar.El
    Poziom 41  
    Posty: 5450
    Pomógł: 750
    Ocena: 889
    Może to być źle poprowadzone ścieżki, źle odfiltrowane zasilanie, źle napisany program itd.. Możesz jeszcze uśredniać wynik programowo.
  • #8 3535365
    nojmi
    Poziom 20  
    Posty: 473
    Pomógł: 9
    Ocena: 18
    Uśrednienie wyników odpada. Program wątpie, że źle napisany. Korzystam z CodeVisionAVR i CodeWizard wywalił mi coś takiego:

    #include <mega8.h>
    
    unsigned int adc_data;
    #define ADC_VREF_TYPE 0x00
    
    // ADC interrupt service routine
    interrupt [ADC_INT] void adc_isr(void)
    {
    // Read the AD conversion result
    adc_data=ADCW;
    }
    
    // Read the AD conversion result
    // with noise canceling
    unsigned int read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input|ADC_VREF_TYPE;
    #asm
        in   r30,mcucr
        cbr  r30,__sm_mask
        sbr  r30,__se_bit | __sm_adc_noise_red
        out  mcucr,r30
        sleep
        cbr  r30,__se_bit
        out  mcucr,r30
    #endasm
    return adc_data;
    }
    
    int wynik;
    
    void main(void)
    {
    
    // ADC initialization
    // ADC Clock frequency: 62,500 kHz
    // ADC Voltage Reference: AREF pin
    ADMUX=ADC_VREF_TYPE;
    ADCSRA=0x8F;
    
    // Global enable interrupts
    #asm("sei")
    
    while (1)
          {
    	wynik=read_adc(0);
    	
    }


    Do tego wynik wysyłam poprzez USART co 100ms.

    Jedyne co może podpadać to ścieżki, bo druk jeszcze nie zaprojektowany, narazie płytka uniwersalna.

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problem niestabilności dwóch najmłodszych bitów przy odczycie ADC w mikrokontrolerze Atmega8 z rozdzielczością 10-bitową (1024 poziomy). Przyczyną mogą być tętnienia na zasilaniu, dlatego zaleca się stosowanie dławika oraz odpowiednich kondensatorów filtrujących. Niestabilność na poziomie ±2 LSB jest zgodna z dokumentacją Atmela i może być dopuszczalna. Wyższe mierzone napięcia (bliższe Vref) są mniej podatne na zakłócenia, co wpływa na dokładność pomiaru. Wewnętrzne napięcie referencyjne Atmegi8 można wykorzystać, jednak jego stabilność i możliwość zasilania innych układów przez pin AREF jest ograniczona, więc często lepiej zastosować zewnętrzne, dedykowane źródło odniesienia. Programowo stosowany noise canceler i przerwania ADC są poprawne, a uśrednianie wyników może pomóc, choć w tym przypadku autor wyklucza tę metodę. Dokumentacja Atmela zawiera metody zwiększania rozdzielczości ADC, nawet do 16 bitów, co może być pomocne w uzyskaniu lepszej dokładności. Problemy mogą wynikać także z nieoptymalnego prowadzenia ścieżek PCB lub błędów w oprogramowaniu, jednak w przedstawionym kodzie użyto standardowych rozwiązań z CodeVisionAVR i CodeWizard.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA