IMU模块ADIS16448调试过程及经验总结

2023-05-16

        ADIS16448集成了陀螺仪、加速度计、磁力计及气压计为一体的IMU模块,我在这里总结下此模块的使用及调试经验。

        首先说下硬件环境:MCU为TMS320C6722(DSP);IMU为ADIS16448;数据传输接口为SPI通信,五线连接:SIMO,SOMI,CLK,CS(片选),第五根线为IMU数据准备好引脚。

        ADIS16448模块的使用相对较为简单,手册也只有24页的长度,相对DSP及ublox的手册阅读工作量来说小得多。

一、数据读取方式

        ADIS16448提供了两种方式将数据传输给MCU。方式一为single register read,也就是由MCU向ADIS16448发送获取数据的指令。比如想获取加速度计x轴方向的数据,就发送一条读取加速度计x轴方向的数据地址的指令,这样ADIS16448就会向MCU返回加速度计x轴方向的数据。方式二为Burst Read,指ADIS16448定周期准备好数据,一旦准备好数据就将上面提到的数据准备好引脚置高(也就是产生一个高电位脉冲)从而使MCU产生外部中断,在外部中断中接收ADIS16448发送过来的数据,这些数据包含了陀螺仪、加速度计、磁力计及气压计的数据。

        从上面的简述中可以分析得知,single register read模式读取数据的主动性由MCU掌控,MCU可以在任意时间读取任意传感器的数据,但是只能每次只能读取一个传感器的单方向数据;Burst Read模式读取数据的主动性在于ADIS16448,因为IMU只有将数据准备好,向MCU发送脉冲信号使其产生外部中断,MCU才能接收数据,但是好处是将所有传感器的数据一次全部传送过来。

二、通信设置

        1.对于SPI的设置,ADIS16448做了规定:

        

        这些设置对于ADIS16448来说是不可编程的,所以在编写MCU方的SPI驱动时要注意。

        2.这里有一个注意事项:

        

        注意到Figure 3中有个tSTALL,其叫做Stall Time。这个Stall Time很重要。当用方式一single register read模式读取数据时,Stall Time就是MCU向IMU发送读取控制指令的最小间隔时间。举个例子,我想获取IMU的加速度计x轴和y轴的数据,若用single register read模式读取数据,MCU需要向IMU发送两个读取指令,这个Stall Time就是两条读取指令的最小间隔时间。若不加Stall Time,读出来的数据会有问题。而用Burst Read模式读取数据的话,因为其传感器数据为连续发送,所以不存在Stall Time,手册上也给了相关说明:

        

       3.读取指令手册给了相关说明:

        

        DIN对应的是SIMO引脚,DOUT对应的是SOMI引脚。MCU对于IMU有两个操作:读操作和写操作。通过DIN的的第一位来分辨为读操作还是写操作,0为读操作,1为写操作。当为读操作时,A6-A0为所要读取寄存器的地址,此时DC7-DC0写为0;当为写操作时,A6-A0为所要写入寄存器的地址,此时DC7-DC0为写入寄存器的数据。

        4.还有一点需要注意,因为SPI为全双工同步通信,所以,在接收数据的同时也要发送数据。

        

        上面的时序图表明,所要读取的数据与发送的指令总是错开一个十六位,这是因为SPI为全双工同步通信,而IMU处理数据需要一定时间。也就是,当你发送0x0400时,返回的不是XGYRO_OUT,紧接着之后当发送完0x0600后(此时所要读取的数据为YGYRO_OUT),此时接收的数据为XGYRO_OUT,在写MCU方的程序时,这一点要注意。

三、示例代码

        这里给出用方式一single register read模式读取陀螺仪、加速度计、磁力计及气压计的程序。

       


//Read IMU Data CMD
#define   Read_PROD_ID          0x00005600
#define   Read_XGYRO_OUT_CMD    0x00000400
#define   Read_YGYRO_OUT_CMD    0x00000600
#define   Read_ZGYRO_OUT_CMD    0x00000800
#define   Read_XACCL_OUT_CMD    0x00000A00
#define   Read_YACCL_OUT_CMD    0x00000C00
#define   Read_ZACCL_OUT_CMD    0x00000E00
#define   Read_XMAGN_OUT_CMD    0x00001000
#define   Read_YMAGN_OUT_CMD    0x00001200
#define   Read_ZMAGN_OUT_CMD    0x00001400
#define   Read_ZMAGN_OUT_CMD    0x00001400
#define   Read_BARO_OUT_CMD     0x00001600
#define   Read_TEMP_OUT_CMD     0x00001800
#define   Read_XGYRO_OFF_CMD    0x00001A00
#define   Read_YGYRO_OFF_CMD    0x00001C00
#define   Read_ZGYRO_OFF_CMD    0x00001E00
#define   Read_XACCL_OFF_CMD    0x00002000
#define   Read_YACCL_OFF_CMD    0x00002200
#define   Read_ZACCL_OFF_CMD    0x00002400

Uint8  XMT_OVER_FLAG  =0;//SPI1 Receive Data Flag, XMT_OVER_FLAG=1 when receive a 16-bit data is finished
Uint32 Non_Burst_Read_Data=0;

Int16 XGYRO_OUT=0;
Int16 YGYRO_OUT=0;
Int16 ZGYRO_OUT=0;
Int16 XACCL_OUT=0;
Int16 YACCL_OUT=0;
Int16 ZACCL_OUT=0;
Int16 XMAGN_OUT=0;
Int16 YMAGN_OUT=0;
Int16 ZMAGN_OUT=0;
Uint16 BARO_OUT=0;

float gx=0;
float gy=0;
float gz=0;
float ax=0;
float ay=0;
float az=0;
float mx=0;
float my=0;
float mz=0;

void main (void)
{
    /*********************************************/
    // Relocate interrupt vector table
	CSL_intcSetVectorPtr(vectors);

	interrupt_configuration();

    pll_configuration();
 
    dMAX_configuration();

    spi1_configuration();

    intc_configuration();

    RTI_configuration();
    /*********************************************/

    get_IMU_data();

    while(1)
    {

    }
}


void get_IMU_data(void)
{

	IMU_test(Read_XGYRO_OUT_CMD);
	delay(200);

	//GYROSCOPES OUTPUT
	IMU_test(Read_YGYRO_OUT_CMD);
	delay(200);
	XGYRO_OUT = (Int16)Non_Burst_Read_Data;
	gx = XGYRO_OUT/25 ;


	IMU_test(Read_ZGYRO_OUT_CMD);
	delay(200);
	YGYRO_OUT = (Int16)Non_Burst_Read_Data;
	gy = YGYRO_OUT/25 ;

	IMU_test(Read_XACCL_OUT_CMD);
	delay(200);
	ZGYRO_OUT = (Int16)Non_Burst_Read_Data;
	gz = ZGYRO_OUT/25;

	//ACCELEROMETERS OUTPUT
	IMU_test(Read_YACCL_OUT_CMD);
	delay(200);
	XACCL_OUT = (Int16)Non_Burst_Read_Data;
	ax = XACCL_OUT/1200 ;

	IMU_test(Read_ZACCL_OUT_CMD);
	delay(200);
	YACCL_OUT = (Int16)Non_Burst_Read_Data;
	ay = YACCL_OUT/1200;


    IMU_test(Read_XMAGN_OUT_CMD );
    delay(200);
    ZACCL_OUT = (Int16)Non_Burst_Read_Data;
    printf("\nNon_Burst_Read_Data= %d ",ZACCL_OUT);
    az = ZACCL_OUT/1200;

    //GMAGNETOMETERS OUTPUT
    IMU_test(Read_YMAGN_OUT_CMD);
    delay(200);
    XMAGN_OUT = (Int16)Non_Burst_Read_Data;
    mx = XMAGN_OUT/7;

	IMU_test(Read_ZMAGN_OUT_CMD);
	delay(200);
	YMAGN_OUT = (Int16)Non_Burst_Read_Data;
	my = YMAGN_OUT/7;

	IMU_test(Read_BARO_OUT_CMD);
	delay(200);
	ZMAGN_OUT = (Int16)Non_Burst_Read_Data;
	mz = ZMAGN_OUT/7;

	//BAROMETRIC PRESSURE OUTPUT
	IMU_test(Read_BARO_OUT_CMD);
	delay(200);
	BARO_OUT = (Uint16)Non_Burst_Read_Data;	
}

void IMU_test(Uint32 CMD)
{
	McASP0_ptr[McASPPDCLR] |= 0x00008000;   //Chip Select IMU

	XMT_OVER_FLAG = 0;

	spi1_ptr[SPIDAT0] = CMD;             //Read IMU Data CMD,write data to SPIDAT0 Register

	while(XMT_OVER_FLAG == 0);
}

void delay(Uint32 number)                //delay,Stall Time
{
	int temp_count=0;
	while(temp_count
   
   
    < code>
   

        main中get_IMU_data()函数之前的函数均为各个外设的驱动函数,不同的MCU,驱动函数自然不同,所以这些函数的内容便没有贴出来。delay(200)函数对应的就是Stall Time。

        

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IMU模块ADIS16448调试过程及经验总结 的相关文章

随机推荐

  • mysql 判断字段否存在,如果存在就修改字段

    先建一个存储过程 xff0c 再执行存储过程 xff0c 然后删掉存储过程 DROP PROCEDURE IF EXISTS proc tempPro CREATE PROCEDURE proc tempPro BEGIN SELECT c
  • mysql 常用脚本整理

    MySQL 来自各种资源 及部分自己实践 添加字段 ALTER TABLE 表名 ADD COLUMN 列名 类型 comment 39 说明 39 ALTER TABLE User ADD COLUMN shorName varchar
  • Docker Center OS7笔记--删除镜像(httpd)

    删除镜像 xff08 httpd xff09 1 docker stop docker ps a q 停止所有容器 2 docker ps a 查看容器 3 docker rm 容器ID 删除容器 删除后 xff0c 就没有容器了 4 do
  • SqlServer 2008R2 10.50.1600.1 升级到 SqlServer 2016

    要从sql server 2008 R2 企业版 直接升级到 2016 企业版 要先把R2升级到SP3这个版本 xff08 注意 xff1a 不是sp1 sp2 sp3的安全更新 坑 xff09 然后去下载2016 去itellyou下载
  • C#委托与事件

    1 什么是委托 委托是C 中的一个引用类型 它允许捕捉对方法的引用 xff0c 并像传递其他对象那样传递该引用 xff0c 也可以像调用其他方法一样调用被捕捉的方法 声明委托需要使用delegate关键字 xff1a span class
  • 数据分发服务 (DDS)及Fast DDS环境搭建

    1 数据分发服务 DDS 数据分发服务 DDS 是一种以 数据为中心的通信协议 xff0c 用于分布式软件应用程序通信 它描述了支持数据提供者和数据消费者之间通信的通信应用程序编程接口 API 和通信语义 由于它是一个以数据为中心的发布订阅
  • Docker管理工具Web UI:DockerUI & Shipyard /portainer

    docker针对于系统工程师或者开发人员来说操作比较简单 一般我们习惯了对着黑黑的屏幕敲命令 xff0c docker pull xff0c docker push xff0c docker run xff0c docker logs xf
  • BeautifulSoup+pandas 爬取新浪国内新闻

    xff08 1 xff09 使用技术 python 3 5 2 sqlite3 pandas requests jupyter notebook xff08 2 xff09 详细代码 新浪国内新闻首页 xff1a http news sin
  • android8.1客制化修改文档

    1 去除设置 系统 关于手机 硬件信息去掉 vendor mediatek proprietary packages apps MtkSettings res xml device info settings xml中删除布局文件 xff0
  • C/C++总结笔记——指针1:野指针、空指针(NULL和nullptr)、悬空指针、智能指针

    C C 43 43 中有几种指针相关的概念 xff0c 只知道有这样的概念 xff0c 但HR一问就露馅 xff0c 这里进行总结方便复习 1 野指针 1 指针定义时未被初始化 xff1a 指针在被定义的时候 xff0c 如果程序不对其进行
  • ARM汇编的编程模式和工作模式

    ARM采用32位架构 ARM 约定 Byte 8bitsHalfword 16bits 2byteWord 32 bits 4bytes ARM core 的指令集 ARM指令集 32 bitThumb指令集 xff08 沙姆 xff09
  • 嵌入式开发内存节约方法(笔记)

    1 不要在 h文件中定义变量 xff0c 可以声明一个extern全局变量 xff0c 定义在某一个 c文件中进行 其他 c文件即可共用 在源文件中引入头文件相当于直接把头文件的内容拷贝到原文件中 xff0c 如果引入这个头文件后 xff0
  • Linux内核进程上下文切换深入理解

    我们知道操作系统的一个重要功能就是进行进程管理 xff0c 而进程管理就是在合适的时机选择合适的进程来执行 xff0c 在单个cpu运行队列上各个进程宏观并行微观串行执行 xff0c 多个cpu运行队列上的各个进程之间完全的并行执行 进程管
  • 尚医通开发笔记(结尾含部分bug修复方法)

    目录 项目简介 xff1a 包含系统 项目架构 前端开发流程 xff1a common模块 swagger2 Result xff08 全局统一返回结果 xff09 YyghException xff08 自定义全局异常 xff09 Glo
  • 树莓派上的软件安装和卸载命令汇总

    基础命令 安装软件 apt get install softname1 softname2 softname3 卸载软件 apt get remove softname1 softname2 softname3 卸载并清除配置 apt ge
  • ubuntu安装KDE桌面环境

    ubuntu安装KDE桌面环境 打开shell环境 xff0c 执行sudo apt get install kubuntu desktop xff0c 然后会提示一大堆的软件包要安装 xff0c 注意安装好之后有1G多 lxc 64 lx
  • 游戏开发书籍推荐

    游戏开发书籍推荐 xff08 1 3 1 Windows游戏编程大师技巧 xff08 第二版 xff09 原名 xff1a Tricks of the Windows Game Programming Gurus 2nd 作者 xff1a
  • ROS实战之ROS组网的搭建

    搭建ROS组网 工具 xff1a 台式机 xff08 Ubuntu xff09 xff1a 192 168 2 101 笔记本 xff08 虚拟机 xff09 xff1a 192 168 2 106 步骤 xff08 此处以在笔记本中运行r
  • Mavlink协议(第二版)

    文章目录 协议简介一 Mavlink协议主要特点 二 数据结构不兼容标志 MAVLink 2 兼容性标志 MAVLink 2 有效载荷格式MAVLink 2 的数据包格式 三 航点协议四 参数的读写五 增加新的mavlink消息六 消息的发
  • IMU模块ADIS16448调试过程及经验总结

    ADIS16448集成了陀螺仪 加速度计 磁力计及气压计为一体的IMU模块 xff0c 我在这里总结下此模块的使用及调试经验 首先说下硬件环境 xff1a MCU为TMS320C6722 xff08 DSP xff09 xff1b IMU为