在实际项目中,仅靠单片机内部的ADC采样,很有可能达不到实际采样精度,这个时候就需要外接外部ADC芯片进行采样,这些外部ADC一般都是SPI接口或者是并口。
单片机通过SPI接口或并口读写芯片内部寄存器,配置参考极性、采样通道、低通滤波器带宽、基准电压源、通道序列器等。
本文主要对ADI家的14bit、8通道、250k的ADC7949
做一个总结,这款ADC在实际项目中使用,采样精度达到要求,读取时序有点点绕,但是是一款十分常用的ADC芯片。就是价格不太友好哈哈,一块芯片快60。
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。
上面说了这么多,其实就几点
下图是数据手册里的详细介绍
根据上图说明,可以总结为以下几点
AD7949在设计时单个通道一般采用运放和其相连,配置好参考电压,使用电容去耦。
而外部驱动则使用SPI接口
AD7949的内部寄存器为14位寄存器,CFG[13:0],可以在转换期间、采集期间或转换全程写入寄存器
而寄存器更新发生在转换tconv(最大值)结束时
注意了,这个也是一个需要特别注意的点,上电时CFG寄存器没有定义,需要两次伪转换以便更新寄存器
另外也可以使用工厂预加载CFG寄存器,应使DIN处于高电平并且保持两次转换的时间,即重置CFG寄存器,CFG[13:0] = 0x3FFF;
下图为数据手册对CFG寄存器的详细介绍,介绍的非常详细
AD7949的配置一般为
芯片内部的寄存器通过SPI接口写入,同时ADC转换后的结果将通过SDO接口输出
下图是关于SPI读写寄存器的详细介绍
可看下图,有无繁忙指示器,就是在SDO(ADC数据输出)时接了一个监测繁忙的引脚,这个引脚应该是接入单片机的中断引脚,监测数据是否就绪,是否可以读取。
而我们一般使用的是无繁忙指示器的时序,下文也只针对无繁忙指示器的时序进行说明
下图是无繁忙指示器的通用时序
通用时序又分为转换期间读取/写入(RDC)、转换后读取/写入(RAC)、转换全程读取/写入(RSC)
通过时序可以看到,无论何种读取/写入模式,上电之后的前三次转换结果都是没有定义的,因为最高有效CFG直到第二个EOC之后才出现,所以需要两次伪转换
这个怎么理解呢,看下图
写入CFG三次,第一次是n,第二次是n+1,第三次是n+2
再CFG是n+2的时候,这个时候的DATA才是DATA(n),也就是说在读取数据时,要写入三次CFG,前两次无效,第三次出现有效数据,这个时候就可以读取数据。
AD7949包括一个通道序列器,可用于重复扫描通道。确定序列的最后一个通道后,以逐个或成对方式扫描通道,包括或不包括温度传感器
。
简单来说是什么呢,这个模式可以重复扫描通道
再看这种模式的时序,上电时只读一次寄存器,空读一次数据,即可实现多通道一起读取,这种模式很适合于多通道一起读取,且写寄存器读数据花费时间较短,极大缩短ADC采样时间,很方便。
如何使用这种方式
在配置CFG寄存器时,把这个模式打开
然后在读取时,写一次寄存器内容,空读一次,后面多通道即可一起读取
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)半导体
我在项目初期,也是疯狂网上查资料,看有无前人或大佬对这款芯片做一个介绍或者是参考代码等,可是没有。后来没办法呀,只能自己研究数据手册,一个一个字的看,看了好几遍才明白这款芯片的工作原理和工作模式等。
还是要自己多对数据手册研究研究,其实也不是想的那么难,在看数据手册的同时,最主要的还是要关注