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.
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ą
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;
}