村田 IMU SCC2000系列芯片驱动

2023-05-16

村田 IMU SCC2000系列芯片驱动

文章目录

    • 村田 IMU SCC2000系列芯片驱动
      • 一、总体特点
      • 二、启动时序和逻辑
      • 三、SPI通信和数据读取
      • 四、数据处理

一、总体特点

1、本次具体的型号是村田SCC2130系,IMU有1轴(x)陀螺仪、三轴加速度计和温度计,测量范围陀螺仪±125°/s,加速度±6,温度-50到150。

image-20220313125718602

2、高稳定性,广泛的自诊断等安全保护,因此主要应用都是在一些汽车工业级的场景。

3、32位四线SPI,最大8MHZ通信速度,有CRC校验。

4、硬件针脚图如下,实际上硬件IMU比较大针脚太多,成本高。

image-20220313125128526

二、启动时序和逻辑

1、启动时序也就是驱动IMU初始化,主要是根据状态机的图来实现整个IMU的驱动,本次MCU是采用国产芯片

2、硬件上电复位或者软件复位IO引脚上拉后需要等待20ms后在总状态寄存器设置输出滤波,接着根据两种不同的滤波等待不同的时间,然后需要清除所有的状态寄存器状态,读总状态寄存器看RS位返回状态。正常状态后才可以正常读取IMU数据。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TALJ1CQP-1647160100539)(C:/Users/曾伟荣/AppData/Roaming/Typora/typora-user-images/image-20220313130839320.png)]

3、RS的状态

image-20220313131640775

4、驱动代码

uint16_t HW_MURATA_INIT_TIM_Cnt_u16 = 0;
uint8_t HW_MURATA_INIT_OK_Flag_u8 = 0xEE;
uint8_t HW_MURATA_INIT_TIM_stopFlag_u8 = 0xEE;
void FUN_HW_Murata_IMU_Init()
{
	uint8_t S_agspi_rsdata_u8;
	if(HW_MURATA_INIT_TIM_stopFlag_u8 == 0xEE)
	{
		HW_MURATA_INIT_TIM_Cnt_u16 ++;   // 10ms计数周期
	}
	if(HW_MURATA_INIT_TIM_Cnt_u16 < 2)
	{
		Murata_IMU_SendAndRead(Murata_IMU_HARD_RST);
	}
	else if(HW_MURATA_INIT_TIM_Cnt_u16 < 5)
	{
		Murata_IMU_SendAndRead(Murata_IMU_Status_Summary_10HZ);
	}
	else if(HW_MURATA_INIT_TIM_Cnt_u16 < 10)
	{
		if(HW_MURATA_INIT_OK_Flag_u8 == 0xEE)
		{
			Murata_IMU_SendAndRead(Murata_IMU_RATE_STATUS1);
			Murata_IMU_SendAndRead(Murata_IMU_RATE_STATUS2);
			Murata_IMU_SendAndRead(Murata_IMU_ACC_STATUS);
			Murata_IMU_SendAndRead(Murata_IMU_Common_Status);
			Murata_IMU_SendAndRead(Murata_IMU_Status_Summary);
			StartupOK = TRUE;
			Response_StatSum = 	Murata_IMU_SendAndRead(Murata_IMU_Status_Summary);
			S_agspi_rsdata_u8 = (uint8_t)((Response_StatSum & Murata_IMU_STATUS_MASK) >> 24);
			if(S_agspi_rsdata_u8 != 1)
			{
				StartupOK = FALSE;
			}
			if(!StartupOK)
			{
				Response_RateState1 =Murata_IMU_SendAndRead(Murata_IMU_RATE_STATUS1);
				Response_RateState2 = Murata_IMU_SendAndRead(Murata_IMU_RATE_STATUS2);
				Response_AccStat = Murata_IMU_SendAndRead(Murata_IMU_ACC_STATUS);
				Response_ComStat1 = Murata_IMU_SendAndRead(Murata_IMU_Common_Status);
			}
			HW_MURATA_INIT_OK_Flag_u8 = 0xAA;
		}
	}
	else
	{
		HW_MURATA_INIT_TIM_Cnt_u16 = 0xEEEB;
		HW_MURATA_INIT_TIM_stopFlag_u8 = 0xAA;
	}
}

三、SPI通信和数据读取

1、32位SPI,还是OUT-OFF模式,下一帧返回上一帧的结果,而我是直接连着发两帧相同的命令这样回传处理就很方便。

image-20220313151231223

2、MOSI的读写命令前8位为寄存器地址中间16位为数据,最后八位为CRC校验。

image-20220313151518819

3、官方手册已经给了具体的相关寄存器读写命令可以直接用

image-20220313151945201

4、读取数据代码,本次MCU是国产的芯片上海芯旺微的KF系列,环境啥都还挺好搭建,上手也挺容易。

uint32_t Murata_IMU_SendAndRead(uint32_t data)
{
	uint32_t receive_data;
	SPI_I2S_SendData32(SPI0_COM,data);
	delay_us(2);
	SPI_I2S_SendData32(SPI0_COM,data);
	delay_us(2);
	receive_data = SPI_I2S_ReceiveData(SPI0_COM);

	return receive_data;
}
/*原始数据读取,读取到的数据是补码形式*/
/*x轴角速度*/
x_rate = Murata_IMU_SendAndRead(Murata_IMU_X_RATE);
/*x轴加速度*/
x_acc = Murata_IMU_SendAndRead(Murata_IMU_X_ACC);
/*y轴加速度*/
y_acc = Murata_IMU_SendAndRead(Murata_IMU_Y_ACC);
/*z轴加速度*/
z_acc = Murata_IMU_SendAndRead(Murata_IMU_Z_ACC);
/*温度值*/
temp  = Murata_IMU_SendAndRead(Murata_IMU_TEMP);
/*状态读取*/
rate_status1 = Murata_IMU_SendAndRead(Murata_IMU_RATE_STATUS1);
rate_status2 = Murata_IMU_SendAndRead(Murata_IMU_RATE_STATUS2);
acc_status = Murata_IMU_SendAndRead(Murata_IMU_ACC_STATUS);
common_status = Murata_IMU_SendAndRead(Murata_IMU_Common_Status);
summary_status = Murata_IMU_SendAndRead(Murata_IMU_Status_Summary);

四、数据处理

1、SPI读取到的数据是一个二进制补码,需要我们对数据处理转化为原码。手册上也有处理方法。

2、博世SMI810一样也是原始数据转化为原码后除以sensitivity。

image-20220313161706765

3、数据处理代码

/*数据处理*/
/*x轴角速度处理*/
x_rate_origin = (int32_t)(Murata_IMU_DataProcess(x_rate,x_rate));
S_SPI_yawrate_s16 =(int32_t)(x_rate_origin*2);
/*x,y,z轴加速度处理*/
x_acc_origin = (int32_t)(Murata_IMU_DataProcess(x_acc,x_acc));
S_SPI_accx_s16 = (int32_t)(x_acc_origin*100/1962);

y_acc_origin = (int32_t)(Murata_IMU_DataProcess(y_acc,y_acc));
S_SPI_accy_s16 = (int32_t)(y_acc_origin*100/1962);

z_acc_origin = (int32_t)(Murata_IMU_DataProcess(z_acc,z_acc));
S_SPI_accz_s16 = (int32_t)(z_acc_origin*100/1962);
/*温度处理*/
S_SPI_temperture_s16_last =(int32_t)(Murata_IMU_DataProcess(temp,temp));
S_SPI_temperture_s16 = (int32_t)((S_SPI_temperture_s16_last * 10/ 147 + 60));
uint16_t Murata_IMU_DataProcess(uint32_t input_data,uint32_t input_status)
{
	uint16_t output_data;
	uint16_t output_status;
	uint16_t output_first;
	/*数据处理*/
	output_data = (uint16_t)((input_data & Murata_IMU_DATA_MASK ) >> 8);
	output_first = output_data >> 15;
	if(output_first == 1)
	{
		/*为负数,取反加+1到原码,但输出的uint型仍为正数*/
		output_data = (~output_data) + 1;
		/*转化为负数*/
		output_data = (int16_t)(output_data & 0xFFFF);
		output_data *= -1;
	}
	else
	{
		/*为正数,直接取反码为原码*/
		output_data = output_data;
	}
	/*状态冗余有效性判断*/
	output_status = (uint8_t)((input_status & Murata_IMU_STATUS_MASK)>>24);
	if (output_status != 1)
	{
		spi_imu_status_flag = 1;
		output_data = 0xFFFF;
	}
	return output_data;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

村田 IMU SCC2000系列芯片驱动 的相关文章

随机推荐

  • 笔记本电脑控制树莓派,树莓派获取IP地址,连接笔记本电脑屏幕

    树莓派使用需要连接显示屏配备键盘和鼠标 xff0c 为了方便实用可以直接连接到自己的笔记本电脑上 xff0c 主要步骤如下 xff1a 第一步 xff1a 获取树莓派IP地址 首先进行树莓派的系统烧录 xff0c 烧录过程可以查看网上教程
  • c++类和对象---继承

    继承是面向对象三大特性之一 1 继承的基本语法 语法 xff1a class 子类名 xff1a 继承方式 父类名 子类 也叫 派生类 父类 也叫 基类 class basepage public void header cout lt l
  • Dockerfile详解

    Dockerfile 文章目录 基本结构指令详解FROMRUNLABEL MAINTAINERCOPYADDCMDENTRYPOINTENVARGVOLUMEEXPOSEWORKDIRUSERHEALTHCHECKONBUILD 创建镜像上
  • 接口和实现类

    接口 生活中有很多接口 xff0c 例如 xff1a USB接口 电源接口 Type c接口等等 xff1b 一个接口 xff0c 对应一个接口相应的设备 程序中的接口 xff1a 一种标准 xff0c 一种规范 xff0c 一系列抽象方法
  • 程序员必备的基本算法:递归详解

    前言 递归是一种非常重要的算法思想 xff0c 无论你是前端开发 xff0c 还是后端开发 xff0c 都需要掌握它 在日常工作中 xff0c 统计文件夹大小 xff0c 解析xml文件等等 xff0c 都需要用到递归算法 它太基础太重要了
  • lwip 基于select方式实现的tcp简易服务器

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • 我是歌手Java实现

    span class token comment AbstractSinger java span span class token keyword package span span class token namespace cn sp
  • 【亲测有效】树莓派4B安装realsense(Intel深度摄像头)

    第一步尝试通过pip下载 xff0c 发现不能下载 pip span class token function install span pyrealsense2 pip中的pyrealsense2只能下载给X86结构的计算机 xff0c
  • 驼峰规则

    驼峰规则包含两种 xff1a 大驼峰和小驼峰 大驼峰 指我们在命名的时候往往采用第一个字母大写 xff0c 比如Animal 这种命名形式常用于类名或函数名 小驼峰 指我们在命名是往往采用中间字母大写 xff0c 比如setName 这种命
  • 八皇后问题(回溯法)

    目录 什么是八皇后 八皇后问题怎么解决 xff1f 什么是回溯法 回溯法的模板 八皇后问题的核心代码 判断皇后位置是否可行 总体实现代码 每日一句 xff1a 种一棵树的最好时间是十年前 xff0c 其次是现在 什么是八皇后 八皇后问题 x
  • 淘宝搜索页面爬取数据

    淘宝搜索页面爬取数据 1 首先导入库 span class token keyword import span requests span class token keyword import span json 2 主函数 span cl
  • Android进程保活 --- 守护进程(code)

    1 守护进程 xff1a 一个在后台运行并且不受任何终端控制的进程 可以用来给其他应用拉起 xff0c 保活 import android app Service import android content ComponentName i
  • 基于树莓派的追光系统(python)

    目录 前言 一 材料 二 硬件 控制逻辑 1 主设备的准备 1 启用树莓派的i2c设备 2 安装python smbus 2 从设备的准备 1 BH1750 2 L298N驱动芯片 3 云台的准备 1 增加电机固定模块 2 增加bh1750
  • pytorch优化器(optimizer)中params参数详细介绍

    这里先给出使用的一个小型网络 xff08 自己瞎定义的一个网络 xff09 xff0c 后面使用的model就是这里定义的一个小型的网络 xff1a 定义网络 class Test nn Module def init self super
  • [下面的框架可能不正确和/或缺失,没有为 ntdll.dll 加载符号]

    96 96 96 cpp 在这里插入代码片 之前老师出现这些问题 之后我改了realse模式 依旧不行 我经过一夜的思考 xff0c 发现这个和我的代码 没有关系 我修改了程序内部的一些char 然后重新启动realse 就没有这个了 在这
  • 操作系统-处理机调度、进程调度的时机、切换与过程、方式、调度算法的评价指标、调度算法

    文章目录 基本概念三个层次高级调度 作业调度 中级调度 内存调度 低级调度 进程调度 三层调度的联系 对比补充知识时机什么时候需要进程调度什么时候不能进行进程调度临界区与内核程序临界区 切换与过程 34 狭义的调度 34 与 34 切换 3
  • QGC地面站配置PX4Flow光流传感器

    打开地面站 xff0c 进入到参数设置里面 xff0c 查询 EKF2 AID MASK xff0c 在px4中使能px4flow xff0c 设置为2即关闭GPS打开光流 2 查询 SENS EN MB12XX 在px4中使能px4flo
  • Git如何创建一条分支,并且进行分支的切换

    核心指令 xff1a git checkout xx 下面讲解怎么创建 可以看到 xff0c 我们当前的处于master分支 输入 git branch dev xff08 创建一个dev分支 xff09 这样已经是创建成功了 可以输入gi
  • Bosch SMI810 IMU传感器芯片驱动

    Bosch SMI810 IMU传感器芯片驱动 文章目录 Bosch SMI810 IMU传感器芯片驱动一 总体特点二 SPI通信三 数据处理四 寄存器设置和代码编写 一 总体特点 1 smi8xx家族的传感器分为 xff0c 陀螺仪 43
  • 村田 IMU SCC2000系列芯片驱动

    村田 IMU SCC2000系列芯片驱动 文章目录 村田 IMU SCC2000系列芯片驱动一 总体特点二 启动时序和逻辑三 SPI通信和数据读取四 数据处理 一 总体特点 1 本次具体的型号是村田SCC2130系 xff0c IMU有1轴