我正在开发一个使用 TI CC2541 的项目(放置在 jdy-08 BLE 模块上)。我尝试使用 adc 接口获取锂电池电量。我参考了这篇文章https://sunmaysky.blogspot.com/2013/12/cc2530-adc-howto-in-ti-z-stack.html?m=1。要读取 adc 值,我使用以下代码:
uint16 adc_ain2=0;
HalAdcSetReference(HAL_ADC_REF_125V);
adc_ain2=HalAdcRead(HAL_ADC_CHN_AIN2,HAL_ADC_RESOLUTION_10);
如果我不使用分压器并直接将电压源连接到 P0_2 引脚,则没有问题。 例如:
0,35V ==> adc 170
0,70V ==> adc 310
1,17V ==> adc 498
但是如果我使用分压器,我会得到错误的值(R1 = 820K,R2 = 820K)。 例如:
0,33V ==> adc 347
0,53V ==> adc 368
提前谢谢您!!
答案可能是您的外部电阻网络延长了 ADC 的时间常数,使得采样电容器无法在采样窗口内达到输入电压。
我在这里写了一篇较长的文章:“使用 ADC:基础知识,为什么我会得到有趣的读数以及如何解决它?”。 如果您还不熟悉该主题,我强烈建议任何使用模拟输入的人阅读它。
这是针对您的具体问题的快速版本,据我快速阅读后了解。
基本概念是所有(或几乎所有)ADC 都有一个开关电容器网络来对输入进行采样。 当电容器无法在分配给它的时间内充电并对输入进行采样时,他们会给您错误的答案。
这是 SPICE 中的一个示例,将电阻分压器直接连接到 ADC 输入级。
第一张图显示了电压源和分压器抽头处的电压。 第二个显示采样电容器上的电压。 该模型来自应用笔记 “LTSpice,模拟 SAR ADC 模拟输入”.
您可以看到分压器(SAR 的输入)抽头处的电压有很大的下降,并且在第一个开关 S1 打开以将电容器与输入分离之前电压不会恢复。 此时,第二个开关 S2 通常会将电容器连接到读出电路,在模型中,它将电容器接地,以便我们可以执行模型中的下一个时钟周期。但想象一下 S2 关闭之前的最终状态保持固定,直到读出完成。
为了完全清楚发生了什么,该图显示了采样电容器上的电压。 如上所述,当 S1 打开且转换将在实际 ADC 中开始时,电压尚未达到预期的位置。 这可能是你的阅读错误。
最好的解决方案是使用运算放大器和 RC 网络作为 SAR 电容器的电荷库,如下所示:
在这里,您可以看到为电容器充电的电流来自外部电容器中存储的电荷,并且输出上只有一个小脉冲来为电容器充电
第二个最佳解决方案是至少使用一个运算放大器缓冲区,如下所示。 在这种情况下,缓冲器为采样电容器提供足够的电流,使其能够快速恢复,因此看起来不像一个大的负向电压尖峰。