转载请标明是引用于 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芯片来说最大的电压与最小的电压、参考的电压。看是不是能得到正确值。

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

  1. STM32 MCO+SPI获取24位模数转换(24bit ADC)高速芯片ADS1271采样数据

    STM32 MCO+SPI获取24位模数转换(24bit ADC)高速芯片ADS1271采样数据 STM32大部分芯片只有12位的ADC采样性能,如果要实现更高精度的模数转换如24位ADC采样,则需要 ...

  2. 免校准的电量计量芯片_【应用】基于高精度免校准电能计量芯片CSE7761的漏电保护设计,可支持单芯片两路计量...

    随着家电产业开始步入物联网时代,终端企业也开始借助更为智能的手段来保障电器的使用安全,如电器电能监测.过载检测.故障预警等等,使得电能计量芯片开始崭露头角.本文将介绍 漏电是由于电器外壳和市电火线间因 ...

  3. STM32 CubeMX学习:7. ADC模数转化

    STM32 CubeMX学习:7. ADC模数转化 系列文章目录 前期的准备 点亮 LED 闪烁 LED 定时器闪烁LED PWM控制LED亮度 常见的PWM设备 按键的外部中断 ADC模数转换 串口 ...

  4. stm32学习笔记 ADC模拟数字转换器 ADC模数转化器详解

         一.为什么要使用ADC模拟数字转换器     STM32主要是数字电路,数字电路只有高低电平,没有几V电压的概念,所以如果想要读取电压值,就需要借助ADC模数转化器来实现.可以说ADC是模拟 ...

  5. 基于STM32HAL库ADC+DMA模式,高精度采集电池电量与芯片内部温度方法 (48脚 使用内部参考电压方案)

    目录 概述 1.原理图 2.在这先普及一下概念 3.通过查看STM32L0中文数据手册中301页,第14.10 小节 ,DataSheet 4.ADC通道转换模式的理解 5.STM32CubeMx工具 ...

  6. AD模数转化电路的一种实现方式

    测量电压实际上可以通过间接的测量由该电压通过一个确定的电阻所产生的电流对一个确定的电容进行充电达到预定的电压所花费的时间得到,而该处方案的实现可以采用运放中的积分器进行实现,在充满电后释放电容存储的电 ...

  7. AD模数转化/DA数模转换

    1.  AD:模拟数字转换---将模拟信号转换为计算机可操作的数字信号:(有时也称作ADC) DA:将计算机输出的数字信号转换为模拟信号: 2.  运算放大器(运放):具有很高放大倍数的放大电路单元: ...

  8. 专用型高精度24位AD转换器芯片HX711说明

  9. daad转换器实验数据_箔芯片电阻在高温应用A/D转换器中的应用

    工业/应用领域 高温:地震数据采集系统.石油勘探监测.高精度检测仪 产品采用:V5X5 Bulk Metal (R) Foil芯片电阻 案例介绍 TX424是一个完整的4通道24位模数转换器,采用40 ...

最新文章

  1. 浅显易懂 Makefile 入门 (01)— 什么是Makefile、为什么要用Makefile、Makefile规则、Makefile流程如何实现增量编译
  2. 事务配置_SSH(五)- 使用注解方式配置事务管理
  3. golang字符串处理
  4. Golden Software Surfer 17中文版
  5. "unable to load dynamic library"错误的解决方法
  6. 干得累死,并不见得老板就待见你?
  7. mongodb java spring_[Java教程]Spring 与 mongoDB 整合
  8. mysql自增字段_MySQL自增字段的常用语句
  9. 1.极限——ε-δ例子_7
  10. win10获取管理员权限方法
  11. 在Azure Data Studio中探索SandDance可视化扩展
  12. 分段式多级离心泵_溧阳耐磨矿用多级泵水泵厂
  13. PyTorch:模型训练和预测
  14. Kraker:分布式密码爆破系统
  15. android第三方视频播放加密,android 视频 加密/解密(使用AES)
  16. 方管图纸标注_图样中型材的标注方法
  17. 一些微信小程序demo源码
  18. 动态lacp和静态lacp区别_3分钟弄懂LACP实现原理!
  19. 优秀ppt作品下载欣赏
  20. 实际BCI应用:异步EEG/EOG BCI手抓取和释放的可行性

热门文章

  1. 【雷达与对抗】【2018.06】CReSIS高频-甚高频探测仪与超高频累积雷达的改进
  2. 智能汽车安全研究:风险点、破解案例、研究工具
  3. linux mysql 误删系统文件恢复_MySQL误删物理文件的恢复(Linux)
  4. 匝间短路故障学习历程(三) -- 信号加噪去噪
  5. 微软拼音输入法 2010 Beta 2 介绍文
  6. android 汉化
  7. 只需六步,解决数据分析思路问题
  8. 论文阅读 | Recurrent Filter Learning for Visual Tracking
  9. 直播离“性”到底有多远? 李银河刷出新高度
  10. 基于jeecgboot的支持online表单审批的功能正式发布