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

ADC przetwarzanie dwóch kanałów, wzajemne zakłócenia

pawelecW 05 Mar 2009 09:25 1448 5
  • #1 6238558
    pawelecW
    Poziom 10  
    Witam
    problem jest następujący:
    Dokonuję przetwarzania sygnałów na dwóch kanałach, osobno każdy działa właściwie, jeżeli uruchomię dwa kanały, to wynik przetwarzania pierwszego jest zakłócany przez kanał drugi tzn do wartości pierwszego jest dodawana wartość drugiego,
    
    SIGNAL (SIG_OUTPUT_COMPARE1A)				
    {			
    	wynik=0;
    	pomiar=0;
    	i=20;
    	ADCSRA |=_BV(ADSC);				// Rozpoczęcie przetwarzania
    	while(i)
    	{	
    		ADMUX |=_BV(0);					// wybranie kanału - 1
    		while(bit_is_set(ADCSRA,ADSC))	// Oczekiwanie na zakończenie przetwarzania
    		{};	
    		pomiar = (ADCL|(ADCH<<8));	// Zapisanie  wyniku konwersji do zmiennej "pomiar"
    		wynik=wynik+pomiar;		// Sumowanie wyników w serii
    		i--;
    	}
    		wynik=(wynik/20);
    	
    	{
    		ADMUX |=_BV(0);				
    		ADMUX |=_BV(1);
    		while(bit_is_set(ADCSRA,ADSC))	// Oczekiwanie na zakończenie przetwarzania
    		{};	
    		pomiar1 = (ADCL|(ADCH<<8));	// Zapisanie konwersji do zmiennej "pomiar1"
    		
    	}
    	
    		
    	PORT_F |= _BV(4);		// Ustawienie znacznika zakończenia pomiaru	
    	if (bit_is_set(PIN_F, 4))    	// Jeśli pomiar jest zakończony
    		{
    		PORT_F &=~_BV(4);	// Zerowanie znacznika zakończenia pomiaru
    		}
    }
    


    Proszę o jakieś sugestie

    Poprawiłem tytuł - ortografia.
    [zumek]
  • #2 6238690
    Balu
    Poziom 38  
    Pętle w przerwaniach to zuo!
    Z ciekawości wynik i pomiar są globalne? (i jak definiowane).
    Poza tym, upewnij się czy w dobrej kolejności kompilator odczytuje rejestry przetwornika - jak odczytasz odwrotnie, to nie skasuje sie przetwornik. Tyle mi przyszlo do glowy teraz:)
  • #3 6238762
    pawelecW
    Poziom 10  
    zmienne są globalne
    deklarowane jako:

    volatile unsigned int pomiar,wynik

    ponieważ każdy kanał osobno działa własciwie, więc przypuszczam że właśnie po przetworzeniu drugiego kanału pozostają jakieś smieci. Może jakiś pomysł jak je usunąć ? może jakieś inne rozwiązanie?
  • #5 6253403
    Tymek92
    Poziom 10  
    Przepraszam że się wtrącę w temat ale:
    jestem początkujący w elektronice(kilka prostych programów już napisałem) i szykuję się do zrobienia termometru na wyświetlaczy LED. Tylko nie wiem jak się odczytuje napięcie w atmega8 (chodzi o kod programu w C )wydaje mi się że robi się przez chyba PORTC. Jeżeli mógłby ktoś wyjaśnić jak się to podłącza i jak program wygląda? (taki prosty że odczytuje napięcie i zapisuje jego wartość w zmiennej.
  • #6 6256642
    pawelecW
    Poziom 10  
    Problem został rozwiązany, wystarczyło na końcu procedury przetwarzania drugiego kanału ponownie włączyć pierwszy kanał

    ADMUX &=~_BV(1);
REKLAMA