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

[Atmega8][C] Problem z ADC

rever_c 28 Lis 2009 21:33 1397 4
REKLAMA
  • #1 7320857
    rever_c
    Poziom 10  
    Witam,

    Mój problem polega na tym, że za każdym razem przetwornik odczytuje zawsze taką samą wielkość (0xFF). Zmiana napięcia na wejście AC nie przynosi żadnych zmian. Mierzoną wartość otrzymuje z wyjścia potencjometru.
    Poniżej zamieszczam kod programu.

    
    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>
    #include <stdlib.h>
    
    void USART_Init( unsigned int ubrr)
    {
             /* Set baud rate */
             UBRRH = (unsigned char)(ubrr>>8);
             UBRRL = (unsigned char)ubrr;
             /* Enable receiver and transmitter */
             UCSRB = (1<<RXEN)|(1<<TXEN);
             /* Set frame format: 8data, 2stop bit */
             UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
    }
    
    void USART_Transmit( unsigned char data )
    {
            /* Wait for empty transmit buffer */
            while ( !( UCSRA & (1<<UDRE)) )
               ;
            /* Put data into buffer, sends the data */
            UDR = data;
    }
    		
    
    int main(void)
    {
    	
    	volatile unsigned int pomiar;
    	char buffer_n[5];
    		
    
           DDRB = 0x0F; // B1, B2 <- LED
           PORTB = 0x00;
    	
    	DDRC = 0x00;
    	PORTC = 0x00;
    	
    
    	ADMUX |= _BV(REFS0);// wewnetrzne zródło 
    	ADMUX |= _BV(REFS1);// napiecia referencyjnega		
    		
    
    	ADMUX |= _BV(ADLAR); // wyrownanie do lewej
    			
    	ADCSRA |= _BV(ADEN); //zezwolenie na konwersje
    
    	ADCSRA |= _BV(ADPS0);	 
    	ADCSRA |= _BV(ADPS1);	
    	
    	USART_Init(25);
    	
            while(1)
    	{
    		ADCSRA |= _BV(ADSC);		// Rozpoczęcie przetwarzania
    		while(bit_is_set(ADCSRA,ADSC))	// Oczekiwanie na zakończenie przetwarzania
    		{};	
    		
    		 pomiar = ADCH;
    		 utoa(pomiar, buffer_n, 10); 
    		
    	
    			USART_Transmit(buffer_n[0]);
    			USART_Transmit(buffer_n[1]);
    			USART_Transmit(buffer_n[2]);
    			USART_Transmit(buffer_n[3]);
    			//USART_Transmit(buffer_n[4]);
    			
    	
    		
    		_delay_ms(1000);
    		if(pomiar < 200)
    			PORTB |= _BV(2);
    		else
    			PORTB |= _BV(1);
    	
       }
    } 
    


    Wypada jeszcze wspomnieć trochę o sprzęcie:
    Napięcie z potencjometru (400 Ohm) dzielone jest na pół (dzielnik 3.9k/3.9k) a następnie podawane na wejście ADC0 procka.
    AGND -> do masy
    AREF -> przez kondensator 100n do masy
    AVcc -> +5V
    Do tego diody i układ RS232.

    Z góry dziękuje za pomoc.

    Rafał
  • REKLAMA
  • #2 7321104
    michalko12
    Specjalista - Mikrokontrolery
    A sprawdzałeś co jest wynikiem konwersji w przypadku gdy ustawisz MUX3..0 na 1110 (1.3V)?
  • REKLAMA
  • #3 7321130
    rever_c
    Poziom 10  
    Niestety, nic to nie pomaga. Sytuacja jest dokładnie taka sama.
  • REKLAMA
  • #4 7321450
    michalko12
    Specjalista - Mikrokontrolery
    rever_c napisał:
    Niestety, nic to nie pomaga. Sytuacja jest dokładnie taka sama.


    Sprawdź jakie jest napięcia na AREF, czy przypadkiem kondensator nie ma zwarcia.
  • #5 7322319
    rever_c
    Poziom 10  
    No tak... kondensator z odzysku . Dzięki wielkie za pomoc michalko !
REKLAMA