ADC常见问题
本章主要描述在使用ADC模块时,可能出现的问题、原因及处理方法。
1. 调用异步采集接口一直无法产生完成中断
问题描述
调用app_adc_dma_conversion_async(conversion, TEST_CONV_LENGTH)接口启动采集,一直无法产生完成中断。
问题分析
conversion地址没有4字节对齐。由于内部DMA的align配置为WORD,所以要求buffer入参地址4字节对齐。
TEST_CONV_LENGTH超过DMA长度限制,这里len最大不能超过4095*2。
conversion是局部变量,然后在调用app_adc_dma_conversion_async的函数外面等完成中断。此时已退出原来的函数,导致局部变量释放,DMA搬运的目标地址不是合法的地址。
处理方法
检查conversion是否4字节对齐,如果不是则需要强制4字节对齐。
检查入参len参数是否超过4095*2。
检查是否存在conversion是局部变量、被释放的可能。
类似问题:调用app_adc_multi_channel_conversion_async接口采集,第二个以及后续通道的数据是乱的。
2. 部分内部参考电压档位采集出来的结果误差很大
问题描述
使用内部参考源时,发现大档位参考源测量出来的ADC结果误差较大。
问题分析
芯片供电电压过低,无法支撑选择的参考电压档位所需的参考电压。不同参考电压,对芯片的供电电压是有要求的,具体如下:
| 参考源档位 | 芯片供电电压范围 |
|---|---|
| 0P8V | 2.1 V~3.8 V |
| 1P2V | 2.6 V~3.8 V |
| 1P6V | 3.2 V~3.8 V |
处理方法
提高芯片的供电电压,或者降低参考电压档位,让芯片供电电压与参考电压匹配。
3. 高采样率时采集出来的结果误差很大
问题描述
基于16 MHz的ADC采样时钟,采集出来的结果有很大波动,而且误差很大。
问题分析
电路外部的阻抗较大,导致充电时间太久,超过2个Clock没能建立稳定的信号保持。ADC的采集电路如下:

ADC内部有2 pF的电容,这就要求用户外部电路的阻抗R与ADC内部电容C组成的RC充电电路上,充电时间不能超过信号采样保持时间。信号保持时间是2个ADC Clock,所以配置的采样时钟越高,要求的保持时间就越短。
处理方法
降低ADC采样时钟频率,或者减小外部电路的阻抗R。
4. 异步采集接口速度慢
问题描述
调用app_adc_dma_conversion_async()接口采集指定长度数据,发现采集时间比较长,远超出配置的采样速度。
问题分析
可能是在采样完成的回调函数里面加了打印。
异步接口需要响应DMA的传输完成中断,会比同步接口慢一些。
处理方法
如果追求采样速度,或者为了测试采样率,建议用同步接口。
5. 同步采集接口无法产生数据
问题描述
调用app_adc_conversion_sync()同步接口采集,发现无法产生ADC数据而超时退出。
问题分析
在比Bluetooth LE中断优先级更高的中断里调用了采集接口,该接口与PMU Calibration里面的ADC操作冲突。
在PMU Calibration Disable ADC后被抢占,然后在App conversion采集接口不会去重新Enable ADC,只是Enable ADC Clock。
处理方法
降低采集线程的优先级,不能在比Bluetooth LE中断优先级更高的地方调采集接口;否则需要统筹与PMU Calibration里ADC操作的互斥关系。