接前一篇文章:ICM-20948芯片详解(9)
六、寄存器详解
2. USER BANK 0寄存器详述
(18)ACCEL_XOUT_H
(19)ACCEL_XOUT_L
ACCEL_XOUT_H和ACCEL_XOUT_L分别代表加速度计X-轴数据的高字节和低字节。要将加速度计的输出转换为加速度测量值,使用以下公式:
X_acceleration = ACCEL_XOUT/Accel_Sensitivity
(20)ACCEL_YOUT_H
(21)ACCEL_YOUT_L
ACCEL_YOUT_H和ACCEL_YOUT_L分别代表加速度计Y-轴数据的高字节和低字节。要将加速度计的输出转换为加速度测量值,使用以下公式:
Y_acceleration = ACCEL_YOUT/Accel_Sensitivity
(22)ACCEL_ZOUT_H
(23)ACCEL_ZOUT_L
ACCEL_ZOUT_H和ACCEL_ZOUT_L分别代表加速度计Z-轴数据的高字节和低字节。要将加速度计的输出转换为加速度测量值,需要使用以下公式:
Z_acceleration = ACCEL_ZOUT/Accel_Sensitivity
参考代码:
#define ICM20948_ACCEL_XOUT_H 0x2D
esp_err_t
icm20948_get_raw_acce(icm20948_handle_t sensor, icm20948_raw_acce_value_t *const raw_acce_value)
{
uint8_t data_rd[6];
esp_err_t ret = icm20948_read(sensor, ICM20948_ACCEL_XOUT_H, data_rd, sizeof(data_rd));
raw_acce_value->raw_acce_x = (int16_t)((data_rd[0] << 8) + (data_rd[1]));
raw_acce_value->raw_acce_y = (int16_t)((data_rd[2] << 8) + (data_rd[3]));
raw_acce_value->raw_acce_z = (int16_t)((data_rd[4] << 8) + (data_rd[5]));
return ret;
}
esp_err_t
icm20948_get_acce_sensitivity(icm20948_handle_t sensor, float *const acce_sensitivity)
{
esp_err_t ret;
icm20948_acce_fs_t acce_fs;
ret = icm20948_get_acce_fs(sensor, &acce_fs);
switch (acce_fs) {
case ACCE_FS_2G:
*acce_sensitivity = 16384;
break;
case ACCE_FS_4G:
*acce_sensitivity = 8192;
break;
case ACCE_FS_8G:
*acce_sensitivity = 4096;
break;
case ACCE_FS_16G:
*acce_sensitivity = 2048;
break;
default:
break;
}
return ret;
}
esp_err_t
icm20948_get_acce(icm20948_handle_t sensor, icm20948_acce_value_t *const acce_value)
{
esp_err_t ret;
float acce_sensitivity;
icm20948_raw_acce_value_t raw_acce;
ret = icm20948_get_acce_sensitivity(sensor, &acce_sensitivity);
if (ret != ESP_OK) {
return ret;
}
ret = icm20948_set_bank(sensor, 0);
if (ret != ESP_OK)
return ret;
ret = icm20948_get_raw_acce(sensor, &raw_acce);
if (ret != ESP_OK) {
return ret;
}
acce_value->acce_x = raw_acce.raw_acce_x / acce_sensitivity;
acce_value->acce_y = raw_acce.raw_acce_y / acce_sensitivity;
acce_value->acce_z = raw_acce.raw_acce_z / acce_sensitivity;
return ESP_OK;
}
(24)GYRO_XOUT_H
(25)GYRO_XOUT_L
GYRO_XOUT_H和GYRO_XOUT_L分别代表陀螺仪X-轴数据的高字节和低字节。要将陀螺仪的输出转换为角速度测量,使用以下公式:
X_angular_rate = GYRO_XOUT/Gyro_Sensitivity
(26)GYRO_YOUT_H
(27)GYRO_YOUT_L
GYRO_YOUT_H和GYRO_YOUT_L分别代表陀螺仪Y-轴数据的高字节和低字节。要将陀螺仪的输出转换为角速度测量,使用以下公式:
Y_angular_rate = GYRO_YOUT/Gyro_Sensitivity
(28)GYRO_ZOUT_H
(29)GYRO_YOUT_L
GYRO_ZOUT_H和GYRO_ZOUT_L分别代表陀螺仪Z-轴数据的高字节和低字节。要将陀螺仪的输出转换为角速度测量,使用以下公式:
Z_angular_rate = GYRO_ZOUT/Gyro_Sensitivity
参考代码:
#define ICM20948_GYRO_XOUT_H 0x33
esp_err_t
icm20948_get_gyro_sensitivity(icm20948_handle_t sensor, float *const gyro_sensitivity)
{
esp_err_t ret;
icm20948_gyro_fs_t gyro_fs;
ret = icm20948_get_gyro_fs(sensor, &gyro_fs);
if (ret != ESP_OK)
return ret;
switch (gyro_fs) {
case GYRO_FS_250DPS:
*gyro_sensitivity = 131;
break;
case GYRO_FS_500DPS:
*gyro_sensitivity = 65.5;
break;
case GYRO_FS_1000DPS:
*gyro_sensitivity = 32.8;
break;
case GYRO_FS_2000DPS:
*gyro_sensitivity = 16.4;
break;
default:
break;
}
return ret;
}
esp_err_t
icm20948_get_raw_gyro(icm20948_handle_t sensor, icm20948_raw_gyro_value_t *const raw_gyro_value)
{
uint8_t data_rd[6];
esp_err_t ret = icm20948_read(sensor, ICM20948_GYRO_XOUT_H, data_rd, sizeof(data_rd));
raw_gyro_value->raw_gyro_x = (int16_t)((data_rd[0] << 8) + (data_rd[1]));
raw_gyro_value->raw_gyro_y = (int16_t)((data_rd[2] << 8) + (data_rd[3]));
raw_gyro_value->raw_gyro_z = (int16_t)((data_rd[4] << 8) + (data_rd[5]));
return ret;
}
esp_err_t
icm20948_get_gyro(icm20948_handle_t sensor, icm20948_gyro_value_t *const gyro_value)
{
esp_err_t ret;
float gyro_sensitivity;
icm20948_raw_gyro_value_t raw_gyro;
ret = icm20948_get_gyro_sensitivity(sensor, &gyro_sensitivity);
if (ret != ESP_OK) {
return ret;
}
ret = icm20948_set_bank(sensor, 0);
if (ret != ESP_OK) {
return ret;
}
ret = icm20948_get_raw_gyro(sensor, &raw_gyro);
if (ret != ESP_OK) {
return ret;
}
gyro_value->gyro_x = raw_gyro.raw_gyro_x / gyro_sensitivity;
gyro_value->gyro_y = raw_gyro.raw_gyro_y / gyro_sensitivity;
gyro_value->gyro_z = raw_gyro.raw_gyro_z / gyro_sensitivity;
return ESP_OK;
}
USER BANK 0更多寄存器内容请看下回。