ADIS16470和ADIS16500从到手到读出完整数据,附例程

news2024/9/23 21:20:19

由于保密原因,不能上传我这边的代码,我所用的开发环境是IAR, 下边转载别的博主的文章,他用的是MDK
下文的博主给了你一个很好的思路,特此提出表扬
最下方是我做的一些手册批注,方便大家了解这个东西

原文链接:https://blog.csdn.net/wmdscjhdpy/article/details/111288961

前言

本文章本来是作为ADIS16470的测评报告的,写于2018年,近期整理数据的时候发现这篇文章,而与此同时网上还没有太多的相关的资料,因此整理一下发到本博客上。鉴于当时水平不足,完成度只做到了驱动起来读出简单整理的数据。例程见github:项目链接
另外由于传感器比较新,基本上主要资料都是来源于datasheet,下文中大量图片也是引用datasheet,如有需要可以先行下载datasheet再跟着思路走可能会更清晰一些:数据手册下载地址数据手册下载地址
附当时使用的评测板子图:
16470
在这里插入图片描述
在这里插入图片描述

16500
在这里插入图片描述

评测正文

基本程序设置与电路搭建

通过数据手册可以知道,ADIS16470是通过SPI的方式来与主设备的通信的,组成SPI通信需要CLK时钟线,MOSI输出线,MISO输入线与NSS片选线。我手头上就只有一个STM32F439IGT6核心板,所以我的工程选用了该板来建立工程。
在STM32CubeMX中建立STM32F439IGT6的工程后,建立工程后首先设定好时钟频率和调试方式,然后启用一个SPI和一个普通GPIO作为NSS片选线,如图:
在这里插入图片描述

然后是配置SPI和GPIO方式,作为SPI信号线,GPIO建议设置为开漏输出模式
SPI的配置方式要根据数据手册来决定,查阅数据手册可以发现,CPOL应为1,CPHA应为1,在Cube中即设置Polarity=HIGH, Phase=2Edge(这个问题在刚开始弄的时候一不小心弄错了 折腾了很久才弄出来)。同时因为ADIS16470传输数据是以16bits为一个单位的,可以在Cube中设置SPI的Data Size=16。然后还要调整SPI的Prescaler以降低波特率以保证不超过2Mb/s(使用BurstRead时不能超过1Mb/s)
在这里插入图片描述

当以上配置都完成之后可以生成工程,然后根据陀螺仪的数据手册中的引脚定义,进行核心板和陀螺仪的接线。这里有一点其实我听迷惑的,就是这里J1的序号并不是从上到下排序的,而是按照行来进行编号的,这一点大家要注意,别一不小心误操作就把这贵重的陀螺仪给烧了!上千块的玩意
在这里插入图片描述

以BurstRead方式读取原始数据

该陀螺仪的读取数据的方式有很多种,而BurstRead就是其中一种方式,它的特点是读取简单,连续读取,一步到位获得三轴加速度和三轴角速度值。在对精度要求不是很高要求快速上手的情况下,BurstRead方式是一个不错的选择。
在这里插入图片描述

查阅技术手册可以得到BurstRead方式的操作时序图,在启动的时候将CS线拉低,随后发送一个字0x6800,然后连续读取SPI数据,就能得到按照一定顺序排列的传感器数据了。
根据数据手册上数据的排列,可以定义一个结构体用于存放数据:
在这里插入图片描述

然后就可以在程序中做一个循环读取,读取前先发BurstRead前置指令,然后将剩下读到的数据放到结构体内即可。为了保证数据可靠性,每一帧数据都存在一个校验字节可用于保证帧完整性和可靠性。在每次接收完完整的一帧之后,可以进行数据校验,仅当校验成功时保留数据。以下为读取出来的传感器值(原始数据值):
在这里插入图片描述

通过单独读取寄存器来获得传感器数据

在大部分时候,BurstRead可以满足基本上的需求,可是ADIS16470拥有更精准的32位精度的数据,在我们有更高要求的时候,通过读取其寄存器可以得到非常高的精度的传感器数据。
下图则为其角速度的32位数据精度,为655360LSB每度每秒,可以说是十分吓人了:
在这里插入图片描述

所以,当我们有高精度需求的时候,就需要单独的去读取它的寄存器了。读取寄存器的时序如下:
在这里插入图片描述

可以看到,每次发送需要读取的寄存器的时候,读取结果会在SPI传输的下一个时序中返回。为了提高读取效率,可以将需要读取的寄存器地址连续发送,然后在接收时加上偏移即可。
在读取完毕之后,将两个16位数据合成一个32位的数据(根据手册,按照小端模式,低位低地址高位高地址合并),这样就得到了32位的原始数据。仅仅得到原始数据还不够,根据如上图的表格得到原始数据到标准单位的关系进行换算,最终得到三轴角速度以及三轴加速度值。

在这里插入图片描述

在取到三轴角速度和三轴加速度后,我们还有一个经常使用的值,就是三轴的姿态角。很多时候对于普通陀螺仪我们都是直接取速度的积分作为角度值,这样存在一定的偏差。为了解决积分的准确度,ADIS16470还提供了角度差数据。这个数据提供一定时间区间内的角度差,默认值为1/2000秒的角度差。在做机器人控制系统的时候,我们一般不需要用到这么高的数据频率,因此我们需要提高积分的时间,即降低数据频率。ADIS16470中提供了一个寄存器用来控制积分时间,如果这个寄存器为x的话,数据频率就为2000/(x+1)Hz。该寄存器的默认值为0,所以默认频率为2000Hz。在控制系统的用途中,我们把数据频率控制到500Hz就可以获得较佳的控制效果了。因此我们需要写入该寄存器为0x03把积分时间提升到1/500s。
在这里插入图片描述

当我们的控制周期为500Hz时,每次读取角度差值并进行积分,此时积分的结果就是较为精确的角度值,不会因为控制频率的降低而损失精度。 最终的所有数据如下:
在这里插入图片描述

简单的数据处理
从刚刚我们已经得到了所有的数据,不过数据还是不大稳定,这时候还需要做一些处理。
在这里插入图片描述

陀螺仪由于其硬件限制,会存在零点漂移,也就是说当真实的某轴角速度为0的时候,其输出的值并不是0而是一个接近0的数,也就是说它的零点发生了偏移。ADIS16470内部提供了零点校准的寄存器值,其工作的原理如下:

在这里插入图片描述

也就是说,确定好了合适的零点偏移量后,每次陀螺仪的数据都会经过偏移量的修正从而得到较为准确的数据。一般常用确定零点漂移量的方法是在程序启动的一段时间内保持陀螺仪不发生运动,采集一段时间的数据,然后用得到的角度除以自检的时间得到偏移角速度,然后将其取负号作为零点漂移修正值。在进行零点修正后,陀螺仪就能读出更稳定的数据了。
当然影响陀螺仪的准确度的因素远不止这一种,还有很多诸如随机漂移,高频振动等各种影响陀螺仪准确度的因素,不过因为ADIS16470的各个方面的性能都很出色,把像随机漂移和高频振动带来的偏移这种较难处理的误差降到很低,所以简单处理就能得到较好的数据。除了零点修正外,ADIS16470还内置了巴特沃斯滤波器,可以根据需求通过配置寄存器可以开启滤波器得到更准确的数据。如果还需要更精确的数据还可以考虑数据融合算法,在此不再赘述。

关于细节可以参考我做的一些批注,用的是16500,如下

https://download.csdn.net/download/weixin_44057803/88226636

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
其实16470的手册我感觉比16500更专业,而且解释更专业

下边这个16500手册都写错了

在这里插入图片描述
在这里插入图片描述

按照下边这个给的算就知道是52428800=2,097,152,000/40

在这里插入图片描述

这个也不对,默认值是C1,下边却说是0

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Github下载任意版本的VsCode

下载历史版本VsCode(zip) 下载链接由三部分组成: 固定部分commit idVSCode-win32-x64-版本号.zip 固定部分: https://vscode.cdn.azure.cn/stable/ Commit id: 打开 vscode的GitHub:[https://github.com/microsoft/vscode/r…

Code interpreter生成无聊的APP:病理图像切割和提取

一、写在前面 机器学习100步不够分配了,所以开个新专栏,就叫做《Code interpreter生成无聊的APP》,旨在探索GPT-4官方插件Code interpreter的使用心路历程。 主要灵感来源:听户主说,她们在做病理组学图像标注和分割的…

作品集封面这样设计,提升个人竞争力!

随着毕业季、求职季陆陆续续的到来,许多毕业生和求职者都将踏上找工作的道路。作品集作为敲门砖,对设计师来说非常重要。而一套完整的作品集自然少不了一张精致吸睛的个人作品集封面,作品集封面的质量直接影响了整套作品的效果。那么&#xf…

Spring Clould 注册中心 - Eureka,Nacos

视频地址:微服务(SpringCloudRabbitMQDockerRedis搜索分布式) Eureka 微服务技术栈导学(P1、P2) 微服务涉及的的知识 认识微服务-服务架构演变(P3、P4) 总结: 认识微服务-微服务技…

原生实现koa框架连接mongoose数据库

1.首先新建一个初始化文件 npm init -y2.下载koa框架所依赖的插件 npm i koa koa-bodyparser koa-router mongoose3.新建一个server.js文件作为我们的服务器 const Koa require(koa) const Router require(koa-router) //可以接受post请求 const bodyParser require(koa-b…

【Spring Cloud 八】Spring Cloud Gateway网关

gateway网关 系列博客背景一、什么是Spring Cloud Gateway二、为什么要使用Spring Cloud Gateway三、 Spring Cloud Gateway 三大核心概念4.1 Route(路由)4.2 Predicate(断言)4.3 Filter(过滤) 五、Spring …

rabbitMQ服务自动停止(已解决

1、 在rabbitmq的sbin目录下操作 rabbitmq-plugins enable rabbitmq_management 2、 自己去rabbitmq_server-3.7.5文件夹下创建一个data,再执行这个命令(用自己的目录哈 set RABBITMQ_BASED:\RabbitTools\RabbitMQ\rabbitmq_server-3.7.5\data 然后去配…

PHP手术麻醉系统源码,自动生成麻醉和护理医疗文书

一套手术麻醉系统源码,可二次开发 手术室麻醉临床信息系统(AIMS)是应用于医院手术室、麻醉科室的计算机软件系统。该系统针对整个围术期,对病人进行全程跟踪与信息管理,自动集成病人HIS、LIS、RIS、PACS信息&#xff0…

实现chatGPT 聊天样式

效果图 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Chat Example</title&g…

axios使用axiosSource.cancel取消请求后怎么恢复请求,axios取消请求和恢复请求实现

在前端做大文件分片上传&#xff0c;或者其它中断请求时&#xff0c;需要暂停或重新请求&#xff0c;比如这里大文件上传时&#xff0c;可能会需要暂停、继续上传&#xff0c;如下GIF演示&#xff1a; 这里不详细说文件上传的处理和切片细节&#xff0c;后续有时间在出一篇&a…

Viobot ROS主从机配置

本篇介绍如何配置Viobot的ROS主从机&#xff0c;设备已经默认配好了主机的大部分设置&#xff0c;由于涉及到开机自启动&#xff0c;所以主机必须是Viobot。 以虚拟机ubuntu20.04为例。 1.从机配置 虚拟机终端输入命令,输入密码&#xff0c;按下图修改文件&#xff0c;保存…

途乐证券-上证指数有哪些股票组成?

上证指数是我国股市最重要的指数之一&#xff0c;它由上海证券交易所根据必定的计算方法加权均匀得出来的数据&#xff0c;是我国股市中重要的股票指数之一。那么&#xff0c;上证指数有哪些股票组成呢&#xff1f;让我们从多个视点剖析。 首先&#xff0c;从职业散布视点看&am…

数据流中的中位数

解题思路一&#xff1a; import java.util.*;public class Solution {//用栈来存储所有数据Stack<Integer> s new Stack<Integer>();//入栈public void Insert(Integer num) {s.push(num);}//出栈public Double GetMedian() {Double result 0.0;if(s.size() <…

01_langchain

Langchain简介 LLM的诞生推动了自然语言处理领域的变革&#xff0c;让以前无法实现的一些应用成为了可能。然而仅仅利用LLM还无法完成真正强大的应用程序&#xff0c;还需要一些相关的资源和技术知识。 Langchain用于开发这些应用程序&#xff0c;可用于&#xff1a; 基于文…

认识docker+LNMP架构

目录 一、docker 1.安装&#xff0c;启动 2.docker相关命令 3.如何使用&#xff1f; 二、LNMP 1.认识LNMP 2.sql注入漏洞挖掘 3.如何绕过检测进行注入 一、docker 1.安装&#xff0c;启动 2.docker相关命令 docker search nginx 搜索镜像 docker pull docker.io/ngin…

Constanze‘s Machine

一、题目 二、分析 列表找规律&#xff0c;不同长度的u能够带来多少种不同的情况 发现规律&#xff0c;case满足斐波那契数列。 所以可以先预计算斐波那契数列fib。 #include<iostream> #include<cstring> #include<algorithm> #define int long long usi…

设置bootstrap的modal垂直居中

效果&#xff1a; 代码&#xff1a; updateEmpModal 指的是我的模态框id$("#updateEmpModal").modal("show"); // show 方法调用之后立即触发该事件 $(#updateEmpModal).on(shown.bs.modal, function(){let $this $(this);let $modal_dialog $this.fi…

elementui 修改日期选择器el-date-picker样式

1. 案例&#xff1a; 2. css /* 最外层颜色 */ .el-popper.is-pure {background: url("/assets/imgList/memuBG.png") no-repeat;border: none;background-size:100% 100%}/* 日期 1.背景透明 */ .el-date-picker{background: transparent; }/* 日期 2.标题、左右图…

C++碎知识点

二叉树 由 n个节点构成的形态不同的⼆叉树 同余符号 定义设m是大于1的正整数&#xff0c;a,b是整数&#xff0c;如果m|(a-b)&#xff0c;则称a与b关于模m同余,记作abmod(m)&#xff0c;读作a同余于b模m。 符号& 按位与 后赋值 C语言中计算优先级

业务数据“一站式”数据管理平台,从设备实时数据和业务应用数据两个方面要彻底解决“信息孤岛”的问题

1. 产品背景 工业数据大致分为两种数据&#xff1a;设备实时数据和业务应用数据。 设备实时数据的管理是iNeuOS工业互联网操作系统的基础平台重要组成部分&#xff0c;要求数据的实时性、稳定性&#xff0c;通过设备驱动&#xff08;数据交互驱动&#xff09;、服务驱动&…