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] Używanie kilku kanałów ADC - mieszanie wyników

lala166 23 Sty 2011 13:42 1829 5
REKLAMA
  • #1 9045454
    lala166
    Poziom 21  
    Cześć! Mam problem i muszę go szybko rozwiązać. Korzystam z biblioteki:

    adc.h
    void ADC_Init(void);
    int getADC(char channel);
    



    adc.c
    #include <avr/io.h>
    //-------------------------------------
    // Get ADC conversion value
    //-------------------------------------
    int getADC(char channel)
    {
    unsigned int W = 0;
    ADMUX |= channel;
    ADCSRA |= (1 << ADSC);
    while(ADCSRA & (1 << ADIF));
    ADCSRA |= (1 << ADIF);
    W = ADCL;
    W |= (ADCH << 8);
    return W;
    }
    //-------------------------------------
    // ADC Initialization
    //-------------------------------------
    void ADC_Init(void)
    {
    ADMUX = (1 << REFS0);
    ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); 
    }
    //-------------------------------------
    // End of file
    //-------------------------------------


    I chce odczytać dane z trzech kanałów. Odczyt z dwóch wykorzystując poniższy kod działa poprawnie, jeżeli przed każdym "getADC()" wstawię ADC_Init().

       ADC_Init();
       x=getADC(1);
    	
    	x=x*5/1023;
    	x=(x+0.11*5)*10/(5*0.009);
          dtostrf(x,3,0,wynik_cis);
    ////WYSWIETLENIE
       
    
    
       
       ADC_Init();
     	y=getADC(2);
    	
    	y=y*5/1023;
    	y=-6+125*y/3.4;
          dtostrf(y,4,1,wynik_wilg);
    	////////////WYSWIETLENIE
    	   _delay_ms(500);


    Problem odkryłem gdy chciałem użyć trzeciego kanału. Odczytuje bardzo dziwne wartości i dodatkowo jest zakłamanie napewno w jednym z poprzednich kanałów. Program chodzi w nieskończonej pętli.

       ADC_Init();
       x=getADC(1);
    	
    	x=x*5/1023;
    	x=(x+0.11*5)*10/(5*0.009);
          dtostrf(x,3,0,wynik_cis);
    ////WYSWIETLENIE
       
    
    
       
       ADC_Init();
     	y=getADC(2);
    	
    	y=y*5/1023;
    	y=-6+125*y/3.4;
          dtostrf(y,4,1,wynik_wilg);
    	////////////WYSWIETLENIE
    	   _delay_ms(500);
    
       ADC_Init();
       c=getADC(3);
        //WYSWIETLENIE
    	   _delay_ms(1000);
    
    




    Ciekawie też zaczyna się robić jak dodam dodatkowe kanały do poprzednich dwóch:
    
       ADC_Init();
       c=getADC(3);
        //WYSWIETLENIE
    	   _delay_ms(1000);
       ADC_Init();
       d=getADC(4);
    //WYSWIETLENIE
    	   _delay_ms(1000);
    	   ADC_Init();
       e=getADC(5);
    //WYSWIETLENIE
    	   _delay_ms(1000);
    


    Tak samo jak w przypadku trzech: jest przekłamanie napewno w jednym poprawnie działającym kanale. Podłączam kanał 3 do masy i niby spoko bo wyświetla 0 tylko że nie w tym miejscu co trzeba! Wyświetla w miejscu dla wyniku kanału 4. To samo się dzieje dla kanału 4 - wyświetla w miejscu wyniku kanału 5.

    Może nie tak wywołuje i inicjuje kanały? Korzystam z płytki testowej evb.
  • REKLAMA
  • #2 9045847
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 9046232
    lala166
    Poziom 21  
    Wydaje mi się że kasuje bo przed każdym getADC stawiam ADC_Init.
  • REKLAMA
  • #4 10477151
    lala166
    Poziom 21  
    Odkopuje swój star temat, bo dalej go nie rozwiązałem a znów zaszła potrzeba użycia kilku ADC.

    Gdzie robię błąd??

    Sposób pomiaru. Za każdym razem inicjuje, później mierzę, a na końcu wyłączam. Pod 0 podłączone 0V, pod 1 ok. 3V a pod 2. 5V
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



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


    Wyniki z konsoli:
    1. 5.00 2. 0.00 3. 3.06

    Czyli pomieszane ...
  • REKLAMA
  • Pomocny post
    #5 10477276
    tmf
    VIP Zasłużony dla elektroda
    Nie sprawdzaj flagi ADIF, tylko ADSC. ADIF nigdzie nie zerujesz więc przy kolejnym pomiarze od razu przechodzisz do odczytu ADC.
  • #6 10477331
    lala166
    Poziom 21  
    No i jasne. Działa!
REKLAMA