Aktywne Wpisy
Lambo994 +21
Wykopki to jednak mają kał zamiast mózgu ( ͡° ͜ʖ ͡°) Elita internetu promuje protest przeciwko kredytom 0 % organizowaną przez organizację o nazwie "Czerwoni", którzy na swoim fanpejdżu propagują tego typu kwiatki XDDD
Ja już jestem pewien, że jak coś wpasowałoby się w waszą narrację, to w jednym szeregu poszlibyście nawet ze zwolennikami nazizmu robiąc fikoła, że ktoś musi zorganizować protest ( ͡° ͜ʖ ͡
Ja już jestem pewien, że jak coś wpasowałoby się w waszą narrację, to w jednym szeregu poszlibyście nawet ze zwolennikami nazizmu robiąc fikoła, że ktoś musi zorganizować protest ( ͡° ͜ʖ ͡
gonzo91 +5
Otóż mam scalaka MPU-9150 z m.in 3-osiowym 16-bitowym akcelerometrem. Wynik pomiaru przyspieszenia zapisywany jest do dwóch rejestrów, w pierwszym są bity 15..8 a w drugim 7..0.
Odczyt za pomocą I2C i wysłanie na UART robię tak:
TWI_read_buf(MPU9150_ADDR, 0x3B, 2, read);
uart_putc(read[0]);
uart_putc(read[1]);
Następnie odbieram sobie dane w Javie i modyfikuję w taki sposób:
int byte1 = buffer[firstSampleIndex + 1];
int byte2 = buffer[firstSampleIndex + 2];
byte1 *= 256;
byte2 += 128;
Wartości byte1 i byte2 wyrzucam na wyjście, a po umieszczeniu w Excelu wygląda to tak:
http://i.imgur.com/UstOK2E.png
Niebieski wykres to najbardziej znaczące bity, zielony - mniej znaczące.
Jak mniej więcej widać, wartość najmniej znaczących bitów powinna się nałożyć w czasie tak, aby ich narastanie odbywało się w czasie pomiędzy skokami wynikającymi ze zmiany najbardziej znaczących bitów. A jest na wykresie - po złożeniu wygląda to bardzo dziwnie (poniższe zdjęcie jest dla innych danych, ale widać problem):
http://i.imgur.com/Rp1JCiZ.png
(ta czarna kreska przecinająca sygnał została dorysowana przeze mnie w Paincie)
Macie może pomysł, co z tym zrobić, jak to ugryźć? Z czego to może wynikać?
Zaczynam pewien projekt na koło naukowe i ugrzązłem na czymś takim.. :s
Link do arkuszu w Excelu jak by ktoś chciał:
https://www.dropbox.com/s/6haocp4if27wo26/Akcelerometr_1.xlsx?dl=0
Jak jest potrzeba, to mogę dostarczyć inne dane z akcelerometru. Proszę o pomoc :)
#elektronika #avr #mikrokontrolery #programowanie #sygnaly #teoriasygnalow #przetwarzaniesygnalow #czujniki
int byte1 = buffer[firstSampleIndex + 1];
int byte2 = buffer[firstSampleIndex + 2];
byte1 *= 256;
byte2 += 128;
``````
int readValue = byte1 + byte2;
Najpierw rzutuję sobie na inta, bo byte jest od -128 do 127. byte1 mnożę przez 256, czyli odpowiada to przesunięciu o 8 bitów w lewo. A do byte2 dodaję 128 żeby mieć wynik od 0 do 255 a nie od -128 do 127.
I sumuję. I wychodzi taki ślaczek jak tutaj na wykresie (to takie góra dół):
http://i.imgur.com/Rp1JCiZ.png
i tak jest, jak leży w miejscu to widać szum.
@andzej74:
To co widać na wykresie pojawia się jak obracam akcelerometrem tak aby jedna z osi (ta wyświetlana) pokryła się z kierunkiem przyspieszenia ziemskiego a później wracam do początku.
Analizowałem całe złożenie, ale kiepsko to wyglądało, więc wróciłem do poziomu dwóch bajtów i widzę tu problem.
W nocie katalogowej mam:
rejestr 1: ACCELXOUT[15:8]
rejestr 2: ACCELXOUT[7:0]
i opis:
These registers store the most recent accelerometer measurements.
Accelerometer measurements are written to these registers at the Sample Rate as defined in
Register 25.
interpretuję to jako gotowe przyspieszenie.
volatile uint8t x[6];
error=I2C1RecvBlock(&x, 6U, &snt); //do x zapisuje wsp. x y z po 2 bajty.
I2C1SendStop();
int16t new1=((short)(x[0]<<8)|(x[1]))>>4;
int16t new2=((short)(x[2]<<8)|(x[3]))>>4;
int16t new3=((short)(x[4]<<8)|(x[5]))>>4;
xyz[0]=new1;
xyz[1]=new2;
xyz[2]=new3;
////// potem gdzies w czelusciach programu przeliczenie na m/s^2
float Xg = ((float) xyz[0]) / SENSITIVITY2G;
float Yg = ((float) xyz[1]) / SENSITIVITY2G;
float
@Visher: I dokładnie tak to masz interpretować, rej2 jest młodszym bajtem wartości, a rej1 starszym. Cała wartość ma postać ((uint16)rej1)*256 + rej2.
A ty dodajesz jakieś dzikie 128 do młodszego bajtu, czyli przesuwasz go na dzień dobry o połowę w górę. I dokładnie to widać na wykresie (to, co ci nie pasuje - przesunięcie).
Siadasz, czytasz, robisz, jeszcze raz czytasz, robisz, , DZIAŁA
@Visher: To, że odczytujesz bajt i umieszczasz go w zmiennej o typie "int" nie oznacza, że będzie ona miała wartość od -128 do 127. Będzie ona miała wartość dokładnie taką, jaką ma odczytany bajt, czyli z zakresu 0 .. 255.
fajnie że się wyżyliście.
Zapomniałem o jednej rzeczy, tu mój błąd. Zapomniałem dopisać, że przestawiłem akcelerometr na mniejszą czułość - większy zakres pomiarowy.
Bo problemu ze złożeniem przy podstawowym zakresie pomiarowym to nie miałem, może już nawet przez ten czas zapomniałem o tym. Dwa dni temu napisałem:
int readValue = (byte1<<8) + byte2;
i to działało, ale po przestawieniu na większy zakres pomiarowy pojawia się problem
@Visher: Na jaki dokładnie zakres czułości go ustawiłeś?
TWIwritebyte(MPU9150ADDR, 0x1c, 0b00011001);