Skocz do zawartości
delma199

Niepoprawny odczyt z akcelerometru

Pomocna odpowiedź

Napisano (edytowany)

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

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

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

Udostępnij ten post


Link to post
Share on other sites

Jak obrócę o 90 stopni, tak że oś Z akcelerometru jest prostopadła do linii pola to wskazuje ok 0,4G. Po obróceniu o 180 stopni ok 0,6G. Zakres ustawiony 2G.

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites

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ę 😉

Udostępnij ten post


Link to post
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!

Gość
Dołącz do dyskusji! Kliknij, aby zacząć 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...