外部ADC之AD7949——14bit、8通道、250k

发布时间:2024年01月14日

前言

在实际项目中,仅靠单片机内部的ADC采样,很有可能达不到实际采样精度,这个时候就需要外接外部ADC芯片进行采样,这些外部ADC一般都是SPI接口或者是并口

单片机通过SPI接口或并口读写芯片内部寄存器,配置参考极性、采样通道、低通滤波器带宽、基准电压源、通道序列器等。

本文主要对ADI家的14bit、8通道、250k的ADC7949做一个总结,这款ADC在实际项目中使用,采样精度达到要求,读取时序有点点绕,但是是一款十分常用的ADC芯片。就是价格不太友好哈哈,一块芯片快60。
image.png

一、AD7949 特点

AD7949是一款8通道、14位、电荷再分配、逐次逼近型(SAR)模数转换器(ADC),采用单电源(VDD)供电

AD7949内置多通道、低功耗数据采集系统所需的元件,包括:
无失码的真14位SAR型ADC;
用于将输入配置为单端输入(使用或不使用参考地)、差分输入或双极性输入的8通道、低串扰多路复用器;
内部低漂移基准电压源(可以选择2.5 V或4.096 V)和缓冲;温度传感器;
可选择的1极点滤波器;以及多通道按顺序连续采样时所用的序列器。

AD7949使用简单的SPI接口实现配置寄存器的写入和转换结果的接收。SPI接口使用单独的电源(VIO),其被设定为主逻辑电平。功耗与吞吐量成正比。

AD7949采用20引脚微型LFCSP封装,工作温度范围为-40°C至+85°C。

上面说了这么多,其实就几点

  • 8通道、14bit、逐次逼近型ADC
  • 8通道输入可选择单端输入、差分输入或双极性输入
  • 基准电压可选 2.5V或4.096V
  • 内部自带温度传感器
  • 内部自带滤波器
  • 可选择单通道采样或顺序连续采样
  • SPI接口配置寄存器,读取ADC转换结果,SPI接口兼容SPI、QSPI和DSP

二、引脚

下图是数据手册里的详细介绍
image.png
根据上图说明,可以总结为以下几点

  • REF 基准电压,可选内部基准源 2.5V 或 4.096V 基准电压
  • IN0-IN7 ADC采样的8个通道
  • CNV 转换输入,此引脚接SPI接口的CS引脚
  • DIN 数据输入,此引脚接SPI接口的MOSI引脚,主要用来配置芯片内部CFG寄存器
  • SCK 时钟输入,此引脚接SPI接口的SCLK时钟引脚
  • SDO 数据输出,此引脚接SPI接口的MISO引脚,接受ADC转换后的数据

三、设计参考电路

AD7949在设计时单个通道一般采用运放和其相连,配置好参考电压,使用电容去耦。

而外部驱动则使用SPI接口

  • CNV :转换输入(连接MCU的片选引脚),在上升沿CNV启动转换
  • DIN:数据输入,此输入用于写入14位配置寄存器
  • SCK:串行时钟输入,此输入用于为MSB优先方式在SDO上输出数据,以及在DIN上输入数据来提供时钟
  • SDO:串行数据输出。转换结果将通过此引脚引出,与SCK进行同步,单极性模式下,转换结果为二进制

image.png

四、内部寄存器

AD7949的内部寄存器为14位寄存器,CFG[13:0],可以在转换期间、采集期间或转换全程写入寄存器

而寄存器更新发生在转换tconv(最大值)结束时

注意了,这个也是一个需要特别注意的点,上电时CFG寄存器没有定义,需要两次伪转换以便更新寄存器

另外也可以使用工厂预加载CFG寄存器,应使DIN处于高电平并且保持两次转换的时间,即重置CFG寄存器,CFG[13:0] = 0x3FFF;

下图为数据手册对CFG寄存器的详细介绍,介绍的非常详细
image.png

AD7949的配置一般为

  • CFG[13] CFG CFG寄存器是否更新。覆盖寄存器的内容
  • CFG[12:10] INCC 一般选择单极性参考地
  • CFG[9:7] INX 根据自己的采样通道配置
  • CFG[6] BW 是否选择低通滤波器,配置带宽
  • CFG[5:3] REF 基准电压,根据自己实际的参考基准电压配置
  • CFG[2:1] SEQ 通道序列器,是否允许IN0-IN7的方式扫描通道,如果自己只有几个通道就可不选,这是7949通道序列器采样
  • CFG[0] RB CFG寄存器是否回读,一般不选

五、读写时序

芯片内部的寄存器通过SPI接口写入,同时ADC转换后的结果将通过SDO接口输出
下图是关于SPI读写寄存器的详细介绍
image.png

无繁忙指示器和繁忙指示器?

可看下图,有无繁忙指示器,就是在SDO(ADC数据输出)时接了一个监测繁忙的引脚,这个引脚应该是接入单片机的中断引脚,监测数据是否就绪,是否可以读取

而我们一般使用的是无繁忙指示器的时序,下文也只针对无繁忙指示器的时序进行说明
image.png
image.png

时序

下图是无繁忙指示器的通用时序
通用时序又分为转换期间读取/写入(RDC)、转换后读取/写入(RAC)、转换全程读取/写入(RSC)
image.png
通过时序可以看到,无论何种读取/写入模式,上电之后的前三次转换结果都是没有定义的,因为最高有效CFG直到第二个EOC之后才出现,所以需要两次伪转换

这个怎么理解呢,看下图
image.png
写入CFG三次,第一次是n,第二次是n+1,第三次是n+2
再CFG是n+2的时候,这个时候的DATA才是DATA(n),也就是说在读取数据时,要写入三次CFG,前两次无效,第三次出现有效数据,这个时候就可以读取数据。

六、通道序列器

AD7949包括一个通道序列器,可用于重复扫描通道。确定序列的最后一个通道后,以逐个或成对方式扫描通道,包括或不包括温度传感器

简单来说是什么呢,这个模式可以重复扫描通道

再看这种模式的时序,上电时只读一次寄存器,空读一次数据,即可实现多通道一起读取,这种模式很适合于多通道一起读取,且写寄存器读数据花费时间较短,极大缩短ADC采样时间,很方便。
image.png

如何使用这种方式
在配置CFG寄存器时,把这个模式打开
image.png
然后在读取时,写一次寄存器内容,空读一次,后面多通道即可一起读取

七、部分demo

单通道采样

bsp_adc_reg_write(CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN0 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE);
bsp_adc_reg_write(CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN0 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE);
bsp_adc_reg_write(CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN0 | BW_FULL | REF_IN_4V096 | SEQ_DISABLE | RB_DISABLE);
adc = bsp_adc_data_read();

通道序列器采样

// 上电初始化 写一次寄存器  空读一次
bsp_adc_reg_write(CFG_OVERWRITE | INCC_UNIPOLAR_TO_GND | IN2 | BW_FULL | REF_IN_4V096 | SEQ_SCAN | RB_DISABLE);
bsp_adc_data_read(); 

//后面就顺序读取
adc1 = bsp_adc_data_read();

adc2 = bsp_adc_data_read();

八、参考

ADI官网介绍的非常清楚,数据手册和参考资料都可以从其上下载

AD7949 数据手册和产品信息 | 亚德诺(ADI)半导体

九、后期计划更新

  • AD7606 16bit 200k
    • SPI 接口读取ADC转换后的数据
    • 并口方式读取ADC转换后的数据
  • ADS1118 16bit
    • SPI接口读取ADC转换后的数据

总结

我在项目初期,也是疯狂网上查资料,看有无前人或大佬对这款芯片做一个介绍或者是参考代码等,可是没有。后来没办法呀,只能自己研究数据手册,一个一个字的看,看了好几遍才明白这款芯片的工作原理和工作模式等。

还是要自己多对数据手册研究研究,其实也不是想的那么难,在看数据手册的同时,最主要的还是要关注

  • 芯片内部引脚
  • 芯片内部寄存器
  • 芯片工作模式
  • 芯片外部接口
  • 芯片读写时序
  • 一些基本的知识
文章来源:https://blog.csdn.net/cyaya6/article/details/135586420
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。