高精度24bit 模数转化 AD7767芯片 使用总结

2023-11-09

转载请标明是引用于 http://blog.csdn.net/chenyujing1234

 

欢迎大家提出意见,一起讨论!

 

PDF资料请大家网上搜索。

环境:

上位机  MIPS+WCE6.0

=========================================

1、芯片功能介绍

它是一个高精度的24bit采样SAR模数转换芯片 。

它有一个大的输入动态范围。能检测到小的电压变化

它的输出数据可以通过PCI或USB系统获得,读取数据的协议类似于SPI。

(1)引脚

通过示波器观看,可以知道当MSCK为30KHz时,SYNC/PD为高时,就能进行AD转化,有数据时DRDY为低,此时在SCLK的时序下把数据

移位到SDO中。当采用模拟的SPI(即不采用硬件的SPI模块时,请参考: )读取SDO时,SDO的频率为40KHz。而SCLK才900Hz.

从代码上讲SCLK拉高拉低的次数比SDO来得多,应该SCLK比SDO才对。会不会示波器有问题?

 

 

 

(2)读取时序图

上面讲到读取它的是SPI协议,只是类似,大家看它的时序就知道它不是真正的SPI,因为有DRDY脚.

读取方式有两种:CS为常低和读时CS才为低.

 

从上图可以看到,24bit数据是高位在前,注意的部分用红色圈起来了.

在编程中关键的是t6、t7、t8、t10、t11及最高位得做异或。

 

2、读数据程序实现

我采用的是读时再让CS下降.

由于是用GPIO口模拟SPI协议,下面的宏先定义各IO口,及读取它们的接口。

#define CLK_BANK		2       // SCLK脚
#define CLK_BIT			9
#define DAT_BANK		1       // SDO脚
#define DAT_BIT			25
#define CS_BANK		    1       // CS脚
#define CS_BIT			23
#define RDY_BANK		0		// DRDY脚
#define RDY_BIT			12
#define SDA_GPIO		(DAT_BANK	* 32) + DAT_BIT



#define SET_CLK_HIGH()	\
	{	\
	pin_val[CLK_BANK] = (1<<CLK_BIT);	\
}
	//if(TRUE == g_bAddDelay)  \
		//OALStallExecution(g_delayUS);	\
	//}
#define SET_CLK_LOW()	\
	{	\
	pin_valclr[CLK_BANK] = (1<<CLK_BIT);	\
}
	//if(TRUE == g_bAddDelay)  \
	//	OALStallExecution(g_delayClkLowUs);	\
	//}
#define SET_CS_HIGH()	\
{	\
	pin_val[CS_BANK] = (1<<CS_BIT);	\
}
	//if(TRUE == g_bAddDelay)  \
	//OALStallExecution(g_delayUS);	\
//}
#define SET_CS_LOW()	\
	{	\
	pin_valclr[CS_BANK] = (1<<CS_BIT);	\
}
	//if(TRUE == g_bAddDelay)  \
	//OALStallExecution(g_delayUS);	\
	//}

 
#define GET_SDA_DATA ((pin_val[DAT_BANK] & (1<<DAT_BIT)) ? 1 : 0)
#define GET_RDY_DATA ((pin_val[RDY_BANK] & (1<<RDY_BIT)) ? 1 : 0)

 

把CS拉低后有一个t6才能CLK下降,t6是0ns.(其实可以把for(i = 0; i < g_delayCSLow; i++)去掉的

static BOOL PCIPortRead(DEVICE_HANDLE *devHandlePtr, PULONG outBuffPtr)
{
 int i = 0;
 BOOL retval = TRUE;
 

 // 当RDY为低时才去读数据
 if(0 == GET_RDY_DATA)
 {
  // 0ns
  SET_CS_LOW();      // 把CS拉低
  for (i = 0; i < g_delayCSLow; i++); // 6ns
   
  *outBuffPtr = PCIGet24Bit();

  SET_CS_HIGH();      // 把CS拉高
 }
 return retval;
}



下面是读24bit数据:

CLK拉低后,有一个60-24ns的时间,大家一看是ns怎么办叱?

按道理说时序图上的时间只要你大于它都是没问题的,但是为了AD转化取样平滑,我们想让读取的点多,

那么就得在读取时间上做最优化,这里我用for循环来控制ns。因为一个for大约是两个机器周期,

我的机器是800M,那么一个周期就是1/800M = 0.8ns.那么就可以换算出要执行几条指令了。

static ULONG PCIGet24Bit(void)
{
 BYTE status = 0;
 ULONG ulData = 0;
 int i = 0, j = 0;
 // 接收24个bit
 for(i=0; i < 24; i++)
 {
  ulData <<= 1;

  SET_CLK_LOW();    // 时间下降沿有效
  for (j = 0; j < g_delayClkLowUs; j++); // 60-24 ns

  status = GET_SDA_DATA;

  ulData |= status;

  SET_CLK_HIGH();
  for (j = 0; j < g_delayClkHighUs; j++); // 10ns
 }
 // 24位补码还原
 return ulData^0x800000;
}

大家看PCIGet24Bit函数,最后返回时是

// 24位补码还原
 return ulData^0x800000;

为什么要这样呢?

请看:

 


用一个24位AD转换芯片 输出为二进制补码 最小值和最大值分别为:800000 7FFFFF(HEX)

异或0x800000就是把最高位翻转。翻转的结果看成数学二进制的话就是把原先的数加了0x800000,但是最高位的进位被丢掉,

这样原先最小的数,就是0x800000,加完变成0x1000000,最高位爆出去了,又变成0x000000了;原先最大的数,7FFFFF,变成了FFFFFF。

综上,采用补码是为了能扩大表达的数的范围.(一开始我没有把补码还原,这样造成的后果是波峰变成了波谷)

 ===========================================================================================

3、结果.

把AD结果画出图形。^-^

==============================================================================================

总结:

做AD开发,别一开始就用实际输入源,先用自己的信号发生器出来对于AD芯片来说最大的电压与最小的电压、参考的电压。看是不是能得到正确值。

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

高精度24bit 模数转化 AD7767芯片 使用总结 的相关文章

  • 使用 Cp500 编码陌生事物(LF 和 NEL)

    最近 在从字节转换为字符串 然后再从字符串转换为字节的过程中 我遇到了 Cp500 EBCDIC 编码的奇怪问题 问题在于一个特定的角色就是在这个转变过程中 被转变为这个角色 下面的代码验证了这一点 byte b25 0x25 byte b
  • php 字符串转十六进制并带有 2 的补码:

    嗨 我有一根绳子193390663我想将其转换为hex with 2 s compliment 输出是0B86E847 现在我正在使用下面的功能 但它给了我313933333930363633 public static function
  • C 中的十六进制到字符数组

    Given a string of hex values i e e g 0011223344 so that s 0x00 0x11 etc 如何将这些值添加到 char 数组 相当于说 char array 4 0x00 0x11 您无
  • 如何将 ASCII 字符的十六进制值写入文本文件?

    这是我目前所拥有的 void WriteHexToFile std ofstream stream void ptr int buflen char prefix unsigned char buf unsigned char ptr fo
  • 如何获取十六进制02的STX字符

    我有一个设备试图通过套接字连接 根据手册 我需要 十六进制 02 的 STX 字符 我如何使用 C 来做到这一点 只是对 GeoffM 的答案的评论 我没有足够的观点来以正确的方式发表评论 您绝对不应该仅使用两位数字来嵌入 STX 或其他字
  • MySQL C++ 连接器使用 SELECT 查询获取字符串

    我是 C 上的 mysql 新手 之前在 PAWN 上做过 效果很好 但现在我遇到了问题 我正在尝试从 mysql 数据库获取密码 稍后再执行其余代码 然后我会得到十六进制代码 如果是的话 这是我得到的示例 0x59fcb0 当我重新启动程
  • 如何将字节数组转换为任何类型

    好的 我看到有人问如何将字节数组转换为int string Stream等等 答案各不相同 我个人还没有找到任何令人满意的答案 这里有一些我们想要将字节数组转换成的类型 UnityEngine Font可以吸收ttf data UnityE
  • 0x0A 和 0x0D 之间的区别

    我正在研究蓝牙 我试图编写代码以在连接时继续监听输入流 我遇到了以下代码片段 int data mmInStream read if data 0x0A else if data 0x0D buffer new byte arr byte
  • c++ - 将“std::vector”的内容保存到文件

    我使用 writeFileBytes 下面的函数来写入a的内容std vector
  • 替代位置基础系统(十六进制、八进制、二进制)如何工作?如何将它们转换为十进制?

    我以前在编程课上没有学过这一点 但现在我需要知道它 有哪些学习这些数字以及如何转换它们的好资源 我几乎会像记住乘法表一样记住这些 在我们日常的十进制系统中 基数或radix http en wikipedia org wiki Radix
  • C# Byte[] 转 BCD 和 BCD 转 INT

    我有一个由 CashRegister Machine 创建的 Hex 文件 我必须读入这个文件 文件使用下面详述的格式 它就像套接字数据包 代码数据 2字节PLU 代码数据 7 字节单价数据 5字节数量数据 5字节数据总量 5字节PLU 名
  • printf() 格式化十六进制

    为什么当将十六进制数字打印为带前导零的 8 位数字时 08X not显示相同的结果0x 08X 当我尝试使用前者时 08格式化标志已被删除 并且它不适用于仅8 The 部分给你一个0x在输出字符串中 这0和x计算您在列表中列出的 8 个字符
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str
  • 从 UNIX 命令行向串行端口发送字节?

    我想使用命令行将字节流发送到串行端口 这可能吗 我的串口位于 dev cu usbserial A700dYoR在我的 Mac 上 例如 如果我想将整数 50 或字符串 data 发送到该串行端口 我该怎么做 我对 UNIX 的了解非常有限
  • 字节到二进制字符串 C# - 显示所有 8 位数字

    我想在文本框中显示一个字节 现在我正在使用 Convert ToString MyVeryOwnByte 2 但是 当字节开头有 0 时 这些 0 就会被删除 例子 MyVeryOwnByte 00001110 Texbox shows g
  • 帮助我将以十六进制表示的长值转换回日期/时间

    我有一个日期值 据说它是 8 个字节 一个 long 又名 int64 值 并转换为十六进制 60f347d15798c901 我如何使用 PHP 将这个和类似的值转换为时间 日期 将其转换为十进制给我 96 243 71 209 87 1
  • 当 MSB 位等于 0 时如何以十六进制格式打印它们

    我需要使用打印变量HEX格式 问题是当我的变量很小时 MSB 等于 0 因此不会打印它们 ex uint16 t var 10 0x000A h gt 我需要打印 000A 但无论我做什么它总是打印 A 我怎样才能让它发挥作用 您可以添加前
  • 如何自动转换十六进制代码以将其用作 Java 中的 byte[]?

    我这里有很多十六进制代码 我想将它们放入 Java 中 而不需要向每个实体附加 0x 喜欢 0102FFAB 和我必须执行以下操作 byte test 0x01 0x02 0xFF 0xAB 我有很多很长的十六进制代码 有什么办法可以自动做
  • 字节大小(澄清)

    我正在编写一个游戏服务器 这可能是一个简单的问题 但我只是想要一些澄清 为什么一个字节 char或unsigned char 最多可以容纳255 0xFF 我认为是2个字节 的值 当我使用sizeof unsigned char 编译器告诉
  • 使用带有十六进制字符串的 CryptoJS

    我想连接到蓝牙设备 仅通过十六进制字符串进行通信 我需要编码一个 16 字节值 因此我也期望一个 16 字节的值 在我的实现中 CryptoJS 总是返回更长的结果 根据文档 不需要 IV 所有 16 字节数据必须使用当前存储在设备中的客户

随机推荐

  • (Python)蚁群算法解决旅行商问题(ACO-TSP)

    蚁群算法又称蚂蚁算法 容易与其他算法相结合 但也存在收敛速度慢 容易陷入局部最优等缺点 coding utf 8 import random import copy import time import sys import math im
  • 【刷题】华为笔试面试机考 [HJ29] - 字符串加解密

    题目地址 点击跳转 题目描述 1 对输入的字符串进行加解密 并输出 2 加密方法为 当内容是英文字母时则用该英文字母的后一个字母替换 同时字母变换大小写 如字母a时则替换为B 字母Z时则替换为a 当内容是数字时则把该数字加1 如0替换1 1
  • 【性能测试】第五篇

    JMeter环境安装 安装JDK 1 JDK下载 官网下载 http www oracle com 提示 下载时注意电脑系统是32位还是64位 桌面 计算机 右击 属性 查看 系统类型 2 安装JDK 双击安装包进行安装 所有步骤选择默认选
  • AVL树的插入操作(四种情况)

    目录 前言 一 AVL树简介 平衡因子bf 二 AVL树的插入操作 不包含重复值 1 找到要插入的位置 和普通的二叉搜索树一样 2 平衡化 情况1 右旋 Single Right Rotation 情况2 左旋 Single Left Ro
  • ubuntu shell实现加减乘除

    bin sh a 8 b 4 c expr a b 乘法 c expr a b 加法 c expr a b 减法 c expr a b 除法
  • 【Windows】 谷歌翻译停服后,chrome无法自动翻译?解决办法来了~

    早前蓝点网提到谷歌翻译中国版和谷歌地图中国版同时停服 此次停服也影响到谷歌浏览器翻译功能的使用 谷歌给出的官方回应是谷歌翻译和谷歌地图的中国版使用率都太低 既然使用率太低那直接停服也情有可原 笑笑 只是谷歌浏览器内置的翻译功能也需要调用谷歌
  • LeetCode每日一题:1462. 课程表 IV(2023.9.12 C++)

    目录 1462 课程表 IV 题目描述 实现代码与解析 拓扑排序 原理思路 1462 课程表 IV 题目描述 你总共需要上 numCourses 门课 课程编号依次为 0 到 numCourses 1 你会得到一个数组 prerequisi
  • KVM-6、virsh 命令及功能详解

    1 虚拟机管理操作 attach device 从XML文件附加设备 attach disk 附加磁盘设备 attach interface 连接网络接口 autostart 自动启动一个域 blkdeviotune 设置或查询块设备I O
  • IDEA报错Project lease-web: there is circular dependency between tests of ‘service-util‘ module, tests

    项目场景 当我创建多个模块时 为了模块化管理利于模块复用 我一层包一层 问题描述 例如 当我要运行的时候发现报错 Project lease web there is circular dependency between tests of
  • Linux 音视频开发杂记之二-使用FFmpeg

    FFmpeg简介 FFmpeg是一套可以用来记录 转换数字音频 视频 并能将其转化为流的开源计算机程序 采用LGPL或GPL许可证 它提供了录制 转换以及流化音视频的完整解决方案 ubuntu下FFmpeg下载 编译并安装 1 基础依赖库安
  • 动态规划基础之挖金矿问题

    问题 有一个国家发现了5座金矿 每座金矿的黄金储量不同 需要参与挖掘的工人数也不同 情况如下图 金矿编号 黄金储量 需要人数 1 500 5 2 200 3 3 300 4 4 350 3 5 400 5 参与挖矿工人的总数是10人 每座金
  • 点云目标检测 国内外现状 2000字

    国内外现状近年来 点云目标检测技术受到了越来越多的关注 其中包括传统的统计学习方法和深度学习方法 由于深度学习方法的出现 点云目标检测研究取得了长足的进步 首先 深度学习方法大大提高了点云目标检测的准确率 其次 深度学习方法也大大简化了点云
  • C++:防止int32溢出--以反转数字为例

    int32溢出 在C 等语言中int类型的整数占4个字节 一般而言 而一个字节是8bit 所以int型可表示32位的整数 又因为int可以表示负数 所以int的范围是 2 31 2 31 231
  • Unity3D之UI按键绑定事件(六)

    六 通过unity系统自带接口和观察者模式绑定按键事件 UI UGUI 如何判断UI元素被点击时是鼠标哪个按键 五 中我们可以根据eventData pointerId来监听是我们按下的是鼠标左键还是右键 通过前面几部分学习我们已经实现对U
  • 字符设备驱动之异步通知

    一 应用程序主动的去查询或 read 1 查询方式 很占资源 2 中断机制 虽然有休眠 但在没有按键按下时 read 3 poll 机制 指定超时时间 以上都是 应用程序 主动去读或查询 二 异步通知 有按键按下了 驱动程序来提醒 触发 应
  • 18.函数subplot2grid():让子区跨越固定的网格布局

    文章目录 1 subplot2grid 的使用方法 2 模块gridspec中的类GridSpec的使用方法 subplot2grid 函数的rowspan和colspan参数可以让子区跨越固定的网格布局的多个行和列 实现不同的子区布局 比
  • 韩顺平 2021零基础学Java 学习笔记(1)(自用)

    目录 第 2 章 Java 概述 第 3 章 变量 第 4 章 运算符 第 5 章 程序控制结构 第 6 章 数组 排序和查找 第 7 章 面向对象编程 基础部分 第 8 章 面向对象编程 中级部分 第 2 章 Java 概述 2 1 Ja
  • Vue3 如何实现一个全局搜索框

    前言 自从学习 vue 以来 就对 vue 官网全局的 command K 调出全局关键词搜索这个功能心心念念 恰好最近项目也是需要实现一个全局搜索的功能 也正好可以正大光明的带薪学习这个功能的思路 网上的教程水平参差不齐 而恰好之前的项目
  • C++数组【修订】

    C 数组 修订 C 数组 array 是一种顺序容器sequence container 是由单一数据类型元素组成的一个有序集合 数组是用来存储一系列数据 但它往往被认为是一系列相同类型的变量 对数组元素的访问是通过下标 subscript
  • 高精度24bit 模数转化 AD7767芯片 使用总结

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家提出意见 一起讨论 PDF资料请大家网上搜索 环境 上位机 MIPS WCE6 0 1 芯片功能介绍 它是一个高精度的24bit采样SAR模数转