ADC常见问题

​ 本章主要描述在使用ADC模块时,可能出现的问题、原因及处理方法。

1. 调用异步采集接口一直无法产生完成中断

  1. 问题描述

    调用app_adc_dma_conversion_async(conversion, TEST_CONV_LENGTH)接口启动采集,一直无法产生完成中断。

  2. 问题分析

    • conversion地址没有4字节对齐。由于内部DMA的align配置为WORD,所以要求buffer入参地址4字节对齐。

    • TEST_CONV_LENGTH超过DMA长度限制,这里len最大不能超过4095*2。

    • conversion是局部变量,然后在调用app_adc_dma_conversion_async的函数外面等完成中断。此时已退出原来的函数,导致局部变量释放,DMA搬运的目标地址不是合法的地址。

  3. 处理方法

    • 检查conversion是否4字节对齐,如果不是则需要强制4字节对齐。

    • 检查入参len参数是否超过4095*2。

    • 检查是否存在conversion是局部变量、被释放的可能。

类似问题:调用app_adc_multi_channel_conversion_async接口采集,第二个以及后续通道的数据是乱的。

2. 部分内部参考电压档位采集出来的结果误差很大

  1. 问题描述

    使用内部参考源时,发现大档位参考源测量出来的ADC结果误差较大。

  2. 问题分析

    芯片供电电压过低,无法支撑选择的参考电压档位所需的参考电压。不同参考电压,对芯片的供电电压是有要求的,具体如下:

参考源档位 芯片供电电压范围
0P8V 2.1 V~3.8 V
1P2V 2.6 V~3.8 V
1P6V 3.2 V~3.8 V
  1. 处理方法

    提高芯片的供电电压,或者降低参考电压档位,让芯片供电电压与参考电压匹配。

3. 高采样率时采集出来的结果误差很大

  1. 问题描述

    基于16 MHz的ADC采样时钟,采集出来的结果有很大波动,而且误差很大。

  2. 问题分析

    电路外部的阻抗较大,导致充电时间太久,超过2个Clock没能建立稳定的信号保持。ADC的采集电路如下:

    ../../../_images/3-1-1.png

    ADC内部有2 pF的电容,这就要求用户外部电路的阻抗R与ADC内部电容C组成的RC充电电路上,充电时间不能超过信号采样保持时间。信号保持时间是2个ADC Clock,所以配置的采样时钟越高,要求的保持时间就越短。

  3. 处理方法

    降低ADC采样时钟频率,或者减小外部电路的阻抗R。

4. 异步采集接口速度慢

  1. 问题描述

    调用app_adc_dma_conversion_async()接口采集指定长度数据,发现采集时间比较长,远超出配置的采样速度。

  2. 问题分析

    • 可能是在采样完成的回调函数里面加了打印。

    • 异步接口需要响应DMA的传输完成中断,会比同步接口慢一些。

  3. 处理方法

    如果追求采样速度,或者为了测试采样率,建议用同步接口。

5. 同步采集接口无法产生数据

  1. 问题描述

    调用app_adc_conversion_sync()同步接口采集,发现无法产生ADC数据而超时退出。

  2. 问题分析

    • 在比Bluetooth LE中断优先级更高的中断里调用了采集接口,该接口与PMU Calibration里面的ADC操作冲突。

    • 在PMU Calibration Disable ADC后被抢占,然后在App conversion采集接口不会去重新Enable ADC,只是Enable ADC Clock。

  3. 处理方法

    降低采集线程的优先级,不能在比Bluetooth LE中断优先级更高的地方调采集接口;否则需要统筹与PMU Calibration里ADC操作的互斥关系。