Skocz do zawartości

Niepoprawny odczyt z akcelerometru


delma199

Pomocna odpowiedź

Siemka wszystkim. Mam takowy problemik, że odczytując dane z akcelerometru odczyt na osi Z nie wskazuje realnej wartości przyśpieszenia. Na obrazku mamy odczyty z poszczególnych osi (w jednostkach G). Widać że na osi Z jest odczyt przekraczający 1G. Gdy obrócę sensor o 180 stopni tak aby oś Z zmieniła zwrot to odczyt na niej wynosi poniżej 1G. Wynika z tego jakby do ozi Z był dodany pewien offset. Czujnik to MPU 9255. Z czego to może wynikać i jak temu zaradzić? Poniżej wstawiam też kodzik. Dzięki za pomoc😀

 //settings accelerometer and gyroscope
	 HAL_I2C_Mem_Write(&i2c, 0xD0, 27, I2C_MEMADD_SIZE_8BIT, &Settings,1,1000);
	 HAL_I2C_Mem_Write(&i2c, 0xD0, 28, I2C_MEMADD_SIZE_8BIT, &Settings,1,1000);
	 HAL_I2C_Mem_Write(&i2c, 0xD0, 55, I2C_MEMADD_SIZE_8BIT, &BypassEnable,1,1000);
	 //Power Down mode
	 HAL_I2C_Mem_Write(&i2c, 0x18, 0x0A, I2C_MEMADD_SIZE_8BIT, &SettingsM,1,1000);
	 HAL_Delay(100);
	 //16 bit output mode 2
	 HAL_I2C_Mem_Write(&i2c, 0x18, 0x0A, I2C_MEMADD_SIZE_8BIT, &SettingsL,1,1000);	//16 bit 8Hz



	 while (1) {
		 	 //A X
		     HAL_I2C_Mem_Read(&i2c, 0xD0, 59, I2C_MEMADD_SIZE_8BIT, &DAHx,1,100);
		     HAL_I2C_Mem_Read(&i2c, 0xD0, 60, I2C_MEMADD_SIZE_8BIT, &DALx,1,100);
		     //A Y
		     HAL_I2C_Mem_Read(&i2c, 0xD0, 61, I2C_MEMADD_SIZE_8BIT, &DAHy,1,100);
		     HAL_I2C_Mem_Read(&i2c, 0xD0, 62, I2C_MEMADD_SIZE_8BIT, &DALy,1,100);
		     //A Z
		     HAL_I2C_Mem_Read(&i2c, 0xD0, 63, I2C_MEMADD_SIZE_8BIT, &DAHz,1,100);
		     HAL_I2C_Mem_Read(&i2c, 0xD0, 64, I2C_MEMADD_SIZE_8BIT, &DALz,1,100);
		     //G X
		     HAL_I2C_Mem_Read(&i2c, 0xD0, 67, I2C_MEMADD_SIZE_8BIT, &DGHx,1,100);
		     HAL_I2C_Mem_Read(&i2c, 0xD0, 68, I2C_MEMADD_SIZE_8BIT, &DGLx,1,100);
		     //G Y
		     HAL_I2C_Mem_Read(&i2c, 0xD0, 69, I2C_MEMADD_SIZE_8BIT, &DGHy,1,100);
		     HAL_I2C_Mem_Read(&i2c, 0xD0, 70, I2C_MEMADD_SIZE_8BIT, &DGLy,1,100);
		     //G Z
		     HAL_I2C_Mem_Read(&i2c, 0xD0, 71, I2C_MEMADD_SIZE_8BIT, &DGHz,1,100);
		     HAL_I2C_Mem_Read(&i2c, 0xD0, 72, I2C_MEMADD_SIZE_8BIT, &DGLz,1,100);

		do
		    {
		        HAL_I2C_Mem_Read(&i2c, 0x18, 0x02, I2C_MEMADD_SIZE_8BIT, &ST1,1,100);
		    }
		    while (!(ST1&0x01));

		    //0x0C - adress AK8963, 0x03-0x08 => HLx-HHz
		    HAL_I2C_Mem_Read(&i2c, 0x18, 0x03, I2C_MEMADD_SIZE_8BIT, &HLx,1,100);
		    HAL_I2C_Mem_Read(&i2c, 0x18, 0x04, I2C_MEMADD_SIZE_8BIT, &HHx,1,100);
		    HAL_I2C_Mem_Read(&i2c, 0x18, 0x05, I2C_MEMADD_SIZE_8BIT, &HLy,1,100);
		    HAL_I2C_Mem_Read(&i2c, 0x18, 0x06, I2C_MEMADD_SIZE_8BIT, &HHy,1,100);
		    HAL_I2C_Mem_Read(&i2c, 0x18, 0x07, I2C_MEMADD_SIZE_8BIT, &HLz,1,100);
		    HAL_I2C_Mem_Read(&i2c, 0x18, 0x08, I2C_MEMADD_SIZE_8BIT, &HHz,1,100);
		    HAL_I2C_Mem_Read(&i2c, 0x18, 0x09, I2C_MEMADD_SIZE_8BIT, &H,1,100);

		    //accelerometer
		     Ax = (int16_t)(DAHx << 8 | DALx);
		     Ay = (int16_t)(DAHy << 8 | DALy);
		     Az = (int16_t)(DAHz << 8 | DALz);
	       //gyroscope
		     Gx = (int16_t)(DGHx << 8 | DGLx);
		     Gy = (int16_t)(DGHy << 8 | DGLy);
		     Gz = (int16_t)(DGHz << 8 | DGLz);
	      //magnetometer
	         Hx= (int16_t)(HHx << 8 | HLx);
	         Hy= (int16_t)(HHy << 8 | HLy);
	         Hz= (int16_t)(HHz << 8 | HLz);

	         Ax_g = (float)Ax/16384.0;
	         Ay_g = (float)Ay/16384.0;
	         Az_g = (float)Az/16384.0;
	         Gx_g = (float)Gx/131.0;
             Gy_g = (float)Gy/131.0;
             Gz_g = (float)Gz/131.0;


		    printf("Ax = %f   Ay = %f   Az = %f   Gx = %f   Gy = %f   Gz = %f\n", Ax_g, Ay_g, Az_g, Gx_g, Gy_g, Gz_g);
		 HAL_Delay(200);
	 }

 

problemik.jpg

Edytowano przez delma199
Link do komentarza
Share on other sites

A jak obrócisz o 90? Uwzględniasz w rozważaniach że 1G to przyspieszenie ziemskie, nie? 😉 Jaka jest ta wartość po obróceniu o 180? Jaki zakres ustawiłeś, 8G?

Edytowano przez moderin
Link do komentarza
Share on other sites

Dziwna sprawa, jakby to był stały offset, to po obróceniu o 180 stopni powinno być mniej niż po obróceniu o 90. Inne osie działają? W sensie jest-1G i 1G jak je obracasz? Daj znać jak coś wymyślisz, sam ciekaw jestem

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Jest mniej. To 0,6G podałem jako wartość bezwzględną. Stricte liczbowo pokazuje -0,6G. Pozostałe osie w porządku. Zamieniałem czujniki(mam kilka takich samych) i zawsze występuje to przekłamanie na osi Z tylko o różnych wartościach. Jak znajdę rozwiązanie to napiszę 😉

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.