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

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.

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

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

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.