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

AVR + C ;Attiny 13A + akcelerometr MEMSIC MXA2500A

tenexxx 28 Lis 2011 16:43 1087 1
REKLAMA
  • #1 10193226
    tenexxx
    Poziom 1  
    Witam poszukuję pomocy z moim problemem avr + akcelerometr
    Proste urzadzenie a jednak nie dałem rady.
    Na początku powiem jak w zamyśla ma działać a potem jak działa :(
    1.Ja powino działać: Ma to mieć dwie diody po przechyleniu w lewo zapala się lewa dioda, a po przechyleniu w prawo zapala się druga.
    Fajnie by było jakby urządzenie było dośc czułe bo chciałbym wykrywać już najmniejsze przechylenia.

    2.Jak działa: Gdy przechylam dioda rzeczywiście się zapala(narazie mam tylko jedną:) ) ale nie jednoznacznie -> tak jakby wahania napięcia były tak duże że nie móżna ustalić konkretnej wartości.
    Czyli przechylam -> dioda zaczyna migać , migać szybciej aż świeci na stałe -> z tym że trzeba sporo wychylić już akcelerometr.


    Układ zrealizowałem na Attiny 13A oraz akcelerometrze MEMSIC MXA2500A. Dokonuje zwykłej konwersji ADC i porównuje z jakimś wynikiem.
    http://www.atmel.com/dyn/resources/prod_documents/doc8126.pdf
    http://www.cyfronika.com.pl/dok/mxa2500a.pdf

    Nie mam koncepcji co mógłbym zmienić , poprawić albo co źle zrobiłem.
    Proszę o pomoc tak żeby zaczęło działać jak powinno.
    poniżej kod jaki mam napisany w C.

    #include <avr/io.h>
    
    int main(void)
    {
    	unsigned int ADoutTemp;
    	
    	
    	
    	DDRB = (1<<DDB3)|(1<<DDB1)|(1<<DDB0); //wyjscia
    	DDRB &= ~(1 << DDB2);
    	ADMUX |= (0 << REFS0);
    	ADMUX |= (0 << MUX1) | (1<<MUX0);
    	ADCSRA|= (1<<ADEN);
    	ADCSRA |= (1<<ADSC);
    	
        while(1)
        {
            
    		
    		if ((ADCSRA & (1<<ADSC)) == 0)		// Koniec konwersji ADC
    		{	
    			ADoutTemp = ReadADC();   		// Zczytaj Wartość ADC				
    			
    			if (ADoutTemp >= 210){          // Porównaj do czegoś i zapal albo zgaś diode
    				PORTB &= ~(1 << PINB3);				
    			}
    			else
    			{				
    				PORTB |= (1 << PINB3);
    			}
    			
    		}	
        }
    }
    
    int ReadADC() 
     { 
           
    		ADMUX |= (0 << REFS0); // VCC as Reference 
    		ADMUX = (0 << MUX1) | (1<<MUX0);
    		ADCSRA |= (1 << ADSC); // Start Converstion 
    
    		while((ADCSRA & 0x40) !=0){}; //wait for conv complete 
    
    		return ADC; 
     }
    
    
    void Delay_ms(unsigned int t) 
    
       { 
        unsigned int i, aika; 
        aika = 140; 
    
        while(t--) 
         for(i = 0; i < aika; i++) 
    
            if(t==0) return; 
    
       }
  • REKLAMA
  • #2 10193951
    Brutus_gsm
    Poziom 25  
    Odczytuj kilka(naście razy) i uśredniaj wynik i dopiero potem steruj diodą.
REKLAMA