ICM-20948芯片详解(10)

接前一篇文章: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更多寄存器内容请看下回。

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝天居士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值