ADC

ADC代表模数转换器(Analog-to-Digital Converter),是一种电子设备或电路,用于将模拟信号转换为数字信号。模拟信号是连续变化的信号,如电压、电流或温度,而数字信号是离散的信号,由一系列数字值表示。ADC的主要作用是将模拟信号转化为数字形式,以便数字电子设备能够处理、存储和分析这些信号。

随着技术的进步,低功耗物联网(IoT)和边缘/云计算需要更精确的数据传输。图1展示的无线监测系统是一个带有24位模数转换器(ADC)的高精度数据采集系统。在此我们通常会遇到这样一个问题,即微控制单元(MCU)能否为数据转换器提供高速的串行接口。

本文描述了设计MCU和ADC之间的高速串行外设接口(SPI)关于数据事务处理驱动程序的流程,并简要介绍了优化SPI驱动程序的不同方法及其ADC与MCU配置。本文还详细介绍了SPI和直接存储器访问(DMA)关于数据事务处理的示例代码。最后,本文演示了在不同MCU(ADuCM4050、MAX32660)中使用相同驱动程序时ADC的吞吐率。

1.png

图1. 状态监控。

通用SPI驱动程序简介

通常,MCU厂商会在例程代码中提供通用的SPI驱动程序/API。通用SPI驱动程序/API通常可以涵盖大多数用户的应用,这些代码可能包含许多配置或判断语句。但在某些特定情况下,比如ADC数据采集,通用的SPI驱动程序可能无法满足ADC数据的全速的吞吐速率需求,因为通用的驱动程序中有过多的配置,而未使用的配置会产生额外的开销并导致时间延迟。

2.png

图2. 通用API的配置。

设计思路与实践框架

我们通常会选择低功耗高性能的MCU作为主机通过SPI提取ADC的输出数据。但是,由于ADI的SPI驱动程序的数据事务处理命令存在冗余,因此数据输出速率可能被显著降低。为了充分释放ADC的潜在速率,本文使用ADuCM4050和AD7768-1进行实验并尝试可能的解决方案。尽管在使用默认滤波器的情况下,ADuCM4050的最大数据输出速率可达256 kHz,但在当前情况下,其速率被限制在8 kHz。提高输出速率的潜在解决方案包括删除不必要的命令以及激活DMA控制器。本文将在以下小节中介绍这些思路。

3.png

图3. 不同ODR以及DRDY与SCLK之间的关系。

以MCU作为主机

ADuCM4050 MCU是一款主时钟速率为26 MHz的超低功耗微控制器,内核为ARM® Cortex®-M4F处理器。ADuCM4050配有三个SPI,每个SPI都有两个DMA通道(接收和发射通道)可与DMA控制器连接。DMA控制器和DMA通道可实现存储器与外设之间的数据传输。这是一种高效的数据分配方法,可将内核释放以处理其他任务。

以ADC作为从机

AD7768-1是一款24位低功耗、高性能的Σ-Δ ADC。其数据输出速率 (ODR)和功耗模式均可根据用户的要求进行配置。ODR由抽取系数和功耗模式共同决定,如表1中所示。

4.png

表1. 数据输出速率的功耗模式配置

AD7768-1的连续读取模式也是该产品的一个重要特性。ADC的输出数据存储在寄存器0x6C中。一般而言,每次读/写操作之前,ADC寄存器中的数据都需要地址才可以访问,但是连续读取模式则支持在收到每个数据就绪信号后直接从0x6C寄存器提取数据。ADC的输出数据为24位的数字信号,对应的电压如表2 所示。

5.png

表2. 数字输出码和模拟输入电压

引脚连接示意图

ADuCM4050和AD7768-1组成的数据事务处理示例模型的引脚连接如图4所示。

6.png

图4. AD7768-1和ADuCM4050的接口引脚连接。

ADC的复位信号引脚RST_1连接至MCU的GPIO28,而数据就绪信号引脚DRDY_1则连接至MCU的GPIO27。其余引脚则根据通用的SPI配置标准进行连接,其中MCU为主机,而ADC为从机。SDI_1接收MCU发送的ADC寄存器读/写命令,而DOUT_1则将ADC的输出数据发送至MCU。

数据事务处理的实现

中断数据事务处理

为实现连续数据事务处理,本文将MCU的GPIO27引脚(连接至ADC 的DRDY_1引脚)用作中断触发引脚。ADC将数据就绪信号发送至 GPIO27时会触发MCU包含数据事务处理命令的中断回调函数。如图5所示,数据采集必须在中断A和中断B之间的时间间隔内进行。

7.png

图5. 两次中断的时间间隔。

利用ADI的SPI驱动程序可以在ADC和MCU之间轻松实现数据事务处理。但是,由于驱动程序内存在冗余命令,ADC的ODR会被限制在8 kHz。本文尽可能地精简了代码以加快ODR,将介绍实现DMA 数据事务处理的两种方法:基本模式的DMA事务处理和乒乓模式 的DMA事务处理。

基本模式的DMA事务处理

在实现每个DMA事务处理之前需要对SPI和DMA进行配置(参见图6 中的示例代码)。SPI_CTL为SPI配置,其值为0x280f,源于ADI的SPI 驱动程序的设定值。SPI_CNT为传输字节数。由于每个DMA事务处理只能发送固定的16位数据,因此SPI_CNT必须是2的倍数。本例设置SPI_CNT为4,以满足ADC的24位的输出数据要求。SPI_DMA寄存器为SPI的DMA使能寄存器,设定其值为0x5以使能DMA接收请求。命令pADI_DMA0->EN_SET=(1<<5)使能第五个通道的DMA,即SPI0 RX。

8.png

图6. 基本DMA事务处理模式的代码。

每个DMA通道都有一个DMA结构寄存器,如表3中所示。需要指出的是,这里的数据来源地址的结尾(即SPI0 Rx,亦即来源端指针SRC_END_PTR)在整个操作期间无需增加,因为Rx FIFO会自动 将寄存器中的数据推送出去。另一方面,数据目标地址的结尾(即目标端指针DST_END_PTR)根据ADI的SPI驱动程序的使用函数计算得出,即目标地址+ SPI_CNT -2。

9.png

表3. DMA结构寄存器

当前地址为内部数组缓冲区的地址。DMA控制数据配置CHNL_CFG 包括来源数据大小、来源地址增量、目标地址增量、剩余传输次数和DMA控制模式等设置,其值0x4D000011按照表4中所述的设置配置。

10.png

表4. 控制数据配置0x4D00011的DMA配置

SCLK时钟通过伪读取命令SPI_SPI0 -> RX启动,输出数据通过MISO 从ADC传至MCU。MOSI上其它的数据传输可以忽略不计。一旦完成 Rx的FIFO填充,DMA请求就会生成从而激活DMA控制器,以将数据从 DMA来源地址(即SPI0 Rx FIFO)传输至DMA目标地址(即内部数组的缓冲区)。值得注意的是,SPI_DMA=0x3时会生成Tc请求。

最后,通过将当前目标地址加4的方式将目标地址用于下一个4 字节的传输。

请注意,SPI0 DMA通道的pADI_DMA0->DSTADDR_CLR和pADI_ DMA0->RMSK_CLR必须在首次中断触发之前在主函数中设置。前一个为DMA通道目标地址减量使能清零寄存器,用于在增量模式下设置每次DMA传输后的目标地址移位(目标地址计算函数仅在增量模式下有效)。后一个为DMA通道请求屏蔽清零寄存器,用于将通道的DMA请求状态清零。

基本模式的DMA事务处理时间图如图7a所示。图中三个时隙分别代表DRDY信号、SPI/DMA设置和DMA数据事务处理。在该模式中,CPU的空闲时间较多,因此希望DMA控制器在处理数据传输时能将任务分配给CPU。

11.png

图7. (a)基本模式DMA和(b)乒乓模式的时间图。

乒乓模式的DMA事务处理

在执行伪读取命令后,DMA控制器会开始数据事务处理,从而使得MCU的CPU处于空闲状态而不处理任何任务。如果能够让CPU和 DMA控制器同时工作,那么任务处理就从串行模式转变为并行模式。这样,就可以同时进行DMA配置(通过CPU)以及DMA数据事务处理(通过DMA控制器)。为实现这一思路,需要设置DMA控制器处于乒乓模式。乒乓模式将两组DMA结构进行了整合:主结构和备用结构。每次DMA请求时,DMA控制器会在两组结构之间自动切换。变量p的初始设置为0,其值表示是主DMA结构(p = 0) 还是备用DMA结构(p = 1)负责数据事务处理。如果p = 0,则在收到伪读取命令时启动主DMA结构进行数据事务处理,同时会为备用DMA结构分配值,使其在下一个中断周期内负责数据事务处理。如果p = 1,则主结构和备用结构的作用互换。当仅有主结构处于基本DMA模式时,在DMA事务处理期间对DMA结构的修改会失败。乒乓模式使得CPU能够访问和写入备用DMA结构,而DMA控制器可以读取主结构,反之亦然。如图7b所示,由于DMA的结构配置是在最后一个周期内完成的,因此在DRDY信号从ADC传送至 MCU后DMA数据事务处理可以被立即执行,使得CPU和DMA同时工作而无需等待。现在,ADC的ODR得到了提升空间,因为总的工作时间已大大缩短。

中断处理程序的优化

两次DRDY信号之间的时间间隔不仅包括了中断回调函数的命令执行时间,还包括了ADI的GPIO中断处理函数的命令执行时间。

当MCU启动时,CPU会运行启动文件(即startup.s)。所有事件的处理函数均在该文件中定义,包括GPIO中断处理函数。一旦触发GPIO中断,CPU就会执行中断处理函数(即ADI的GPIO驱动程序中的GPIO_A_INT_HANDLER和GPIO_B_INT_HANDLER)。通用的中断处理函数会在所有的GPIO引脚中搜索触发中断的引脚并清零其中断状态、运行回调函数。由于DRDY是本文应用的唯一中断信号,因此可以对函数进行简化以加快进程。可选的解决方案包括 (1)在启动文件中重新定位目标,以及(2)修改原始的中断处理函数。重新定位目标意味着自定义中断处理函数,并替换启动文件中的原始的中断处理函数。

而修改原始的中断处理函数只需要添加一个自定义的GPIO驱动程序。本文采用第二种方案修改原始的中断处理函数,如图8所示。该方案只将连接至DRDY的GPIO的引脚中断状态清零,并直接转到回调函数。请注意,这里需要通过取消选择build target中关于原始GPIO驱动函数的勾选框内容来隔离原始的GPIO驱动程序。

12.png

图8. 嵌套矢量中断控制器(NVIC)。

结果

速率性能

假定现在需要读取200个24位的ADC输出数据,并且SPI位速率设置为13 MHz。将DRDY信号和SCLK信号的引脚连接至示波器,可以通过观察DRDY信号与SPI数据事务处理(亦即DMA事务处理)启动之间的时间间隔的方法可以量化本文所述的每种方法对速率的改善程度。这里将DRDY信号至SCLK信号开始的时间间隔记为∆t,那么对于13 MHz的SPI速率,测量得出的∆t为:

  • (a)基本模式DMA Δt = 3.754 μs 

  • (b)乒乓模式DMA Δt = 2.8433 μs 

  • (c)乒乓模式DMA(使用优化的中断处理函数)Δt = 1.694 μs 

方法(a)和(b)可支持64 kHz的ODR,而方法(c)可支持128 kHz的ODR。这是因为方法(c)的∆t最短,从而使得SCLK信号能够更早结束。如果 SCLK信号(即数据事务处理)能在T/2之前完成(T为当前ADC的数据输出周期),则ODR可实现翻倍。这较之于原始的ADISPI驱动程序可以达到的8 kHz的ODR性能是一次巨大的进步。

13.png

图9. (a)基本模式DMA、(b)乒乓模式以及(c)乒乓模式(使用优化的中断处理函数)的Δt。

使用MAX32660控制AD7768-1

使用主时钟速率为96 MHz的MCU MAX32660控制AD7768-1)时的结果如何?在该情况下,使用优化的中断处理函数的中断设置,可在不使用DMA函数的情况下实现256 kHz的数据输出速率。参见图10。

14.png

图10. 不使用DMA时MAX32660的ODR。

结论

本文利用选定的ADC(AD7768-1)和MCU(ADuCM4050或MAX32660)通过 SPI实现了高速的数据事务处理。为实现速率优化的目标,本文简化了ADI的SPI驱动程序执行数据事务处理。此外本文提出,激活DMA控制器释放内核也可以加快连续数据事务处理的流程。在 DMA的乒乓模式下,DMA的配置时间可通过适当的调度来节省。在此基础上,还可以通过直接指定中断引脚的方式优化中断处理函数。在13 MHz的SPI位速率下,本文提出的方案的最佳性能可达到128 kSPS的ADC ODR。

15.png

表5. 使用ADuCM405和MAX32660实现的高速SPI连接

来源:亚德诺半导体

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 24

随着技术的进步,低功耗物联网(IoT)和边缘/云计算需要更精确的数据传输。图1展示的无线监测系统是一个带有24位模数转换器(ADC)的高精度数据采集系统。在此我们通常会遇到这样一个问题,即微控制单元(MCU)能否为数据转换器提供高速的串行接口。

本文描述了设计MCU和ADC之间的高速串行外设接口(SPI)关于数据事务处理驱动程序的流程,并简要介绍了优化SPI驱动程序的不同方法及其ADC与MCU配置。本文还详细介绍了SPI和直接存储器访问(DMA)关于数据事务处理的示例代码。最后,本文演示了在不同MCU(ADuCM4050、MAX32660)中使用相同驱动程序时ADC的吞吐率。

1.png

图1. 状态监控。

通用SPI驱动程序简介

通常,MCU厂商会在例程代码中提供通用的SPI驱动程序/API。通用SPI驱动程序/API通常可以涵盖大多数用户的应用,这些代码可能包含许多配置或判断语句。但在某些特定情况下,比如ADC数据采集,通用的SPI驱动程序可能无法满足ADC数据的全速的吞吐速率需求,因为通用的驱动程序中有过多的配置,而未使用的配置会产生额外的开销并导致时间延迟。

2.png

图2. 通用API的配置。

设计思路与实践框架

我们通常会选择低功耗高性能的MCU作为主机通过SPI提取ADC的输出数据。但是,由于ADI的SPI驱动程序的数据事务处理命令存在冗余,因此数据输出速率可能被显著降低。为了充分释放ADC的潜在速率,本文使用ADuCM4050和AD7768-1进行实验并尝试可能的解决方案。尽管在使用默认滤波器的情况下,ADuCM4050的最大数据输出速率可达256 kHz,但在当前情况下,其速率被限制在8 kHz。提高输出速率的潜在解决方案包括删除不必要的命令以及激活DMA控制器。本文将在以下小节中介绍这些思路。

3.png

图3. 不同ODR以及DRDY与SCLK之间的关系。

以MCU作为主机

ADuCM4050 MCU是一款主时钟速率为26 MHz的超低功耗微控制器,内核为ARM® Cortex®-M4F处理器。ADuCM4050配有三个SPI,每个SPI都有两个DMA通道(接收和发射通道)可与DMA控制器连接。DMA控制器和DMA通道可实现存储器与外设之间的数据传输。这是一种高效的数据分配方法,可将内核释放以处理其他任务。

以ADC作为从机

AD7768-1是一款24位低功耗、高性能的Σ-Δ ADC。其数据输出速率 (ODR)和功耗模式均可根据用户的要求进行配置。ODR由抽取系数和功耗模式共同决定,如表1中所示。

表1. 数据输出速率的功耗模式配置

4.png

AD7768-1的连续读取模式也是该产品的一个重要特性。ADC的输出数据存储在寄存器0x6C中。一般而言,每次读/写操作之前,ADC寄存器中的数据都需要地址才可以访问,但是连续读取模式则支持在收到每个数据就绪信号后直接从0x6C寄存器提取数据。ADC的输出数据为24位的数字信号,对应的电压如表2 所示。

表2. 数字输出码和模拟输入电压

5.png

引脚连接示意图

ADuCM4050和AD7768-1组成的数据事务处理示例模型的引脚连接如图4所示。

6.png

图4. AD7768-1和ADuCM4050的接口引脚连接。

ADC的复位信号引脚RST_1连接至MCU的GPIO28,而数据就绪信号引脚DRDY_1则连接至MCU的GPIO27。其余引脚则根据通用的SPI配置标准进行连接,其中MCU为主机,而ADC为从机。SDI_1接收MCU发送的ADC寄存器读/写命令,而DOUT_1则将ADC的输出数据发送至MCU。

数据事务处理的实现

中断数据事务处理

为实现连续数据事务处理,本文将MCU的GPIO27引脚(连接至ADC 的DRDY_1引脚)用作中断触发引脚。ADC将数据就绪信号发送至 GPIO27时会触发MCU包含数据事务处理命令的中断回调函数。如图5所示,数据采集必须在中断A和中断B之间的时间间隔内进行。

7.png

图5. 两次中断的时间间隔。

利用ADI的SPI驱动程序可以在ADC和MCU之间轻松实现数据事务处理。但是,由于驱动程序内存在冗余命令,ADC的ODR会被限制在8 kHz。本文尽可能地精简了代码以加快ODR,将介绍实现DMA 数据事务处理的两种方法:基本模式的DMA事务处理和乒乓模式 的DMA事务处理。

基本模式的DMA事务处理

在实现每个DMA事务处理之前需要对SPI和DMA进行配置(参见图6 中的示例代码)。SPI_CTL为SPI配置,其值为0x280f,源于ADI的SPI 驱动程序的设定值。SPI_CNT为传输字节数。由于每个DMA事务处理只能发送固定的16位数据,因此SPI_CNT必须是2的倍数。本例设置SPI_CNT为4,以满足ADC的24位的输出数据要求。SPI_DMA寄存器为SPI的DMA使能寄存器,设定其值为0x5以使能DMA接收请求。命令pADI_DMA0->EN_SET=(1<<5)使能第五个通道的DMA,即SPI0 RX。

8.png

图6. 基本DMA事务处理模式的代码。

每个DMA通道都有一个DMA结构寄存器,如表3中所示。需要指出的是,这里的数据来源地址的结尾(即SPI0 Rx,亦即来源端指针SRC_END_PTR)在整个操作期间无需增加,因为Rx FIFO会自动 将寄存器中的数据推送出去。另一方面,数据目标地址的结尾(即目标端指针DST_END_PTR)根据ADI的SPI驱动程序的使用函数计算得出,即目标地址+ SPI_CNT -2。

表3. DMA结构寄存器

9.png

当前地址为内部数组缓冲区的地址。DMA控制数据配置CHNL_CFG 包括来源数据大小、来源地址增量、目标地址增量、剩余传输次数和DMA控制模式等设置,其值0x4D000011按照表4中所述的设置配置。

表4. 控制数据配置0x4D00011的DMA配置

10.png

SCLK时钟通过伪读取命令SPI_SPI0 -> RX启动,输出数据通过MISO 从ADC传至MCU。MOSI上其它的数据传输可以忽略不计。一旦完成 Rx的FIFO填充,DMA请求就会生成从而激活DMA控制器,以将数据从 DMA来源地址(即SPI0 Rx FIFO)传输至DMA目标地址(即内部数组的缓冲区)。值得注意的是,SPI_DMA=0x3时会生成Tc请求。

最后,通过将当前目标地址加4的方式将目标地址用于下一个4 字节的传输。

请注意,SPI0 DMA通道的pADI_DMA0->DSTADDR_CLR和pADI_ DMA0->RMSK_CLR必须在首次中断触发之前在主函数中设置。前一个为DMA通道目标地址减量使能清零寄存器,用于在增量模式下设置每次DMA传输后的目标地址移位(目标地址计算函数仅在增量模式下有效)。后一个为DMA通道请求屏蔽清零寄存器,用于将通道的DMA请求状态清零。

基本模式的DMA事务处理时间图如图7a所示。图中三个时隙分别代表DRDY信号、SPI/DMA设置和DMA数据事务处理。在该模式中,CPU的空闲时间较多,因此希望DMA控制器在处理数据传输时能将任务分配给CPU。

11.png

图7. (a)基本模式DMA和(b)乒乓模式的时间图。

乒乓模式的DMA事务处理

在执行伪读取命令后,DMA控制器会开始数据事务处理,从而使得MCU的CPU处于空闲状态而不处理任何任务。如果能够让CPU和 DMA控制器同时工作,那么任务处理就从串行模式转变为并行模式。这样,就可以同时进行DMA配置(通过CPU)以及DMA数据事务处理(通过DMA控制器)。为实现这一思路,需要设置DMA控制器处于乒乓模式。乒乓模式将两组DMA结构进行了整合:主结构和备用结构。每次DMA请求时,DMA控制器会在两组结构之间自动切换。变量p的初始设置为0,其值表示是主DMA结构(p = 0) 还是备用DMA结构(p = 1)负责数据事务处理。如果p = 0,则在收到伪读取命令时启动主DMA结构进行数据事务处理,同时会为备用DMA结构分配值,使其在下一个中断周期内负责数据事务处理。如果p = 1,则主结构和备用结构的作用互换。当仅有主结构处于基本DMA模式时,在DMA事务处理期间对DMA结构的修改会失败。乒乓模式使得CPU能够访问和写入备用DMA结构,而DMA控制器可以读取主结构,反之亦然。如图7b所示,由于DMA的结构配置是在最后一个周期内完成的,因此在DRDY信号从ADC传送至 MCU后DMA数据事务处理可以被立即执行,使得CPU和DMA同时工作而无需等待。现在,ADC的ODR得到了提升空间,因为总的工作时间已大大缩短。

中断处理程序的优化

两次DRDY信号之间的时间间隔不仅包括了中断回调函数的命令执行时间,还包括了ADI的GPIO中断处理函数的命令执行时间。

当MCU启动时,CPU会运行启动文件(即startup.s)。所有事件的处理函数均在该文件中定义,包括GPIO中断处理函数。一旦触发GPIO中断,CPU就会执行中断处理函数(即ADI的GPIO驱动程序中的GPIO_A_INT_HANDLER和GPIO_B_INT_HANDLER)。通用的中断处理函数会在所有的GPIO引脚中搜索触发中断的引脚并清零其中断状态、运行回调函数。由于DRDY是本文应用的唯一中断信号,因此可以对函数进行简化以加快进程。可选的解决方案包括 (1)在启动文件中重新定位目标,以及(2)修改原始的中断处理函数。重新定位目标意味着自定义中断处理函数,并替换启动文件中的原始的中断处理函数。

而修改原始的中断处理函数只需要添加一个自定义的GPIO驱动程序。本文采用第二种方案修改原始的中断处理函数,如图8所示。该方案只将连接至DRDY的GPIO的引脚中断状态清零,并直接转到回调函数。请注意,这里需要通过取消选择build target中关于原始GPIO驱动函数的勾选框内容来隔离原始的GPIO驱动程序。

12.png

图8. 嵌套矢量中断控制器(NVIC)。

结果

速率性能

假定现在需要读取200个24位的ADC输出数据,并且SPI位速率设置为13 MHz。将DRDY信号和SCLK信号的引脚连接至示波器,可以通过观察DRDY信号与SPI数据事务处理(亦即DMA事务处理)启动之间的时间间隔的方法可以量化本文所述的每种方法对速率的改善程度。这里将DRDY信号至SCLK信号开始的时间间隔记为∆t,那么对于13 MHz的SPI速率,测量得出的∆t为:

  • (a)基本模式DMA Δt = 3.754 μs 

  • (b)乒乓模式DMA Δt = 2.8433 μs 

  • (c)乒乓模式DMA(使用优化的中断处理函数)Δt = 1.694 μs 

方法(a)和(b)可支持64 kHz的ODR,而方法(c)可支持128 kHz的ODR。这是因为方法(c)的∆t最短,从而使得SCLK信号能够更早结束。如果 SCLK信号(即数据事务处理)能在T/2之前完成(T为当前ADC的数据输出周期),则ODR可实现翻倍。这较之于原始的ADISPI驱动程序可以达到的8 kHz的ODR性能是一次巨大的进步。

13.png

图9. (a)基本模式DMA、(b)乒乓模式以及(c)乒乓模式(使用优化的中断处理函数)的Δt。

使用MAX32660控制AD7768-1

使用主时钟速率为96 MHz的MCU MAX32660控制AD7768-1)时的结果如何?在该情况下,使用优化的中断处理函数的中断设置,可在不使用DMA函数的情况下实现256 kHz的数据输出速率。参见图10。

14.png

图10. 不使用DMA时MAX32660的ODR。

结论

本文利用选定的ADC(AD7768-1)和MCU(ADuCM4050或MAX32660)通过 SPI实现了高速的数据事务处理。为实现速率优化的目标,本文简化了ADI的SPI驱动程序执行数据事务处理。此外本文提出,激活DMA控制器释放内核也可以加快连续数据事务处理的流程。在 DMA的乒乓模式下,DMA的配置时间可通过适当的调度来节省。在此基础上,还可以通过直接指定中断引脚的方式优化中断处理函数。在13 MHz的SPI位速率下,本文提出的方案的最佳性能可达到128 kSPS的ADC ODR。

表5. 使用ADuCM405和MAX32660实现的高速SPI连接

15.png

来源:ADI智库

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 19

一、限幅滤波法
1、方法:

  • 根据经验判断两次采样允许的最大偏差值(设为A)

  • 每次检测到新值时判断:

a. 如果本次值与上次值之差<=A,则本次值有效

b. 如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值

2、优点:

  • 能有效克服因偶然因素引起的脉冲干扰

3、缺点

  • 无法抑制那种周期性的干扰

  • 平滑度差

/* A值根据实际调,Value有效值,new_Value当前采样值,程序返回有效的实际值 */
#define A 10char Value;
char filter()
{    
    char new_Value;    
    new_Value = get_ad(); // 获取采样值    
    if( abs(new_Value - Value) > A)           
        return Value;     // abs()取绝对值函数    
        return new_Value;
}

二、中位值滤波法

1、方法:

  • 连续采样N次(N取奇数),把N次采样值按大小排列

  • 取中间值为本次有效值

2、优点:

  • 能有效克服因偶然因素引起的波动干扰

  • 对温度、液位的变化缓慢的被测参数有良好的滤波效果

3、缺点:

  • 对流量、速度等快速变化的参数不宜

#define N 11char filter()
{    
    char value_buf[N];    
    char count, i, j, temp;    
    for(count = 0; count < N; count ++) //获取采样值    
    {        
        value_buf[count] = get_ad();        
        delay();    
    }    
    for(j = 0; j < (N-1); j++)    
    {        
        for(i = 0; i < (n-j); i++)        
        {            
            if(value_buf[i] > value_buf[i+1])            
            {                
                temp = value_buf[i];                
                value_buf[i] = value_buf[i+1];                
                value_buf[i+1] = temp;            
            }        
        }    
    }    
    return value_buf[(N-1)/2];
}

三、算术平均滤波法

1、方法:

  • 连续取N个采样值进行算术平均运算

  • N值较大时:信号平滑度较高,但灵敏度较低

  • N值较小时:信号平滑度较低,但灵敏度较高

  • N值的选取:一般流量,N=12;压力:N=4

2、优点:

  • 适用于对一般具有随机干扰的信号进行滤波

  • 这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动

3、缺点:

  • 对于测量速度较慢或要求数据计算速度较快的实时控制不适用

  • 比较浪费RAM

#define N 12
char filter()
{    
    int sum = 0;    
    for(count = 0; count < N; count++)    
    {        
        sum += get_ad();    
    }     
    return (char)(sum/N);
}

四、递推平均滤波法

1、方法:

  • 把连续取N个采样值看成一个队列

  • 队列的长度固定为N

  • 每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)

  • 把队列中的N个数据进行算术平均运算,就可获得新的滤波结果

  • N值的选取:流量,N=12;压力:N=4;液面,N=4 ~ 12;温度,N=1 ~ 4

2、优点:

  • 对周期性干扰有良好的抑制作用,平滑度高

  • 适用于高频振荡的系统

3、缺点:

  • 灵敏度低

  • 对偶然出现的脉冲性干扰的抑制作用较差

  • 不易消除由于脉冲干扰所引起的采样值偏差

  • 不适用于脉冲干扰比较严重的场合

  • 比较浪费RAM

/* A值根据实际调,Value有效值,new_Value当前采样值,程序返回有效的实际值 */
#define A 10
char Value;
char filter()
{    
    char new_Value;    
    new_Value = get_ad(); // 获取采样值    
    if( abs(new_Value - Value) > A)           
        return Value;     // abs()取绝对值函数    
    return new_Value;
}

五、中位值平均滤波法

1、方法:

  • 相当于“中位值滤波法”+“算术平均滤波法”

  • 连续采样N个数据,去掉一个最大值和一个最小值

  • 然后计算N-2个数据的算术平均值

  • N值的选取:3~14

2、优点:

  • 融合了两种滤波法的优点

  • 对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差

3、缺点:

  • 测量速度较慢,和算术平均滤波法一样

  • 比较浪费RAM

char filter()
{    
    char count, i, j;    
    char Value_buf[N];    
    int sum = 0;    
    for(count = 0; count < N; count++)    
    {        
        Value_buf[count] = get_ad();    
    }     
    for(j = 0; j < (N-1); j++)    
    {        
        for(i = 0; i < (N-j); i++)        
        {            
            if(Value_buf[i] > Value_buf[i+1])            
            {                
                temp = Value_buf[i];                
                Value_buf[i] = Value_buf[i+1];                
                Value_buf[i+1] = temp;            
            }        
        }      
    }        
    for(count = 1; count < N-1; count ++)    
    {        
        sum += Value_buf[count];    
    }    
    return (char)(sum/(N-2));
}

六、限幅平均滤波法

1、方法:

  • 相当于“限幅滤波法”+“递推平均滤波法”

  • 每次采样到的新数据先进行限幅处理,

  • 再送入队列进行递推平均滤波处理

2、优点:

  • 融合了两种滤波法的优点

  • 对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差

3、缺点:

  • 比较浪费RAM

#define A 10
#define N 12
char value, i = 0;
char value_buf[N];
char filter()
{    
    char new_value, sum = 0;    
    new_value = get_ad();    
    if(Abs(new_value - value) < A)          
        value_buf[i++] = new_value;    
    if(i==N)          
        i=0;    
    for(count = 0; count < N; count++)    
    {        
        sum += value_buf[count];    
    }    
    return (char)(sum/N);
}

七、一阶滞后滤波法

1、方法:

  • 取a=0~1

  • 本次滤波结果=(1-a)本次采样值+a上次滤波结果

2、优点:

  • 对周期性干扰具有良好的抑制作用

  • 适用于波动频率较高的场合

3、缺点:

  • 相位滞后,灵敏度低

  • 滞后程度取决于a值大小

  • 不能消除滤波频率高于采样频率的1/2的干扰信号

/*为加快程序处理速度,取a=0~100*/
#define a 30
char value;
char filter()
{    
    char new_value;    
    new_value = get_ad();    
    return ((100-a)*value + a*new_value);
}

八、加权递推平均滤波法

1、方法:

  • 是对递推平均滤波法的改进,即不同时刻的数据加以不同的权

  • 通常是,越接近现时刻的数据,权取得越大。

  • 给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低

2、优点:

  • 适用于有较大纯滞后时间常数的对象

  • 和采样周期较短的系统

3、缺点:

  • 对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号

  • 不能迅速反应交易系统当前所受干扰的严重程度,滤波效果差

/* coe数组为加权系数表 */
#define N 12
char code coe[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
char code sum_coe = {1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12};
char filter()
{    
    char count;    
    char value_buf[N];    
    int sum = 0;    
    for(count = 0; count < N; count++)    
    {        
        value_buf[count] = get_ad();    
    }    
    for(count = 0; count < N; count++)    
    {        
        sum += value_buf[count] * coe[count];    
    }     
    return (char)(sum/sum_coe);
}

九、消抖滤波法

1、方法:

  • 设置一个滤波计数器

  • 将每次采样值与当前有效值比较:

  • 如果采样值=当前有效值,则计数器清零

  • 如果采样值>或<当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出)

  • 如果计数器溢出,则将本次值替换当前有效值,并清计数器

2、优点:

  • 对于变化缓慢的被测参数有较好的滤波效果,

  • 可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动

3、缺点:

  • 对于快速变化的参数不宜

  • 如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入交易系统

#define N 12char filter()
{    
    char count = 0, new_value;    
    new_value = get_ad();    
    while(value != new_value)    
    {        
        count++;        
        if(count >= N)             
            return new_value;        
        new_value = get_ad();    
    }    
    return value;
}

十、限幅消抖滤波法

1、方法:

  • 相当于“限幅滤波法”+“消抖滤波法”

  • 先限幅,后消抖

2、优点:

  • 继承了“限幅”和“消抖”的优点

  • 改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统

3、缺点:

  • 对于快速变化的参数不宜

#define A 10
#define N 12
char value;
char filter(){    
    char new_value, count = 0;    
    new_value = get_ad();    
    while(value != new_value)    
    {        
        if(Abs(value - new_value) < A)        
        {            
            count++;            
            if(count >= N)                 
                return new_value;            
            new_value = get_ad();        
        }        
        return value;    
    }
}

来源:STM32嵌入式开发

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 98

本文将为大家展示国产芯片HPM6000系列ADC性能出色的测试结果并为您提供了与HPM6000系列微控制器的模数转换器ADC相关的外部电路设计建议。

在HPM6700/6400系列微控制器上,提供了3个12位ADC和1个16位ADC。在HPM6300系列微控制器上,提供了3个16位ADC。在使用到AD转换的应用中,ADC的精度会影响到整个应用系统的性能。ADC的精度并不仅仅取决于模数转换器本身,也与微控制器的外部电路设计有关。


ADC外部电路设计

HPM6000系列高性能MCU的模数转换器ADC的供电和参考相关引脚总结如下:

1.png


表1. ADC的供电和参考引脚

本章节主要提供了ADC的供电和参考引脚的硬件设计建议。

1. ADC的供电

VANA为ADC的模拟供电引脚,VANA上的噪声有可能影响到ADC的精度。因此建议用户设计电路时,对HPM6000系列微控制器的VANA引脚谨慎处理。如条件允许,应采用单独的线性稳压器对VANA供电。推荐用户选择3.3V输出、供电电流大于50mA的LDO。


2.png

图1. VANA供电首选方案

如上图所示,HPM6000系列高性能微控制器支持单3.3V供电,可以对所有供电引脚提供统一的3.3V,对以下电源供电引脚:

  •  DCDC_IN,片上DCDC的供电引脚,片内DCDC提供1.1V的核心电压输出

  •  VPMC,电源管理域的外设供电引脚

  •  VIO_Bxx,各个IO Bank的供电引脚

这些供电引脚提供了微控制器整体功耗的主要部分,因此推荐用户使用效率更高的DCDC开关电源为之供电,对于不同系列产品,电源设计输出电流应有不小于1A的输出能力。


VANA的供电建议与其他电源引脚供电分开,以降低开关电源的噪声对模拟电路的影响,建议使用输出纹波更小的线性稳压器LDO对VANA供电,并在尽可能靠近VANA引脚的位置,并联1个4.7uF和1个0.1uF的电容用于滤波,注意电容应连接到模拟地。 

用户如果出于种种因素,没有条件实现使用单独的线性稳压器对VANA供电,可以参考下图的次选方案:

3.png

图2. VANA供电次选方案

VANA应当通过0欧姆的电阻或磁珠单点连接到微控制器的3.3V供电电源,并在尽可能靠近VANA引脚的位置,并联1个4.7uF和1个0.1uF的电容到模拟地用于滤波。VANA供电的次选方案对电源噪声相比推荐方案稍敏感,但是用到的电源器件较为节省,如果用户对ADC的性能要求不严格,可以采用次选供电方案。

2. ADC的参考

VREFH是模数转换器ADC的高位参考电压输入。VREFH的稳定直接影响到ADC的转换精度和抗噪声特性。建议用户采用独立的基准电压模块,提供VREFH,如下图所示:

4.png

 图3. VREFH首选方案

建议用户使用外部的基准电压模块提供VREFH,并在尽可能靠近VREFH引脚的位置,并联1个4.7uF和1个0.1uF的电容到模拟地用于滤波。

注意,VREFH的电压不要超过VANA的供电电压。

VREFL是ADC的低位参考电压,建议直接连接到模拟地,模拟地应当通过0欧姆的电阻单点与数字地连接。

如果出于成本考虑,不使用外部基准电压模块,用户可以参考以下VREFH次选方案:

5.png

图4. VREFH次选方案

VREFH应当通过0欧姆的电阻或磁珠单点连接到微控制器的VANA,并在尽可能靠近VREFH引脚的位置,并联1个4.7uF和1个0.1uF的电容到模拟地用于滤波。

VREFL是ADC的低位参考电压,建议直接连接到模拟地,模拟地应当通过0欧姆的电阻单点与数字地连接。

3.ADC的模拟信号输入

ADC的模拟信号输入线路上引入的噪声会对ADC的转换精度造成影响,用户可以采取以下措施,尽可能消除输入信号的噪音:

  • 尽可能减短输入信号线路的长度。

  • 避免在模拟信号线平行布置数字信号线路。

  • 如果条件允许,可以在模拟信号线两侧布置地线用作屏蔽。

  • 考虑在靠近ADC输入引脚的位置添加外部RC滤波器,注意RC滤波器的截止频率应  高于应用关心的ADC模拟输入信号的频率。

6.png

 图5. 模拟信号输入推荐

总   结

本文提供了HPM6000系列微控制器模数转换器ADC相关的硬件设计指南,ADC的参考电压和模拟供电质量直接关系到ADC的转换精度。建议用户根据应用的ADC转换精度要求,在以下几种参考方案中,选择合适的。

7.png

图6. ADC供电和参考连接方案总结

如上图所示,建议用户使用独立的线性稳压器产生VANA供电,独立的外部基准电压生成VREFH参考,以此获得最优的ADC转换精度。也可以考虑使用独立线性稳压器产生VANA和VREFH。性能最优的参考方案(前者),相比性能次优的参考方案(后者),ADC转换结果噪声降低可达约5%~10%。

对于ADC转换精度要求不严格的用户,可以使用开关电源DCDC产生MCU的全部供电。这个成本最优的参考方案,相比性能最优和性能次优的方案,ADC转换结果噪声增加可达20%~50%。

注意,ADC的转换精度受多种因素影响,各推荐方案及其效果仅供参考,建议用户根据自身应用对ADC的要求,选择合适的方案。

8.png

上图是HPM6750微控制器采用16位ADC(ADC3)以1MSPS采样率,对1.8V输入进行2万多次转换的转换结果。VREFH由外部基准电压提供,可以看到,转换结果的跳动幅度为+/-35LSB(~1.5mV)。所有转换结果的标准差为~5.58LSB。

9.png

上图是HPM6750的16位ADC(ADC3),采用标准测试方法,测试差分非线性(DNL)和积分非线性(INL)的测试结果。结果显示其16位ADC的DNL为-0.9/+1 LSB,INL为-5.2/+3.1 LSB。有兴趣的读者可以访问先楫半导体官方网站(www.hpmicro.com)查阅HPM6700/6400系列微控制器数据手册,获取完整的ADC电气特性参数。

以上为本期内容,如果您有想了解关于 HPM6000系列的其他内容,欢迎私信小编,后期会推出更多相关内容哦!

来源:先楫芯上人

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 166

本文导读

ADC的主要参数指标分为静态参数和动态参数两类,基于这两类指标,本文将对先楫半导体HPM6750 MCU片内16位ADC的精度进行全面测试,一起看看结果怎么样。

ADC参数测试原理

1.1 ADC参数

国内16位SAR型ADC芯片目前较少,MCU内置16位SAR型ADC的则更少。如何衡量ADC的性能,参考S*公司带有16位ADC的MCU芯片S**32H750手册,分为静态参数、动态参数两部分,如表 1.1、表 1.2所示。

静态参数主要有差分非线性(DNL)、积分非线性(INL),衡量ADC测量直流及低频信号时的性能。

表 1.1 ADC的静态参数(S**32H750)

1.png

动态参数主要有有效位数(ENOB)、信噪失真比(SINAD)、信噪比(SNR)、总谐波失真(THD),衡量ADC测量交流动态信号时的性能,例如测试1KHz正弦波。

表 1.2 ADC的动态参数(S**32H750)

2.png

1.2 IEEE1241标准

IEEE1241对ADC器件的指标参数和测试方法进行定义,是一种为ADC器件厂家制定的标准。ADI和TI等厂家的独立ADC芯片、MCU厂家的片内ADC,均遵循该标准的方法,进行静态参数和动态参数的测试。

IEEE1241于2000年发布,较新的版本为IEEE1241-2010。ADC测试评估的主要任务是确定其电压传输关系,理想情况下输入电压与ADC输出代码中点的传输关系是一条直线,每个输出代码的宽度相同。实际的电压传输关系不同于理想情况,IEEE1241标准给出了几种可选的测试步骤和方法。一种方法是使用斜坡电压信号,通过复杂的伺服环路系统,使用比被测ADC分辨率高得多的DAC,精确步进,得到被测ADC各个LSB的实际跳变电压。

另一种方法是使用正弦波信号,该信号必须具有比被测ADC预期信噪失真比(SINAD)至少高20 dB的总谐波失真和噪声。例如,一个理想16位ADC具有98dB的信噪比(SNR),假设没有失真,那么SINAD就为98dB。要想对该ADC进行测试,要求使用一个-118dB以上THD+N的正弦波信号。该低失真正弦信号,可以通过多阶带通滤波器实现,硬件相对简单。因此使用正弦波信号,是目前主要的ADC测试方法。

EEE1241标准的各章节中,给出了基于正弦波信号和统计直方图,实现静态参数DNL、INL,动态参数ENOB、SINAD、SNR、THD的测试方法和计算公式。

【6.4节】给出ADC电压传输关系的测试方法。使用一个幅度稍微超过ADC测量范围的纯正正弦波,输入到ADC,获取多个连续的采样数据并统计直方图,由公式(27)计算电压传输关系。

3.png

其中,T[k]是第k个二进制代码对应的电压值,Hc[k-1]是累计直方图,S是总采样点数。该节还给出了正弦波频率和ADC采样频率的选择,每次采集的数据点数,总的采集数据点数,正弦波幅度过载量要求。

【7.4.1节】给出增益误差G、失调电压Vos的测试方法和计算公式,基于对T[k]的最小二乘法拟合。

【8.2节】给出积分非线性INL的测试方法。测量值T[k]校正增益和失调误差之后,与理想值Tnom[k]相减,它们的差值代入公式(40),计算输出码k处的积分非线性ε[k]。

4.png

由公式(40)将LSB单位的INL,换算成百分比形式。

5.png

【8.4节】给出差分非线性DNL的测试方法,由公式(43)计算。当DNL[k]<0.9时,输出码k被定义为缺失码(missing code)。

6.png

【8.8节】给出总谐波失真THD的测试方法。ADC 对周期信号进行采样时,动态误差和积分非线性都会导致谐波失真,总谐波失真用于量化此类影响。总谐波是指一组目标谐波分量的均方根值(二次、三次等)与所施加信号均方根值的比值,由公式(50)计算。

7.png

该节给出了目标谐波的次数要求,由输入正弦波的最低9个谐波组成,包括第2次到第10次。用于计算的采样数据中,应该包含整数个输入正弦波周期,以最小化频谱泄漏,例如10个整周期。

【9.2~9.4节】给出SINAD、SNR、ENOB的测试方法。将指定频率和幅度的纯正正弦波输入到ADC,首选幅度接近满量程的大信号,但是不能出现削波(例如95%FS信号)。首先计算噪声和失真NAD,通过计算测量数据波形的DFT频谱,从频谱中删除直流和测试频率处的分量后,所有剩余傅立叶分量的和方根是NAD,由公式(67)计算。

8.png

通过将NAD和Arms代入公式(66),计算SINAD。

9.png

通过将NAD、Arm、THD代入公式(69)和(68),计算SNR。

10.png

11.png

通过将NAD代入公式(70),计算ENOB。其中εQ是理想的量化误差rms值,等于LSB/√12。

12.png


根据IEEE1241标准的以上计算过程和公式,编写科学计算软件代码,可以实现各参数的测量。

测试环境搭建

2.1 硬件框图

ADC测试的硬件由正弦波信号源、HPM6750测试板、USB转TTL线、U盘等组成,如图 2.1所示。正弦波信号源通过SMA连接线,连到HPM6750测试板。

13.png

图 2.1 测试环境硬件框图

静态参数测试时,需要大量采样数据,采样数据先存储在HPM6750测试板的内存中,之后多份采样数据存储到U盘中。动态参数测试时,需要的采样数据较少,采集完成之后直接通过HPM6750的UART打印,由TTL转USB线传输到电脑进行计算。

电脑上需要的软件工具如表 2.1所示。

表 2.1 测试所需的软件工具

14.png

2.2 正弦波信号源

用于测试的正弦波信号需要具有比被测ADC预期信噪失真比(SINAD)高20 dB左右的总谐波失真和噪声。一个理想16位ADC具有98dB的信噪比(SNR),如果没有失真,SINAD为98dB。因此,需要一个-118dB以上THD+N的正弦波信号对16位ADC进行测试。

本测试使用TI 的PSIEVM精密信号注入器,板上有8阶带通滤波器生成低失真正弦波,THD参数为-123dB,以符合测试要求。PSIEVM板如图 2.2所示,它的正弦波输出频率固定为2KHz,输出幅度和直流偏移电压可调,配套有PC端的GUI界面进行设置。

15.jpg

图 2.2 正弦波信号源PSIEVM板

需要注意PSIEVM板的输出阻抗,需要手工改成50Ω。

2.3 外围电路要求

HPM6750片内ADC的外围电路设计,对保证ADC的信噪比,至关重要。SAR型ADC可以等效理解为一个多输入端口的比较器,模拟电源AVDD、基准输入VREFH、接地平面、输入通道上的噪声直接影响ADC输出代码的跳动。

本测试使用专用的HPM6750测试板,如图 2.3。

16.jpg

图 2.3 HPM6750测试板

HPM6750测试板的ADC外围电路处理方式如下文所述,硬件设计时建议参考处理。

【模拟电源AVDD】通过LDO从数字电源5V获得低噪声模拟电源。需要注意LDO的电源抑制比在10kHz及以上频率时下降,导致高频纹波和尖峰噪声仍可以传导至LDO输出。建议在LDO之前加入10Ω左右电阻和磁珠与输入端10uF左右电容,形成低通滤波,滤除高频纹波与尖峰噪声。

【基准VREFH】基准电路设计包括两部分:电容选取、基准噪声。VREFH管脚位置的大电容是片内SAR型ADC的一部分,此类ADC基于开关电容电荷重新分配原理,在确定输出代码LSB过程中,需要从VREFH管脚获得瞬态电荷。例如,使用了两个10uF的X5R材质低ESR陶瓷电容和104电容并联,并且在PCB布局时以尽量短的走线和覆铜连接到VREFH管脚,电容的接地焊盘需要就进放置多个过孔至PCB接地平面,以降低连接阻抗。

基准的噪声需要选择低噪声基准。例如,使用了低成本的AZ432搭建3.1V基准,低频噪声10uVpp,典型温漂20ppm。对温漂有更高要求时,可以选用TPR3525,低频噪声50uVpp,典型温漂10ppm。

【接地平面】AGND和VREHL管脚需要就近放置过孔,连接到接地平面。PCB布局时需要把模拟器件、数字器件分区域放置,引导数字信号的开关电流不流经模拟电路的低平面,以避免串入数字开关噪声。详细地平面设计说明参考资料[6]。

【输入通道】需要注意,本测试中输入通道不能有普通电容,普通电容的容量随输入电压变化,使得低通截止频率变化,会引入明显失真。正常使用时,输入通道需要限制信号带宽,例如加入RC低通滤波,限制宽带噪声。

使用以上处理,HPM6750测试板的测试数据详见5.1节的表5.1。

静态参数测试

3.1 测试条件

使用正弦波输入信号,基于概率密度原理和累计直方图测试DNL、INL。当输入信号是理想正弦波时,ADC以固定频率采集,所输出数字代码的出现概率,理论上为固定值,如图 3.1所示。出现概率通过某一数字代码的出现次数,除以总采样点数计算。各个输出数字代码的测试出现概率,与理想出现概率之间的差值,是这个代码的宽度误差。统计最大宽度误差,得到差分非线性DNL。得到DNL之后,DNL的累计误差是积分非线性INL。

17.png

图 3.1 正弦波输入时的ADC输出代码直方图

图 3.1的直方图高度非线性,不能直接计算,通过累计直方图实现积分计算,可以实现直方图线性化(参考资料[3])。IEEE1241标准6.4、7.4、8.2、8.4节,给出了以上基于正弦波信号和概率密度直方图方法的计算过程、公式、及测试条件。

结合IEEE1241中6.4节要求,本测试实际使用测试条件设置如图 3.1所示。

表 3.1 静态参数测试条件

18.png

【输入信号幅度】IEEE1241的6.4节描述,输入信号幅度需要轻微超出ADC测量范围,过载量根据输入噪声而定。因为在输入正弦波的波峰、波谷位置,ADC两个临近输出代码对应的输入电压差小,容易受噪声影响。本测试中,选用10%过载量,根据ADC输入范围0~3.1V,PSIEVM输出正弦波幅度设置为-0.3~3.4V,offset设置为1.55V。

【ADC采样速率】IEEE1241的6.4.1节描述,采样速率和输入信号频率必须互为质数,实现均匀遍历到所有的ADC输出代码。本测试中,输入正弦波频率2KHz,采样速率664Ksps,每个周期获得332个采样点,具有332个不同输出代码,通过小数位频率和大量采样点,实现均匀遍历所有的输出代码。

【采样点数】IEEE1241的6.4.1节描述,每一次采集的连续采样点数,包含整数个输入信号周期。这样保证每次的采样点在0~2π的相位上均匀分布。因为会使得多次采集的数据进行拼接时,输出代码的出现概率均匀分布。本测试中,每次采样点数约120K。

IEEE1241的6.4.3节描述,根据概率密度进行测试时,样本数量与测试精度、置信度的计算公式。本测试中使用大约30M采样点进行计算,存储在U盘中。

3.2 测试步骤

静态参数测试时,单次的连续采样数据,MCU先存储在HPM6750测试板的内存中,然后顺序存到U盘中,将多份采样数据拼接成几十兆采样点的数据记录文件,用于参数计算。测试的步骤如下。

(1) PC上位机设定正弦波信号源PSIEVM的频率频率、幅度、失调,使能输出;

(2) Segger Embedded Studio环境中启动ADC采集数据,并存储到U盘;

(3) U盘中的数据记录文件复制到电脑,数据文件的路径写入科学计算软件;

(4) 运行科学计算软件代码计算DNL、INL;

(5) 查看科学计算软件输出的图表和数据。

3.3 测试数据

本测试中从U盘读取的33M采样数据文件大小为128MB,导入科学计算软件获得的输出代码直方图如图 3.2所示,其中横轴X为ADC的输出代码值,纵轴Y为该代码的出现次数,以对数坐标显示。可以看到图 3.2包含了0~65535个输出代码,符合16位ADC的输出代码个数。

19.png

图 3.2 采样数据直方图

3.3.1 DNL

采样数据通过科学计算软件计算得到的DNL,如图 3.3所示,DNL最大值为+1.1~-0.92LSB。

20.png

图 3.3 DNL测试数据

3.3.2 INL

采样数据通过科学计算软件计算得到的INL,如图 3.4所示,INL最大值为+4~-4.2LSB。

21.png

图 3.4 INL测试数据

3.3.3 小结

根据以上测试数据,HPM6750片内16位ADC测得DNL为+1.1/-0.92LSB,INL为+4/-4.2LSB。

动态参数测试

4.1 测试条件

使用正弦波输入信号,基于FFT频谱分析,从频谱成分计算出SINAD、ENOB、SNR、THD参数。将噪声和谐波成分等效到ADC输入端,根据理想ADC的信噪比公式,可以得到有效位数ENOB。IEEE1241的9.2~9.4节,描述基于FFT方法的ENOB等参数计算过程、公式、及测试条件。

22.png

结合IEEE1241要求,本测试实际使用测试条件设置如表 1.1所示。

表 4.1 动态参数测试条件

23.png

【输入信号幅度】IEEE1241的9.2.3节描述,输入信号幅度接近ADC的满量程,但是不能出现削波。因为信噪比SNR和失真THD直接和输入信号幅值相关,但是幅度过大,接近削波时,将出现明显失真。本测试中选用93%FS,根据ADC输入范围0~3.1V,PSIEVM输出正弦波幅度设置为0.0775~3.0225V,offset设置为1.55V。

【采样速率】IEEE1241的9.3节描述,可选相干采样,或非相干采样加窗。本测试中选用后者,为了衡量ADC性能,采样速率选用最高值2MSPS。

【采样点数】IEEE1241的9.4.3节描述,采样点数增加时,随机噪声对正弦波测试结果的影响降低,可重复性更好。采样点数不应过多,以免正弦波信号源或ADC时钟信号中的频率漂移或相位噪声影响结果。本测试中选用20个整周波采样点数,即20K samples。

4.2 测试步骤

动态参数测试时,采样数据需要较少,ADC采集20个输入信号周期的连续数据,采集完成之后通过HPM6750的UART打印,通过TTL转USB线传输到电脑进行计算。

(1) PC上位机设定正弦波信号源PSIEVM的频率频率、幅度、失调,使能输出;

(2) Segger Embedded Studio环境中启动ADC采集数据,并通过UART打印;

(3) 采样数据文件的路径写入科学计算软件;

(4) 运行科学计算软件代码计算ENOB等参数;

(5) 查看科学计算软件输出的图表和数据。

4.3 测试数据

本测试中从UART打印20K点数据,导入科学计算软件看到的原始数据波形如图 4.1所示,可以看到波形幅值接近满量程。

24.png

图 4.1 动态参数测试数据的原始波形

4.4 ENOB、SINAD、SNR、THD

通过科学计算软件计算输出的频谱如图 4.2,蓝色是输入信号,红色是谐波,黑色是噪声。

25.png

图 4.2 动态参数测试数据的频谱

通过科学计算软件计算输出的动态参数值如表 4.2。需要注意动态参数测试与噪声相关,容易受干扰,需参考2.3节的描述仔细设计ADC外围电路。

表 4.2 动态参数测试数据

26.png

HPM6750片内16位ADC的采样速率最高可以设置至4MSPS,这种情况下的动态参数测试值如表 4.3。可以看到,ENOB等参数有一定幅度下降,需要更高采样速率而不是更高精度时,可以选择使用该设置。

表 4.3 动态参数测试数据(4MSPS)

27.png

4.5 小结

根据以上测试数据,HPM6750片内16位ADC在2MSPS最高采样速率下,测得ENOB为12.1位,SINAD为74.6dB,SNR为74.7dB,THD为-88.9dB。

采样速率最高可支持至4MSPS,测得ENOB为11位。

测试总结

5.1 实测参数与手册参数对比

汇总以上测试数据,HPM6750片内16位ADC的静态参数和动态参数如表 5.1所示。表中与HPM6750手册中的参数进行了对比,可以看到实测参数基本与手册符合。

表 5.1 实测参数与手册参数

28.png

如下表,静态参数部分与国外领先厂家的同类型SOC片内16位ADC参数进行对比。HPM6750的静态参数较好,DNL优于对比型号。INL约为±4LSB,优于S**32H750,与Lxx553x接近。

表 5.2 与国外厂家的静态参数对比

29.png

如下表,动态参数部分与国外领先厂家的同类型SOC片内16位ADC参数进行对比。HPM6750的动态参数与对比型号基本在同一水平,ENOB为12.1位,S**32H750为12.2位,Lxx553x为11.8位。

表 5.3 与国外厂家的动态参数对比

30.png

通过以上对比,HPM6750片内16位ADC的实测数据具有与同类型号S**32H750、Lxx553x几乎等同的性能,ENOB有效位数为12位,INL较好约±4LSB。

5.2 有效位数的区别

对于高分辨率ADC,关注实际能做到多少位,但是大部分情况下不具备搭建IEEE1421中正弦波测试环境的条件,测试有效位数ENOB。通常使用测量DC电压的方式,统计输出数据不跳动的位数,检查ADC的无噪声分辨率NFR。需要区分无噪声分辨率NFR,不等同于手册中的有效位数ENOB。NFR是测量直流或低频信号时,所关注的不跳动位数,而ENOB是测量交流动态信号关注的有效位数。NFR测量的是噪声的峰峰值,但没有包括ADC的非线性,ENOB测量的是噪声的均方值,还包括了ADC的非线性。高速ADC的手册中通常只标注动态参数ENOB,没有标注NFR,但是在ADC的非线性远小于噪声的峰峰值的情况下,可以从动态参数ENOB,估算能够获得的NFR。

【无噪声分辨率NFR的测试方法及计算】无噪声分辨率衡量ADC能够测量到最小直流信号,测试方法:输入端接地,或连接到一个通过大电容深度去耦低噪声的直流电压,然后采集大量采样点,并将其表示为直方图。外围电路设计良好时,等效到ADC输入端的噪声为白噪声,直方图呈正态分布。直方图的代码分布个数,表示峰峰值噪声,对应无噪声分辨率。

【有效位数ENOB的测试方法及计算】有效位数衡量ADC能够测量到的最小交流信号。测试方法:输入正弦信号,对采样数据进行FFT分析,计算所有噪声(包括量化噪声)和失真项的和方根值SINAD,并等效为ADC输入噪声,代替SNR,根据理想N位ADC的理论SNR公式,换算位数N。

SNR = 6.02N + 1.76dB

【通过ENOB估算NFR】根据参考资料[5],针对交流输入信号的ENOB,与直流低频信号的无噪声分辨率NFR,有如下的换算关系:

ENOB = NFR+0.92

对于直流低频信号,ADC的ENOB约比NFR大1位(0.92位)。但是以上计算过程,没有考虑ADC非线性,外围电路噪声、以及输入信号噪声影响,是理想情况下能获得的无噪声分辨率NFR。实际电路中,NFR与外围电路直接相关,ADC外围AVDD管脚、VFEFH管脚、接地平面,以及直流输入信号自身的噪声,均会直接影响ADC输出代码跳动,需要仔细设计外围电路和PCB(参考资料[6]),才能获得预期的无噪声分辨率。

测量直流低频信号时,除了硬件措施,对高速ADC输出代码做数字平均滤波,是提高无噪声分辨率的有效方法。HPM6750片内16位ADC,做数字平均之后的无噪声分辨率如表 5.4所示。被测的信号是一节1.5V干电池,可以看到平均4次之后,NFR为11位以上;平均32次之后,NFR为12位以上。

表 5.4 HPM6750数字平均之后的无噪声分辨率

31.png

 参考资料

[1] IEEE Standard for Terminology and Test Methods for Analog-to-Digital Converters.IEEE Std 1241-2010.

[2] Histogram Measurement of ADC Nonlinearities Using Sine Waves.Jerome Blair,1994.

[3] Full-Speed Testing of A/D Converters.Joey Doernberg ,1984.

[4] ADC Input Noise: The Good, The Bad, and The Ugly. Is No Noise Good Noise.ADI,Analong Dialogue 40-02,February(2006) .

[5] 高速模数转换器精度透视(第二部分).ADI,技术文章.

[6] 第二章 ADC信号调理电路设计.周立功 ,面向AMetal框架与接口的编程(上)。

来源:立功科技

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 3576

1、概述

ME32 系列是内嵌 ARM Cortex™ M0 核的 32 位微控制器。该系列控制器由敏矽微电子有限公司自主开发,并具有自主知识产权。敏矽微电子的微控制器通用功能有高精度 ADC,UART 串口,SPI 接口,I2C 总线接口,看门狗定时器(WDT),通用计数器/定时器和马达控制功能模块。

ME32 系列 ADC 采用 SAR(电容式渐次逼近)设计,具有采样转换速度快,成本低特点。但 SRA ADC 在使用上与传统的ADC 有一些差别,我们就此做一些讨论(以下整理的资料来源于网上)。

2、SAR ADC 原理

ME32 微控制器中嵌入的 ADC 使用 SAR(逐次逼近寄存器)原理,可以分以下步骤执行转换。每个转换步数等于 ADC 转换器中的位数,而每一步都由 ADC 时钟驱动,每个 ADC 时钟输出产生一位结果。所有 ADC 内部设计基于开关电容技术。下面给出的示例仅显示了 ADC 近似逼近工作原理的第一步,但该过程将一直持续到达到 LSB 为止。

1.png

2.png

3.png

4.png

5.png

6.png

3、环境对 ADC 转换结果的影响

3.1 ADC 参考电压噪声

由于 ADC 输出是模拟信号电压和参考电压之间的比率,模拟参考上的任何噪声都会导致转换后的数字值发生变化。部分封装采用 VDDA 模拟电源作为参考电压(VREF+),因此 VDDA 电源的质量对 ADC 误差有影响。例如,当模拟基准电压为 3.3 V

(VREF+=VDDA)和 1 V 信号输入时,转换结果为:

(1/3.3)×4095=0x4D9

然而,当模拟基准电压为 40 mV 峰间纹波时,转换值变为:

(1/3.34)×4095=0x4CA(VREF+在其峰值处)

Error=0x4D9–0x4CA=15lsb

因此我们可以得出,参考电压噪声对 ADC 转换精度至关重要。而开关电源通常采用内部快速开关功率晶体管,这会在输出中引入高频噪声,开关噪声在 15 千赫至 1 兆赫之间。

3.2 参考电压/供电电源

电源调节对于 ADC 精度非常重要,因为转换结果是模拟输入电压与 VREF+值的比值。如果在连接到 VDDA 或 VREF+时,由于这些输入上的负载及其输出阻抗而导致电源输出降低,则会在转换结果中引入错误。

转换结果=VAIN(2N-1)/VRef+,其中 N 是 ADC 的分辨率(在我们的情况下 N=12)。如果参考电压改变,数字结果也会改变。例如:如果所使用的电源是 3.3 V 的参考电压,而 VAIN=1 V,则数字输出为:如果电源提供的电压等于 3.292 V(在其输出连接到 VREF+之后),则:电压降引入的错误为:0x4DC–0x4D9=3 LSB

3.3 参考电压解耦和阻抗

参考电压源必须具有低输出阻抗,以在各种负载条件下提供标称电压。输出阻抗的电阻和电感部分都很重要。在模数转换器转换过程中,参考电压是连接到开关电容网络的。在连续近似(一个近似周期对应于一个 ADC 时钟周期)期间,该网络的电容器在很短的时间内从/到参考电压充电/放电,因此参考电压必须为电容器提供高电流峰值。在每个近似周期结束时,电容器上的电压必须稳定(参考电压的零电流)。因此,参考电压必须具有非常低的输出阻抗,包括低电感(以便在非常短的时间内提供高电流峰值)。寄生电感可以防止充电过程在接近周期结束时完全完成,或者在 LC 电路中出现振荡(寄生电感与电容网络一起)。在这种情况下,近似循环的结果是不准确的。所以参考电压上正确的去耦电容器必须非常靠近管脚,提供低源阻抗。

3.4 外部参考电压参数

如果使用外部参考电压源(在 VREF+pin 上),则该外部参考电压源有重要参数。必须考虑三种参考电压规格:温度漂移、电压噪声、长期稳定性。

3.5 模拟输入信号噪声

小但频率高的信号变化在采样时会导致较大的转换误差。这种噪音是由电机、发动机点火装置、电源线等电气设备产生的。它通过添加不需要的信号来影响源信号(如传感器)。因此,ADC 转换结果也会不准确。

3.6 ADC 动态范围与最大输入信号幅度不匹配

要获得最大 ADC 转换精度,ADC 动态范围与要转换信号的最大幅度匹配非常重要。假设要转换的信号在 0 V 和 2.5 V 之间变化,且 VREF+等于 3.3 V。ADC 转换的最大信号值为 3102(2.5 V),如图所示。在这种情况下,有 993 个未使用的转换(4095–3102=993)。这意味着转换信号精度的损失。

7.png

3.7 模拟信号源电阻的影响

模拟信号源的阻抗,或源和管脚之间的串联电阻(RAIN),由于流入管脚的电流而引起电压下降。内部采样电容器(CADC)的充电由带电阻的开关控制。随着源电阻的增加(使用 RADC),保持电容器完全充电所需的时间增加。下图显示了模拟信号源电阻效应。

8.png

CADC 的有效充电受 RADC+RAIN 控制,充电时间常数为 tc=(RADC+RAIN)×CADC。如果采样时间小于通过 RADC+RAIN(ts<tc)向 CADC 完全充电所需的时间,则由 ADC 转换的数字值小于实际值。

3.8 信号源电容和 PCB 寄生电容的影响

转换模拟信号时,必须考虑源极电容和模拟输入引脚上的寄生电容。源极电阻和源极电容构成 RC 网络。此外,除非外部电容器(CAIN+Cp)完全充电至输入电压水平,否则 ADC 转换结果可能不准确。(CAIN+Cp)值越大,源频率越受限。源端的外电容和寄生电容分别用 CAIN 和 Cp 表示。

9.png

3.9 注入电流效应

任何模拟管脚(或紧密定位的数字输入管脚)上的负注入电流可能会将泄漏电流引入 ADC 输入。最坏的情况是相邻的模拟信道。当 VAIN<VSS 时引入负注入电流,导致电流从 I/O 引脚流出。

10.png

3.10温度影响

温度对 ADC 的精度有很大的影响。主要导致两大误差:偏移误差漂移和增益误差漂移。这些错误可以在微控制器固件中进行补偿

3.11I/O 管脚串扰

由于 I/O 之间的电容耦合,切换 I/O 可能会在 ADC 的模拟输入中产生一些噪声。串扰可能是由相互靠近或相互交叉的 PCB 磁道引起的。内部交换数字信号和 I/O 引入高频噪声。切换 I/O 输入输出可能会导致电源中的电压骤降,这是由电流浪涌引起的。穿过 PCB 上模拟输入轨迹的数字轨迹可能会影响模拟信号。

11.png

3.12电磁干扰引起的噪声

来自邻近电路的电磁辐射可能会在模拟信号中引入高频噪声,因为 PCB 轨迹可能像天线一样工作。

12.png

4、硬件设计

4.1 系统供电电源及 ADC 参考电源要求

虽然 MCU 可以工作从 2.2V~5.5V 宽电压范围,但电源的噪声对 MCU 的正常工作还是至关重要的,好供电电源设计,系统便成功了一半。系统电源必须至少有一个 10uF 的稳压电容和一个 0.1uF 的去藕电容,而且在 PCB 布板时去藕电容必须最大限度的靠近 MCU 的 VDD 管脚。

由于 ADC 使用 VREF+或 VDDA 作为模拟基准,并且数字值是模拟输入信号与该电压基准的比值,因此电源应具有良好的线路和负载调节。因此,VREF+必须在不同负载下保持稳定,接通电路的一部分增加负载,电流的增加决不能导致电压降低。如果电压在较宽的电流范围内保持稳定,则该电源具有良好的负载调节能力。

例如,对于 LD1086D2M33 电压调节器,当输入电压从 2.8 伏到 16.5 伏(Iload=10 毫安)变化时,线路调节率为 0.035%,当 Iload 从 0 到 1.5 安变化时,负载调节率为 0.2%(详情请参阅 LD1086 系列数据表)。线路调节值越低,调节效果越好。同样,负载调节值越低,电压输出的调节性和稳定性越好。也可以使用 VREF+的参考电压,例如 LM236,它是 2.5v 的电压参考二极管(有关更多详细信息,请参阅 LM236 数据表)。

参考电压源设计必须提供低输出阻抗(静态和动态)。寄生串联电阻和电感必须最小化。参考电压上的正确去耦电容器位于非常靠近管脚的位置,提供低参考电压源阻抗。

13.png

4.2 ADC 信号源

4.2.1添加外部滤波器

添加外部 RC 滤波器可消除高频。处理频率成分高于感兴趣频率范围的信号不需要昂贵的滤波器。在这种情况下,一个相对简单的低通滤波器,其截止频率 fC 刚好高于感兴趣的频率范围,就足以限制噪声和混叠。与最高关注频率一致的采样率就足够了,通常是 fC 的 2 到 5 倍

4.2.2添加白噪声或三角扫描以提高分辨率

该方法将硬件技术和软件技术相结合,提高了测量精度。从软件的角度来看,该方法使用平均(过采样),从硬件的角度来看,它使用信号修改/扩频/抖动。在输入信号有噪声(为了能够计算平均值,需要对信号进行一些改变)并且要求获得信号的平均值的情况下,可以使用平均值。当输入信号是一个非常稳定的无噪声电压时就会出现问题。在这种情况下,当测量输入信号时,每个数据样本是相同的。这是因为输入信号电平介于两个 ADC 字电平之间(例如,在 0x14A 和 0x14B 之间)。因此,无法更精确地确定输入电压电平(例如,如果电平接近 0x14A 或接近 0x14B 电平)。解决方案是向输入信号添加噪声或一些信号变化(具有均匀的信号分布,例如三角形扫描),输入信号将其电平推过 1 位 ADC 电平(以便信号电平在 0x14A 以下和 0x14B以上变化)。这会导致 ADC 结果发生变化。将软件平均应用于不同的 ADC 结果,产生原始输入信号的平均值。作为一个例子,该方法可以通过使用与输入信号耦合的三角形发生器来实现(白噪声的产生更为复杂)。必须注意不要修改原始输入信号的平均值(因此,必须使用电容耦合)。下图是微控制器直接生成的准三角形源的一个非常简单的实现。

14.png

4.2.3小信号/弱信号考虑

对于小信号/弱信号(电阻分压的电池电压信号,NTC 信号),由于信号内阻大,最好的办法是在 MCU 外部采用运放(OP),对信号进行增益和加强,从而一劳永逸解决信号的噪声和易受干扰等问题。但出于成本的压力和本身对测量精度要求不高,信号也变化缓慢,这时候可以加入一个 0.1u~1u 的电容,来消除 ADC 转换时由于信号弱对测量精度的影响。

4.2.4电阻分压信号源与参考电压的一致性问题

对电阻分压信号源(如 NTC)来讲,ADC 输入端口的电容和分压电阻可能会导致与电源电压的变化形成相位差,如果电源电压正好是 ADC 的参考电压,那么电源的波动就可能使参考电压和信号不匹配,测量的结果也是不准确的。所以减小分压电阻和 AD 端口的电容来缩小相位差是非常必要的。采用 NTC 时,建议分压电阻不要超过 10K,AD 端口电容在 0.1u。

4.3 PCB 注意事项

VDDA 管脚的滤波电容要大于 0.1u,噪声大时加大到 1u。

信号源远离强电和大电流信号,避免与其他高频信号并行行成串扰。

ADC 信号尽可能采用地和电源进行屏蔽。

5、软件采样

有如下几个方法可以用来提高 ADC 转换和采样的精度:

  • 平均样本

–平均会降低速度,但可以提高精度

  • 数字滤波(直流值 50/60Hz 抑制)

–设置了适当的采样频率(定时器触发在这种情况下很有用)。

–对采样数据进行软件后处理(例如 50 Hz 的梳状滤波器噪声及其谐波抑制)。

  • 交流测量的快速傅里叶变换(FFT)

–这种方法允许在测量信号中显示谐波部分。

–由于使用了更多的计算能力,因此速度较慢。

  • ADC 校准:偏移、增益、位重校准

ADC 校准减少内部 ADC 错误。然而,内部 ADC 结构必须知道。

  • 最小化 CPU 内部和系统受控部分噪声

必须设计应用程序

–在 ADC 转换过程中使用来自微控制器的最小干扰。

–尽量减少采样和转换过程中的数字信号变化(数字沉默)。

5.1 平均法

平均是一种简单的技术,在这里你可以对一个模拟输入进行多次采样,然后用软件计算结果的平均值。这种技术有助于在模拟电压不经常变化的情况下消除噪声对模拟输入的影响。必须对几个读数进行平均,这些读数都对应于相同的模拟输入电压。确保在转换完成的时间段内,模拟输入保持在相同的电压,否则您将累积对应于不同模拟输入的数字值,并且您将引入错误。

另外抛弃一些明显的因干扰而突变的结果(最低最高法则),对使用平均法也是非常有利的。

5.2 用于交流测量的 FFT

在某些特定情况下,应用程序需要知道带有给定频率。在这种情况下,交流信号的有效值也可以通过使用相对较慢的采样速度

(与测量的信号频率相比)。

例如,当测量交流电源信号时(接近正弦且具有相对较低的谐波含量),足以选择 32 次采样频率大于电源频率(50 赫兹)。

在这种情况下,高达 15 阶的谐波可以获得。主信号中 15 次谐波的振幅很小(下一次阶次谐波可以忽略不计)。电源信号的

计算有效值为由于谐波的有效值被加到总交流谐波值为:

15.png

因此,如果第 15 次谐波振幅仅为第 1 次谐波(50 赫兹)的 1%(0.01),则其对总有效值的贡献仅为 0.01%(因为上述公式得出:0.01 2=0.0001)。因此,该方法的原理是用已知频率对交流信号进行采样然后对每个测量周期的 FFT 进行后处理。因为每个测量信号周期的采样点数量很小(例如 32 个点),则 FFT 处理所需的性能并不高(例如,仅 32 点 FFT)。该方法适用于低失真信号的交流测量。这个缺点是它需要精确的信号采样:

•测量信号的频率必须已知,且 ADC 采样频率必须精确设置为测量频率的 2N 倍增。

•输入信号频率通过另一种方法测量。

•通过对预分频器和 MCU 主控器进行编程,调整 ADC 采样频率时钟选择(如果使用不准确的时钟执行采样,则插值可以用于在要求的点处获取样品)。

5.3 最小化内部 CPU 噪声

当 CPU 工作时,它产生大量的内部和外部信号变化通过电容耦合传输到 ADC 外围设备。这种干扰影响 ADC 精度(由于不同的微控制器操作而产生的不可预测的噪声)。为了最小化 CPU(和其他外围设备)对 ADC 的影响,有必要尽量减少采样和转换期间的数字信号变化(数字静音)。这是使用以下方法之一完成(在采样和转换期间应用):

  • 最小化 I/O 管脚更改

  • 最小化内部 CPU 更改(CPU 停止、等待模式)

  • 为不必要的外围设备(计时器、通信……)停止时钟

  • 选择系统相对安静的时候进行采样

来源:敏矽MCU

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 120

概述 

 

AT32的微控制器内置最多三个高级12位片上SAR模拟数字转换器(ADC)并提供自校准功能,用于提高环境条件变化时的ADC精度。在涉及模数转换的应用中,ADC精度会影响整体的系统质量和效率。为了提高此精度,必须了解ADC相关的运作和影响精度的原因。

SAR ADC使用一个采样电容充电至输入信号电压,SAR逻辑对此电压做数据转换。然而,这个ADC内的采样电容是由外部的信号源直接充电的,也因着采样电容值、输入阻抗、还有外部线路影响,需要一段充电稳定时间来保证对输入信号电压量测的准确性。为达到好的ADC量测,必需设置足够的采样时间。否则,前一次在某一输入通道转换所残余在采样电容上的电荷,会影响目前正在进行转换通道的准确性。ADC精度不仅取决于ADC性能和功能,还取决于ADC周围的整体应用设计。此应用笔记旨在帮助用户如何设置正确软、硬件使ADC达到准确的量测,也提供相关应用上的注意事项。

ADC的误差来源及其误差最小化办法 

 

本章列出了影响ADC转换精度的主要误差。这些类型的误差存在于所有ADC中,转换质量将取决于它们的消除情况。为便于参考,将精度误差以LSB为单位来表达。就电压而言,通过将LSB数乘以1 LSB对应的电压来计算电压误差(1 LSB=VREF+/4096或VDDA/4096)。

ADC自身误差

 

ADC自身误差为ADC本身设计和制造时所产生本体的误差,这类误差通常由以下静态参数显示:微分线性误差(DNL)、积分线性误差(INL)、偏移误差(OE)、增益误差(GE)、和总未调整误差(TUE)。AT32微控制器数据手册的ADC特性部分规定了这些误差的定义和值。其中TUE为实际和理想传输曲线间的最大偏离,此参数指定可能发生的会导致理想数字输出与实际数字输出之间最大偏离误差。(注意TUE不是DNL、INL、OE、与GE之和,它可能源自同时发生的一种或多种误差。)

AT32 ADC自校准功能可以补偿偏移误差,在ADC使用前先进行一次自校准可保证在数据手册揭示范围的任何环境条件之下,TUE小于4 LSB,也就是保证12位ADC静态准确度(accuracy)可达10位以上。

至于ADC的动态参数(如:ENOB)及其代表的误差程度,通常在语音和特定音频应用才会考虑,在一般MCU的应用场合不会太重视,在本文中也不于讨论。

ADC环境导致的误差

 

参考电压/电源噪声

由于ADC转换值为模拟信号电压(VAIN)与参考电压之比(VREF+),因此VREF+上的任何噪声都会导致转换后数字值的变化。在某些封装中,VDDA模拟电源被用作参考电压(VREF+),因此VDDA电源的质量会影响ADC误差。VREF+几十mV的波动就会造成十几LSB的误差。

就供电侧噪声而言,开关式电源模块通常内置快速切换功率晶体管,这会在输出中产生高频噪声,此切换噪声介于15 kHz至1 MHz之间,也需留意。线性稳压器的输出质量更佳。如果使用切换电源,建议使用线性稳压器供应模拟级。建议在电源线和地线之间连接具有优良高频特性的电容。应在靠近电源的位置安装一个0.1 μF和一个1至10 μF的电容。这些电容允许直流信号通过它们。小值电容过滤高频噪声,高值电容过滤低频噪声。要过滤高频噪声,还可使用与电源串联的铁氧体电感器(ferrite bead)。由于线的串行电阻极低,此解决方案导致的直流损失极低(可忽略不计),除非电流很大。

微控制器端VDD和VSS引脚的安装位置很接近,因此可以在尽量靠近的位置通过极短的引线将电容连接到微控制器。VDDA和VREF+引脚必须连接到两个外部去耦电容,100 nF陶瓷电容加上1 μF钽电容或陶瓷电容。注意数字地与模拟地应相互隔离,避免噪声串扰。

图1. 具有VREF引脚封装的电源和参考去耦

图2. 无VREF引脚封装的电源和参考去耦

GPIO输入电压电平超出常规

AT32F403系列、AT32F413系列、和AT32F415系列作为具有ADC输入功能的任一GPIO引脚,输入的电压不能超过VDD+0.3V(VDDA与VDD须同电位),否则会由芯片内部干扰ADC输入信号。只要是ADC输入功能的GPIO,即使只当I/O输入用途,如果输入的电压超过VDD+0.3V,也会干扰其它ADC通道转换结果。如果存在此种高电压,建议使用电阻分压或减压到小于VDD的电压范围。

其它AT32型号MCU则没有以上限制(例如:AT32F403A、AT32F407、AT32F421、AT32F435/437等系列),所有具有ADC输入功能的GPIO引脚都是耐5V引脚。这类引脚在未使用作ADC输入信号而作为数字输入时,需设置为浮空输入、输入上拉、或输入下拉模式,就可以输入高于VDD的电压而不干扰ADC的操作。但使用者仍需注意输入电压不可超出5.5V。但作为ADC输入使用设置为模拟模式时,则失去耐5V特性,使用者需注意输入电压不可超出VDD+0.3V。

在GPIO引脚输入负电压也会干扰ADC的转换。注意输入电压不可低于-0.3V。

模拟输入信号噪声

在采样时间内,小而高频率的信号变化可导致较大转换误差。此噪声由电气设备(例如电机、发动机点火、电源线)生成。它增加了不需要的信号,因此会影响模拟输入源信号(例如:传感器)。这样一来,导致ADC转换结果不准确。
  • 采样平均滤波

此方法是一个简单的技巧,即通过软件对模拟输入多次采样,取所有结果的均值。当模拟电压不频繁变化时,此技巧有助于消除模拟输入上的噪声。如果被测模拟信号产生不稳定的ADC值,软件运算时则可以通过剔除大值和小值,选择适当数量的待平均样本执行平均。此数量取决于需要的精度、最低转换速度。
平均滤波法的优势是可以在无任何硬件变更的情况下提高ADC精度。它的缺点是转换速度和频率响应较慢,相当于降低了有效采样频率。
平均滤波法也针对不同需求发展出各样差别,如:限幅滤波、中位值滤波、递推平均滤波、消抖滤波及其组合等等的算法。使用者可根据信号特性和芯片资源选择合适的数据平均方式。
  • 添加外部滤波器

添加外部RC滤波器以消除高频。无需使用昂贵的滤波器来处理频率分量高于所涉频率范围的信号。这种情况下,截止频率fC刚好高于所涉频率范围的相对简单的低通滤波器将足以限制噪声和混叠。使用与所涉最高频率相同的采样率足以,通常为fC的2至5倍。

但添加了外部RC滤波器时,ADC的采样时间和采样间隔都需要重新评估,否则可能造成更大的量测误差。请详细参考第3章内容。

模拟信号源阻抗的影响

在源和引脚之间的模拟信号源的阻抗或串联电阻(RAIN),可能会因为采样时流入或流出引脚的电流而导致其上的电压瞬间改变,这时ADC内部采样保持电容充满电所需要的时间会延长。如果采样时间短于将内部采样电容充分充放电所需的时间,则ADC转换的数字值会与实际值有徧差。

关于模拟信号源具有高输入阻抗特性或加入RC滤波器时,ADC的测量设置请详细参考第3章内容。

CPU生成的内部噪声

CPU(以及其他外设)操作时,会产生大量内部和外部信号变化,这些变化通过电容耦合传输到ADC外设。此类干扰影响ADC精度。

为使CPU(以及其他外设)对ADC的影响最小化,必须使采样和转换期间的数字信号变化量最小化(数字静默)。使用下列方法之一可以实现这一点(在采样和转换时间内实现):

  • 内部CPU变化量最小化(CPU停止,等待模式)

  • 停止非必要外设(计时器、通信等)的时钟
 

温度影响

温度对ADC精度有重要影响。它主要产生两种重要误差:偏移误差漂移和增益误差漂移。建议使用内部温度传感器和ADC看门狗,以在温度变化达到给定值时重新校准ADC。

I/O引脚串扰

由于I/O之间的电容耦合,切换I/O可能会在ADC的模拟输入中产生一些噪声。彼此距离很近或交叉的PCB走线可能会产生串扰。内部切换数字信号和I/O会产生高频噪声。由于电流浪涌,切换高灌电流I/O可能导致电源电压小幅下降。

PCB上与模拟输入走线交叉的数字走线可能影响模拟信号。通过让接地走线来屏蔽模拟信号,可以减少串扰产生的噪声。PCB布线时,应考虑对ADC输入信号给予屏蔽,可在信号线周围铺铜并就近接地,同时应尽量缩短走线距离。另外在ADC采样和转换时间内实现I/O引脚变化量最小化,对减小对ADC的干扰很有帮助。

 

EMI产生的噪声

邻近电路产生的电磁辐射可能在模拟信号中产生高频噪声,此时PCB走线相当于天线接收干扰噪声。使用者可以通过在可能的发射源和接收器之间提供物理隔离,或通过适当的接地和屏蔽措施对它们进行电气隔离。

沿敏感模拟信号布置接地走线,在PCB上提供屏蔽。双层PCB的另一侧也应具有接地板。这样可以防止干扰和I/O串扰影响信号。应使用屏蔽线缆将远距离信号(例如:传感器)连接到PCB或注意尽可能缩短PCB上信号的路径长度。晶振、时钟以及存在快速变化的信号线尽量远离ADC输入信号。

ADC输入源阻抗对测量的影响和正确的设置方式 

 
SAR ADC的量测要求设置足够的采样时间让ADC内采样电路充分充、放电,以获得转换的准确性。多通道间切换的使用也是同样道理,足够的采样时间可以避免输入通道间的交互干扰(crosstalk)。为了计算估计的采样时间,图3给出一个能近似ADC采样线路的等效阻值和容值(包含:模拟多工器、模拟开关、寄生电容、采样电容…等)的电路图。
图3. 输入级与ADC简化示意图 - 采样和保持电路

其中模拟信号输入源对ADC的输入阻抗(RAIN),直接与ADC采样时间有关,影响ADC转换结果甚巨。未考虑输入阻抗使得ADC输入的外部器件与软件设置的采样时间不批配,往往是造成ADC使用问题的原因。以下分别针对信号源具有一般输入阻抗或高输入阻抗,分别探讨如何正确设置ADC的软、硬件。

一般输入阻抗的测量设置

 

VC是内部CADC电容两侧的电压(请参见图4)。对于给定的采样tC,可以考虑VAIN=VREF+所对应的tC需要采样时间是最大值,因为此时CADC电容需要最多时间从0V充电到VAIN。因此,VAIN=VREF是验证最大源电阻时要考虑的最坏情况。通过软件设置增加采样时间或降低ADC时钟频率可等效加长采样时间,当采样时间越长越可以获得好的转换结果。

图4. 模拟信号源对采样和保持电路充电示意图

一般我们假设允许的最大误差等于1 LSB,照RC充放电公式:

其中Vt)带入VREF×(1-1/212)VAIN带入VREF;而时间常数τ=RAIN+RADCxCADC,采样时间大于8.32xRAIN+RADCxCADC就可达到1 LSB误差之内。若使用者要求较低的准确度,可进一步增大允许的外部电阻RAIN

高输入阻抗的测量设置

 
ADC输入信号源常有存在高阻特性。例如系统电池电压经电阻分压后输入给ADC采集,因分压电阻会形成一个直流耗电路径,为节省耗电,分压电阻串常使用100 kΩ到1 MΩ的阻值组合而成。又或者有些传感器本身为弱电流输出,通过外接一大电阻转换为电压后输入给ADC。以上硬件往往都无法以上一节方法调试出适合的采样时间,(例如软件已设置采样时间至最大值仍无法获得准确的转换值,或降低ADC时钟又使得整体采样间隔太长,)此时可以在ADC输入通道前增加运算放大器,可以提高输入驱动能力,如图5。此方案可大大缩短ADC的采样时间以及采样间隔,但缺点是增加了器件成本。另外在设计前置放大器时,必须注意可能额外产生的误差(例如额外的偏移、放大器增益稳定性或线性、频率响应)。并且若未慎选运算放大器,这些放大器的误差会成为另外测量误差的来源。
图5. ADC输入通道前增加运算放大器示意图

若硬件电路不容许增加运算放大器,无法通过提高采样时间满足要求,此时还可以采用外接电容作为电荷存储器的方法。

SAR ADC内部采样保持电容在采样开关接通后,在采保电容稳定时间内需要一个足够的充放电电流,而通常实际的信号电路若具有较高的输入阻抗,往往不能提供足够大的电流快速为ADC内采样电容充电。为此大部分的应用都采用在ADC输入管脚到地接一个外部大电容作为一个电荷存储器,即图3中的CEXT。这个电容参与采样时电路的充放电过程,以便向SAR ADC采样电容提供充足的电荷,而对内部采样电容进行快速充电,并且稳定ADC输入点的电压。此CEXT与RAIN组成的RC滤波器也顺带限制到达ADC输入端的带外噪声,同时也帮助衰减ADC输入端中开关电容频繁切换和通断的反冲噪声影响。当然此RC滤波器也限制了VAIN信号源的截止频率。

  • 计算CEXT

当采样开关接通后,会在CEXT和CADC之间有一段电荷重新分配的过程,这一段RC时间常数主要是由RADC的最大阻值和CADC的最大容值决定的。
在考虑CEXT和CADC之间电荷分配时,CPAD因为相对微小且与CEXT并联,是可以忽略的。电荷分配的算式是基于「分配前的全部电荷等于分配后的全部电荷」。
假设现在CADC是完全放电的,而CEXT储存着和VAIN一样的电压。VC(分配后的电压)定规为VAIN的0.999939倍,这个意义是VC最后徧差在VAIN的1 LSB之内,以12位解析度来记算。

例如CADC=15 pF,

CEXT=4095x15 pF=61.4 nF。
这是CEXT的绝对最小值。在实际选择器件值时必需确认考虑到器件误差和老化因素,选择大一点的值是可以的,如68 nF。如果电容值选择再大,其实对采样时间要再缩短并没有实质帮助,反而限制了ADC输入信号的频宽。
但如果一个12位的ADC配罝CEXT<4095xCADC,反而会要求相当大的采样时间让CADC充电足够。所以若CEXT<4095xCADC而且使用者若没有需要anti-aliasing滤波器的情况下,还不如不要加CEXT。若要求的精准度没有这么高,CEXT的数值可以照前面公式减小,这时ADC输入信号的频宽就增大了。相反的若要求精准度,CEXT就必须提高了,就要付出ADC采样时间间隔要拉大,ADC输入信号的频宽缩小的代价。
  • 计算RAIN

所有对外部电容CEXT充电的阻值总合程为RAIN,也就是从CEXT看到驱动信号源的等效阻值。当RAIN变大,RAIN和CEXT所型成的截止频率就会变低。这表示当输入信号开始变动到CEXT电荷稳定的这段反应时间会增加。
要准确度稳定达到12位解析度误差1 LSB之内,RC线路的时间常数要求为:
ln(212)=8.32倍。
Cext和Rain型成的截止频率为:

以前段CEXT=62 nF为例,若RAIN=200Ω,截止频率可达9.7kHz;但若RAIN=20kΩ,仅可接受97Hz。源的频率若超以上截止频率,ADC转换结果会不准确。

注意此时程序不得将ADC设定为连续模式,而应设定为单点模式或以定时器间隔触发转换,软件必 须确保两次转换之间的时间间隔等于或大于1/f
  • 采样时间不足的后果

若遵照计算CEXT的方式在ADC输入放置足够大的CEXT,要使CADC稳定所需要的时间就显得非常短。另外也只有一个情况之下可以不需要CEXT就是RAIN很小的时候。一般来说RAIN很小是因为传感器有输出缓冲极,这是RAIN都小于100Ω。以上情况采样时间都容易满足。

不足的采样时间会造成ADC通道间互相干扰。就如本文开头所讨论的,这是因为电荷从一个通道累积在CADC上并转移到另一个通道,造成通道间互相影响。

  • 信号源高阻的后果

通常造成以上所述通道间干扰的原因是因为信号源输入阻抗太高了。若要达到1 LSB的准确度,就必需在各通道转换中间加入延时,后果就是整体的转换时间变慢。

如果没有加上CEXT或着电容值太小,而采样时间又不足,ADC转换出来的结果因为通道间干扰而永远达不到1 LSB的准确度。

关于输入阻抗匹配的其他建议

 
以近期ADC朝向低功耗、高采样频率、并复杂功能的方向进行设计,ADC的采样行为已经不是如上文以一阶简易的RADC和CADC模型可以仿真的了,因此近期普遍ADC规格中只提供CADC的典型值,而不再提供RADC数值。取而代之的是ADC输入信号阻抗(RAIN)与采样时间(ts)的对应关系表,如下表所示。(下表自AT32F403A系列数据手册截取。)
表1. fADC=28MHz时的最大RAIN(1)

(1) 由设计保证。
在可以得知ADC信号源的输入阻抗时,使用者不需进行计算,只要照表格指示透过软件设置足够的采样时间,一般都会得到合理的ADC转换值。但在一般情况下,使用者常常难以直接或间接得知ADC输入信号的阻抗时,最好的方法是逐步调试软件采样时间。

使用者可以依照下述步骤调试ADC的采样时间:

  • 首先设置ADC时钟频率为最高值,并设置采样周期为最大值;
  • 尝试ADC转换并检视转换结果;
  • 若转换数值符合预期,则可逐步调试减小采样周期并观察ADC转出值,以求得足够而不过长的采样时间;
  • 若最大采样时间所得转换值不符合预期,使用者需要降低ADC时钟频率,或是照着前文计算并外加合适大小的CEXT;硬件设置完成后再修改软件设置,逐步调试出合适的采样时间及采样间隔。
另外若采样间隔时间许可时,采取一些软件技巧也会提高ADC转换的准确度,例如:
  • 采用平均法、移动平均法、或中值滤波;
  • 对同一ADC通道采样两次,将第一次的值丢弃而使用第二次的采样的值。此种方式可以消除输入源内阻过大而在不同通道切换时,上一个通道的电压来不及从采样电阻放电而累积的电荷,导 致影响下一个通道的转换值;
  • ADC输入信号大约在0VVREF+/2时,可交替转换该ADC输入通道和内部VINTRV源,也可达到让采样电阻有足够时间充放电的效果,避免通道间干扰。若有内部VSSA通道,交替转换ADC输入通道和内部VSSA通道效果会更好且省时。因为让ADC采样电路放电到VSSA比起充放电到VINTRV可以以更快的采样时间达成。
 

其它ADC应用指南 

 

内部参考电压VINTRV的设置目的与使用方式

 
内部参考电压(VINTRV)为ADC提供了一个稳定的电压输出。VINTRV内部连接到ADC1_IN17输入通道上,用于将VINTRV的输出转换为数字数值。

VINTRV是一个芯片内部的一个恒定电压信号源,按规格为1.2V±3.3%,在所有VDDA操作电压范围内都维持在此稳定电压规格内,不随VDDA电压变动而变化。因此,VINTRVADC的外部VREF+(通常与VDDA同电源)的电压未知或VVREF+电压会变动时(例如:使用电池电源),可用来参照推算出VREF+VDDA电压以及各ADC_IN输入的准确绝对电压值。

例如:选定VINTRV通道经ADC转换后数值若为1650Code_VINTRV),就可以推算出电压满格的VREF+VDDA的电压为1.2x4096/1650=2.979V。此时若另一选定的ADC_IN外部通道转换出来的数值为800Code_VAIN),就可采用以下两种计算方式:1.2x800/16502.979x800/4096,计算出此外部信号电压VAINx0.582V

以上范例使用公式如下:

VREF+VDDA=(VINTRV)x4096/(Code_VINTRV)
VAINx=(VINTRV)x(Code_VAIN)/(Code_VINTRV)
VAINx=VREF+VDDAx(Code_VAIN)/4096

使用者可以根据应用系统电源的特性,决定对VINTRV转换次数及间隔。若电源为电压未知但不变动,可于系统上电后并在ADC初始化并校正后,一次性对VINTRV转换;若电源为变动电压,就要根据电源变动速度和系统需求决定对VINTRV转换间隔,多次对VINTRV转换并更新此参照值,甚至需要对ADC重新校正。另外温度变化也可能使电源情况有改变,也可参考2.2.6节内容启动对VINTRV转换。因VINTRV为内部弱电压源,ADC进行采样时需要足够时间让VINTRV为采样电路正确充放电,使用者需确实遵照数据手册中的TS_INTRV参数为VINTRV设置足够的采样时间,以获得正确的转换数值。

围观 396

页面

订阅 RSS - ADC