ICM20948 DMP代码详解(11)

news2024/9/20 20:44:27

接前一篇文章:ICM20948 DMP代码详解(10)

上一回讲解完了icm20948_sensor_setup函数的第1段代码,本回继续往下解析。为了便于理解和回顾,再次贴出icm20948_sensor_setup函数源码,在EMD-App\src\ICM20948\sensor.c中,如下:

int icm20948_sensor_setup(void){
	int rc;
	uint8_t i, whoami = 0xff;

	/*
	* Just get the whoami
	*/
	rc = inv_icm20948_get_whoami(&icm_device, &whoami);
	if (interface_is_SPI() == 0)	{		// If we're using I2C
		if (whoami == 0xff) {				// if whoami fails try the other I2C Address
			switch_I2C_to_revA();
			rc = inv_icm20948_get_whoami(&icm_device, &whoami);
		}
	}
	INV_MSG(INV_MSG_LEVEL_INFO, "ICM20948 WHOAMI value=0x%02x", whoami);

	/*
	* Check if WHOAMI value corresponds to any value from EXPECTED_WHOAMI array
	*/
	for(i = 0; i < sizeof(EXPECTED_WHOAMI)/sizeof(EXPECTED_WHOAMI[0]); ++i) {
		if(whoami == EXPECTED_WHOAMI[i]) {
			break;
		}
	}

	if(i == sizeof(EXPECTED_WHOAMI)/sizeof(EXPECTED_WHOAMI[0])) {
		INV_MSG(INV_MSG_LEVEL_ERROR, "Bad WHOAMI value. Got 0x%02x.", whoami);
		return rc;
	}

	/* Setup accel and gyro mounting matrix and associated angle for current board */
	inv_icm20948_init_matrix(&icm_device);

	/* set default power mode */
	INV_MSG(INV_MSG_LEVEL_VERBOSE, "Putting Icm20948 in sleep mode...");
	rc = inv_icm20948_initialize(&icm_device, dmp3_image, sizeof(dmp3_image));
	if (rc != 0) {
		INV_MSG(INV_MSG_LEVEL_ERROR, "Initialization failed. Error loading DMP3...");
		return rc;
	}

	/*
	* Configure and initialize the ICM20948 for normal use
	*/
	INV_MSG(INV_MSG_LEVEL_INFO, "Booting up icm20948...");

	/* Initialize auxiliary sensors */
	inv_icm20948_register_aux_compass(&icm_device, INV_ICM20948_COMPASS_ID_AK09916, AK0991x_DEFAULT_I2C_ADDR);
	rc = inv_icm20948_initialize_auxiliary(&icm_device);
	if (rc == -1) {
		INV_MSG(INV_MSG_LEVEL_ERROR, "Compass not detected...");
	}

	icm20948_apply_mounting_matrix();

	icm20948_set_fsr();

	/* re-initialize base state structure */
	inv_icm20948_init_structure(&icm_device);

	/* we should be good to go ! */
	INV_MSG(INV_MSG_LEVEL_VERBOSE, "We're good to go !");

	return 0;
}

接下来是第2段代码,代码片段如下:

	/* Setup accel and gyro mounting matrix and associated angle for current board */
	inv_icm20948_init_matrix(&icm_device);

这段代码根据说明,功能是为当前电路板设置加速度和陀螺仪安装(悬挂)矩阵以及相关角度。

inv_icm20948_init_matrix函数在EMD-Core\sources\Invn\Devices\Drivers\ICM20948\Icm20948Setup.c中,代码如下:

void inv_icm20948_init_matrix(struct inv_icm20948 *s)
{
	// initialize chip to body
	s->s_quat_chip_to_body[0] = (1L<<30);
	s->s_quat_chip_to_body[1] = 0;
	s->s_quat_chip_to_body[2] = 0;
	s->s_quat_chip_to_body[3] = 0;
	//initialize mounting matrix
	memset(s->mounting_matrix, 0, sizeof(s->mounting_matrix));
	s->mounting_matrix[0] = 1;
	s->mounting_matrix[4] = 1;
	s->mounting_matrix[8] = 1;
	//initialize soft iron matrix
	s->soft_iron_matrix[0] = (1L<<30);
	s->soft_iron_matrix[4] = (1L<<30);
	s->soft_iron_matrix[8] = (1L<<30);

	inv_icm20948_set_chip_to_body_axis_quaternion(s, s->mounting_matrix, 0.0);
}

函数参数struct inv_icm20948 *s对应的实参为&icm_device。icm_device前文已讲过,为EMD-App\src\ICM20948\sensor.c中的全局变量,之前已在inv_icm20948_reset_states函数中做过初始化。

参数类型struct inv_icm20948前文也讲到过,当时说后续使用的时候再针对于具体成员进行讲解。之前在inv_icm20948_register_aux_compass函数中用到了该结构中的struct inv_icm20948_secondary_states secondary_state成员和signed char mounting_matrix_secondary_compass[9]成员,这里用到的是signed char mounting_matrix[9]成员、long soft_iron_matrix[9]成员、以及long s_quat_chip_to_body[4]成员。

typedef struct inv_icm20948 {
	struct inv_icm20948_serif serif;
    ……
    /* data converter */
	long s_quat_chip_to_body[4];
    ……
	/* Icm20948Fifo usage */
	signed char mounting_matrix[9];
	signed char mounting_matrix_secondary_compass[9];
	long soft_iron_matrix[9];
    ……
} inv_icm20948_t;

inv_icm20948_set_chip_to_body_axis_quaternion函数在EMD-Core\sources\Invn\Devices\Drivers\ICM20948\Icm20948DataConverter.c中,代码如下:

void inv_icm20948_set_chip_to_body_axis_quaternion(struct inv_icm20948 *s, signed char *accel_gyro_matrix, float angle)
{
    int i;
    float rot[9];
    long qcb[4];
    long q_all[4];
    long q_adjust[4];

    for (i=0; i<9; i++)
        rot[i] = (float)accel_gyro_matrix[i];

    //convert Chip to Body transformation matrix to quaternion
    //inv_icm20948_convert_matrix_to_quat_fxp(rot, qcb);
	inv_rotation_to_quaternion(rot, qcb);

    //The quaterion generated is the inverse, take the inverse again.
    qcb[1] = -qcb[1];
    qcb[2] = -qcb[2];
    qcb[3] = -qcb[3];

    //now rotate by angle, negate angle to rotate other way
    q_adjust[0] = (long)((1L<<30) * cosf(-angle*(float)M_PI/180.f/2.f));
    q_adjust[1] = 0;
    q_adjust[2] = (long)((1L<<30) * sinf(-angle*(float)M_PI/180.f/2.f));
    q_adjust[3] = 0;
    invn_convert_quat_mult_fxp(q_adjust, qcb, q_all);
    inv_icm20948_set_chip_to_body(s, q_all);
}

对于该函数的解析,放在下一回中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2120972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文讲清投影,定义投影,投影栅格……

正确的空间坐标系是进行地理分析和处理的基础&#xff0c;投影是其中十分重要的概念。在ArcGIS系列的软件中关于投影的工具有四个&#xff0c;分别是定义投影、投影、投影栅格、批量投影。 你能分清他们吗&#xff1f; 如果不能。别急&#xff0c;下面我来给你一一介绍。 定…

虚拟机卡死问题

升级VMware至15.1.0版本解决Windows 10 1903下VMware Workstation 15 Pro虚拟机死机问题 如题&#xff0c;在几乎全新的Windows 10 1903操作系统下&#xff0c;在VMware Workstation中安装虚拟机经常出现死机现象&#xff0c;主要表现在以下两个方面&#xff1a; 创建好虚拟机后…

【Qt】按钮样式--按钮内部布局(调整按钮文本和图标放置在任意位置)

要求&#xff1a; 有一个按钮&#xff0c;要求按钮的右下角显示开关&#xff0c;点击切换开关状态 ps&#xff1a;注意&#xff0c;要求你添加完了之后&#xff0c;整个按钮的点击区域不变&#xff08;就是说&#xff0c;点击右下角的文本&#xff0c;也可以触发按钮的点击事件…

.net MAUI应用生命周期

.NET Multi-platform App UI (.NET MAUI) 应用通常有四种执行状态&#xff1a;“未运行”、“运行中”、“已停用”和“已停止”。 当应用从未运行状态转换为运行状态、从运行状态转换为已停用状态、从已停用状态转换为已停止状态、从已停止状态转换为运行状态&#xff0c;以及…

四七层如何获取客户端真实地址

7层代理会对报文进行重新封装&#xff0c;封装过程中可以通过增加XFF的header传递客户端IP。4层转发不会修改报文。在不修改HTTP报文前提下&#xff0c;前置补充代理信息, 格式: PROXY TCP 客户端IP 代理端IP 客户端端口 代理端端口。 nginx 七层代理配置&#xff1a; server …

JavaEE---Spring MVC(6)

如何创建一个spring项目呢 2. 3. 上述步骤结束后就ok了

PLM系统有哪些品牌推荐?国内不错的PLM厂商有哪些?

在当今快速变化的商业环境中&#xff0c;产品生命周期管理PLM系统已成为企业技术创新和管理创新的重要工具。PLM系统涵盖了产品从概念设计到市场推出、使用维护直至最终报废的整个生命周期&#xff0c;通过整合与产品相关的所有信息&#xff0c;助力企业实现高效、协同的产品开…

SuperMap GIS基础产品FAQ集锦(20240909)

一、SuperMap iDesktopX 问题1&#xff1a;镶嵌了一份550GB的DOM&#xff0c;双击加载到地图需要读取550GB的数据&#xff0c;耗时很久&#xff0c;加载到地图后一操作就需要再次读取&#xff0c;请问在不创建金字塔的情况下&#xff0c;如何把这份数据集保存到地图&#xff0…

【Hot100算法刷题集】哈希-03-最长连续序列(含排序、哈希、并查集法未正确使用哈希表导致算法效率降低的分析)

&#x1f3e0;关于专栏&#xff1a;专栏用于记录LeetCode中Hot100专题的所有题目 &#x1f3af;每日努力一点点&#xff0c;技术变化看得见 题目转载 题目描述 &#x1f512;link->题目跳转链接 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#x…

记录一下linux安装nginx,也是很简单了啦

1、下载nginx 官网下载nginx&#xff1a;http://nginx.org/&#xff0c;这里很简单&#xff0c;下载自己想要的版本就行&#xff0c;这里不罗嗦 1、进入home目录&#xff0c;建一个文件夹nginx rootroot ~]# cd /home rootroot home]# mkdir nginx rootroot home]# cd /nginx2…

什么是智慧箱变动环辅控系统?箱式变电站动环监控@卓振思众

智慧箱变动环辅控系统是一种智能化的辅助控制系统&#xff0c;主要用于对箱变&#xff08;箱式变电站&#xff09;等设备的运行环境进行监测和控制。以下是【卓振思众】智慧箱变动环辅控系统的主要功能特点&#xff1a; 一、环境监测方面温度监测&#xff1a;实时监测箱变内的温…

C#编写上位机通过OPC DA读取西门子PLC数据

Sync_RW 引用&#xff1a;Quick.OpcComRcw 文档中原程序会报错&#xff1a; 原因&#xff1a;需要在安装有Simatic NET V14的电脑上运行这个程序。 需要注释掉下面程序&#xff0c;否则读取时会无故障提示退出。 //finally里的程序要注释掉&#xff0c;否则一点击read按钮&a…

招商银行信用卡中心编程练习题题解(全)

第一天 递归:LeetCode21.合并两个有序链表 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode…

掌握生成树 (STP、RSTP、MSTP) 最详细配置,轻松优化网络

目录 一. 实验内容 STP配置实验 RSTP配置实验 MSTP配置实验 二. 1 ) STP配置实验 实验拓扑 ​编辑 实验配置 实验结果 2 ) RSTP配置实验 实验拓扑 实验配置 实验结果 3 ) MSTP配置实验 实验拓扑 实验配置 ​编辑 实验结果 三 实验总结 一. 实验内容 1) …

齐齐哈尔医院系统等保测评,安全防护全面升级

随着数字化时代的到来&#xff0c;医疗系统的信息化建设日益重要。然而&#xff0c;随之而来的数据安全问题也成为了医疗机构必须面对的重大挑战。为了保障患者信息的安全以及整个医疗系统的稳定运行&#xff0c;齐齐哈尔市某医院近期进行了等保&#xff08;等级保护&#xff0…

vue-router 之如何在模版(template)中获取路由配置信息?

vue-router 之如何在模版&#xff08;template&#xff09;中获取路由配置信息&#xff1f; 获取当前路由信息 在vue3 中&#xff0c;route通常使用useRoute()钩子获取的&#xff0c;**代表当前激活的路由信息。**它包含了与当前路由相关的数据&#xff0c;比如路径、参数、查…

小米对讲机2S申请业余无线电台执照

首先&#xff0c;小米对讲机2S是可以用来申请业余无线电台执照得&#xff0c;对讲机、电台在工信部能查到核准代码即可。 工业和信息化部政务服务平台 在小米对讲机2S底部有核准代码 2022FP10742&#xff0c;搜索后即可看到详细信息。 有一点矛盾的是&#xff0c;在这里查询到…

ML 系列:机器学习和深度学习的深层次总结(02)线性回归

ML 系列&#xff1a; — 简单线性回归 线性回归、损失函数、假设函数 图 1.线性回归 文章目录 一、说明二、线性回归2.1 简单线性回归2.2 回归中的损失函数 三、线性回归中的评估标准四、线性回归模型训练五、可视化5.1 假设函数5.2 计算训练模型的损失&#xff1a;5.3 绘制 H…

关于武汉芯景科技有限公司的IIC电平转换芯片XJ9517开发指南(兼容PCF9517)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、功能描述 1.电平转换 2.芯片使能/失能 EN 引脚为高电平有效&#xff0c;内部上拉至 VCC&#xff08;B&#xff09;&#xff0c;允许用户选择中继器何时有效。这可用于在上电时隔离行为不良的从机&#xff0c;直到…

饭店起名|饭店怎么起名有创意

给饭店起名是一个非常重要的任务&#xff0c;对于饭店的经营和吸引力都有着重要的影响。一个好的饭店名字能够吸引顾客、传达出饭店的风格和特色。在起名之前&#xff0c;我们需要先考虑一些因素&#xff0c;例如饭店的定位、菜品特色、目标顾客、所在地区等。下面是一些建议可…