Top.Mail.Ru
Уведомления
Очистить все

[Решено] MPU9250 - как заставить правильно работать?

(@mihayk)
Level 3

Акселегиромагнетометр MPU9250 подключаю к STM32F103C8T6. 

Использую вот эту статью: https://www.programmersought.com/article/249311230684/

Код взял из статьи. 

Заработало, но как-то криво. Я не уверен в правильности показаний акслерометра и гироскопа, т.к. при чтении регистра mpu9250(mpu6500) WHO_AM_I получаю значение 0х70, а в коде прямо написано: expected to be 0x48. 

Магнетометр вообще выдает 0 данные. При чтении регистра ak8963 WHO_AM_I получаю значение 0х00, хотя в коде написано expected to be 0x48

Наверное на этапе инициализации что-то не то. Вот код инициализации: 

uint8_t MPU9250_Init(MPU9250 *mpu) {
	int Rez = -1;
	MPU9250_StructInit(mpu);

	mpu_w_reg(PWR_MGMT_1, (uint8_t) 0x80); // reset MPU9250, reg107
	HAL_Delay(10);
	mpu_w_reg(USER_CTRL, (uint8_t) 0x20); // enable I2C master mode, reg106
	mpu_w_reg(I2C_MST_CTRL, (uint8_t) 0x0D); // set I2C clock speed to 400kHz, reg36
	mpu_w_ak8963_reg(AK8963_CNTL1_REG, (uint8_t) 0x00); // set AK8963 to power down
	mpu_w_reg(PWR_MGMT_1, (uint8_t) 0x80); // reset MPU9250, Bit[7] will auto clear
	HAL_Delay(10);
	mpu_w_ak8963_reg(AK8963_CNTL2_REG, AK8963_CNTL2_SRST); // reset AK8963
	mpu_w_reg(PWR_MGMT_1, (uint8_t) 0x01); // select clock source
	mpu_w_reg(PWR_MGMT_2, (uint8_t) 0x00); // enable accel and gyro

	/* init GYRO and ACCEL */
	mpu_w_reg(SMPLRT_DIV, (uint8_t) 0x00); // SAMPLE_RATE= Internal_Sample_Rate / (1 + SMPLRT_DIV), Internal_Sample_Rate==8K
	mpu_w_reg(GYRO_CONFIG, (uint8_t) MPU9250_Gyro_Range_2000dps); // gyro full scale select
	mpu_w_reg(ACCEL_CONFIG, (uint8_t) MPU9250_Accel_Range_16G); // accel full scale select
	mpu_w_reg(ACCEL_CONFIG_2, (uint8_t) MPU9250_Accel_DLPFBandwidth_460);
	mpu_w_reg(CONFIG, (uint8_t) MPU9250_Gyro_DLPFBandwidth_250);
	/* init MAG */
	mpu_w_reg(USER_CTRL, (uint8_t) 0x20); // enable I2C master mode
	mpu_w_reg(I2C_MST_CTRL, (uint8_t) 0x0D); // set I2C clock speed to 400kHz, reg36
	mpu_w_ak8963_reg(AK8963_CNTL1_REG, (uint8_t) 0x00); // set AK8963 to power down
	//mpu_w_reg(INT_PIN_CFG, (uint8_t) 0x02);
	//mpu_w_ak8963_reg(INT_PIN_CFG, (uint8_t) 0x02);
	HAL_Delay(100);
	mpu_w_ak8963_reg(AK8963_CNTL1_REG, (uint8_t) 0x0f); // set AK8963 to Fuse ROM access mode
	HAL_Delay(100);
	mpu_w_ak8963_reg(AK8963_CNTL1_REG, (uint8_t) 0x00); // set AK8963 to power down
	HAL_Delay(100);
	mpu_w_ak8963_reg(AK8963_CNTL1_REG, (uint8_t) 0x16); // AK8963 working on Continuous measurement mode 2 & 16-bit output
	HAL_Delay(100);
	mpu_w_reg(PWR_MGMT_1, (uint8_t) 0x01); // select clock source
	mpu_r_ak8963_regs(MAG_XOUT_L, 7);
        Rez = 0;
	return Rez;
}

Кто знает в чем загвоздка? Подключаю по интерфейсу SPI

Цитата
Создатель темы Размещено : 13.10.2023 11:05
Aveal
(@aveal)
Top level Admin
От: @mihayk

т.к. при чтении регистра mpu9250(mpu6500) WHO_AM_I получаю значение 0х70, а в коде прямо написано: expected to be 0x48. 

Если это не работает, то дальше нет смысла смотреть показания итд итп. Может проблема в физическом подключении, может настройки SPI, первичная цель - добиться правильного коннекта, это как раз можно отследить по значению регистра, в котором заведомо фиксированное значение должно быть.

ОтветитьЦитата
Размещено : 13.10.2023 11:20
(@mihayk)
Level 3

@aveal 

В проекте, который я использую в качестве шпаргалки, зачем-то наряду с High Speed Clock подключили Low Speed Clock и не объяснили зачем? Мысль такая, что MPU может работать с LSE. Если это так, то как SPI переключить на LSE? Может глупость говорю, но что-то надо делать?

ОтветитьЦитата
Создатель темы Размещено : 14.10.2023 15:47
Aveal
(@aveal)
Top level Admin

@mihayk не, LSE для другого в принципе. Тут получается, что коммуникация то работает, видимо проблема исключительно с магнетометром... И первая мысль, что в самой библиотеке проблема.

ОтветитьЦитата
Размещено : 14.10.2023 17:27
(@leha_saveliy)
New member

Запись от: @mihayk

Заработало, но как-то криво. Я не уверен в правильности показаний акслерометра и гироскопа, т.к. при чтении регистра mpu9250(mpu6500) WHO_AM_I получаю значение 0х70, а в коде прямо написано: expected to be 0x48. 

Магнетометр вообще выдает 0 данные. При чтении регистра ak8963 WHO_AM_I получаю значение 0х00, хотя в коде написано expected to be 0x48

Кто знает в чем загвоздка? Подключаю по интерфейсу SPI

Хоть и слишком поздно, но у вас все правильно приходило на тот момент.
Акселерометр+гироскоп должен выдавать 0x70
Магнетометр                                             0x00

В официальном даташите все это прописано.

 

ОтветитьЦитата
Размещено : 02.02.2024 10:59
Поделиться: