Skocz do zawartości

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
(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

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.

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

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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...