Arduino 模拟输入示例说明

电器工程 Arduino 模拟 输入
2022-01-31 03:17:38

首先,我对电子产品很了解。

最近我得到了一个 Arduino Nano。现在我试图了解为什么在http://arduino.cc/en/Tutorial/ReadAnalogVoltage示例中没有标称电位计,以及该标称的变化将如何影响模拟输入读数。

还有为什么在http://arduino.cc/en/Tutorial/AnalogReadSerial示例中他们选择了 10k 电位器,而 200k 电位器会有什么不同。

谢谢!

3个回答

任何(空载)电位器的抽头电压输出都没有差异,它们都以相同的方式工作。

但是,为了获得最佳性能,Arduino 的模拟输入建议使用小于 10kOhm 的源阻抗。这是由于采样和保持电容充电所需的时间,这可以看作是动态阻抗。下图取自 AtMega328 数据表(Arduino 所基于的微控制器):

模拟输入阻抗

如果您现在不完全理解这一点,请不要太担心,只需接受我们需要小于 10kOhms 的源阻抗即可。

现在我们如何计算电位器的输出阻抗?

有关详细信息,请查看戴维南等效阻抗。这告诉我们,电位器的雨刷器的最大输出电阻是从上到下测量的电阻的 1/4(当雨刷器位于中心时)所以如果你的电位器是 10k,那么最大输出电阻是 2.5k .
这是一个 10k 底池从一端扫到另一端的模拟:

锅模拟

X 轴代表从 0 到 100% 的旋转(忽略显示的实际值) Y 轴是在抽头处测量的输出阻抗。我们可以看到它是如何在 0 ohms 开始和结束,并在中间 (50%) 处达到 2.5kOhms 的峰值。
这比推荐的 10k 源阻抗要小得多。
因此,您可以使用 100 欧姆和 40k 之间的任何电位器值作为分压器。

编辑 - 回答如果我们使用 200k 罐会发生什么的问题:

正如数据表摘录中所说,源阻抗越高,S/H 电容器充电所需的时间就越长。如果在读取读数之前未充满电,则读数与真实值相比将显示错误。

我们可以计算出电容器需要多长时间充电到其最终值的 90%,公式为:

2.3 * R * C

在 1 个 RC 时间常数之后,电压处于其最终值的 ~63%。在 2.3 个时间常数之后,它处于上述的 ~90%。这是通过 1 - (1 / e^(RC/t)) 计算的,其中 e 是自然对数 ~2.718。例如,对于 2.3 时间常数,它将是 1 - (1 / e^2.3) = 0.8997。

因此,如果我们插入显示的值 - 50k 源阻抗、100k 串联阻抗(假设最坏情况)和 14pF 电容:

2.3 * 150k * 14pF = 4.83us 充电至 90%。

我们还可以计算 -3dB 值:

1 / (2pi * 150k * 14pF) = 75.8kHz

如果我们希望最终值在 99% 以内,我们必须等待大约 4.6 tau(时间常数):

4.6 * 150k * 14pF = 9.66us 充电至 99% - 这对应于大约 16.5kHz

因此,我们可以看到源阻抗越高,充电时间越长,ADC 准确读取的频率就越低。

但是,对于控制 ~DC 值的电位器,您可以以非常低的频率进行采样并给它充足的充电时间,因为泄漏非常小。所以我认为在这种情况下200k实际上应该没问题。例如,对于音频信号或任何变化的 (AC) 高阻抗信号,您将不得不考虑以上所有因素。
此链接详细介绍了 ATMega328 ADC 特性。

Oli 向您展示了数据表中的信息,但如果您对此不熟悉,他的解释可能会让您有点过头了。

ADC(模数转换器)有一个小电容器,用于保持模拟输入电压。该电容器通过输入端的电阻充电。高电阻将使电容器充电更慢。建议最大值为 10 kΩ,因此使用该值的电位计是可以的。Oli 的最大 40 kΩ 是正确的,但是当您了解 Thévenin 时,这一点就会变得清晰。

根据我使用 Arduinos 的经验,如果电位器超过 10k,读数会波动。我通过在抽头和地之间放置一个 .1uf 电容器来解决这个问题。这使模拟读取的电压保持稳定。通过使用电容器,我使用了高达 1 兆欧的电位器并获得了稳定、稳定的读数。