用于 ADC 的 IIO 抽象¶
1. 概述¶
IIO 子系统支持许多模数转换器 (ADC)。 一些 ADC 具有 IIO 设备驱动程序以特定方式支持的功能和特性。 本文档描述了常见的 ADC 功能,并解释了 IIO 子系统如何支持它们。
1. ADC 通道类型¶
ADC 可以具有不同类型的输入,每种输入以略有不同的方式测量模拟电压。 ADC 将模拟输入电压数字化,其范围通常由提供的电压参考、输入类型和输入极性给出。 ADC 通道允许的输入范围是确定以真实单位(电压测量为毫伏,电流测量为毫安等)获得测量值所需的比例因子和偏移量所必需的。
精巧的设计可能具有非线性特性或集成的组件(例如放大器和参考缓冲器),可能也必须考虑这些组件才能推导出 ADC 的允许输入范围。 为了清楚起见,以下各节假设输入范围仅取决于提供的电压参考、输入类型和输入极性。
有三种通用类型的 ADC 输入(单端、差分、伪差分)和两种可能的极性(单极性、双极性)。 输入类型(单端、差分、伪差分)是一种通道特性,并且与极性(单极性、双极性)方面完全独立。 一篇关于 ADC 输入类型的综合文章(本文档很大程度上基于该文章)可以在 https://www.analog.com/en/resources/technical-articles/sar-adc-input-types.html 找到。
1.1 单端通道¶
单端通道将模拟输入电压相对于地数字化,并且可以是单极性或双极性。
1.1.1 单端单极性通道¶
---------- VREF -------------
´ ` ´ ` _____________
/ \ / \ / |
/ \ / \ --- < IN ADC |
\ / \ / \ |
`-´ `-´ \ VREF |
-------- GND (0V) ----------- +-----------+
^
|
External VREF
单端单极性通道的输入电压允许从 GND 摆动到 VREF(其中 VREF 是电压高于系统地的电压参考)。 最大输入电压也称为 VFS(满量程电压输入),其中 VFS 由 VREF 确定。 电压参考可以从外部电源提供,也可以从芯片电源派生。
单端单极性通道可以在设备树中描述,如下例所示
adc@0 {
...
#address-cells = <1>;
#size-cells = <0>;
channel@0 {
reg = <0>;
};
};
始终允许在设备树中包含 ADC 通道节点。 但是,如果设备具有一组统一的输入(例如,所有输入都是单端的),则声明通道节点是可选的。
支持混合单端和差分通道的设备的一个注意事项是,当 reg
是与输入引脚号不匹配的任意数字时,单端通道节点还需要提供 single-channel
属性。
有关 ADC 特定设备树属性的完整文档,请参阅 Documentation/devicetree/bindings/iio/adc/adc.yaml
。
1.1.2 单端双极性通道¶
---------- +VREF ------------
´ ` ´ ` _____________________
/ \ / \ / |
/ \ / \ --- < IN ADC |
\ / \ / \ |
`-´ `-´ \ +VREF -VREF |
---------- -VREF ------------ +-------------------+
^ ^
| |
External +VREF ------+ External -VREF
对于单端双极性通道,模拟电压输入可以从 -VREF 变为 +VREF(其中 -VREF 是具有较低电势的电压参考,而 +VREF 是具有较高电势的参考)。 一些 ADC 芯片从 +VREF 派生较低的参考,另一些从单独的输入获得它。 通常,+VREF 和 -VREF 是对称的,但它们不需要如此。 当 -VREF 低于系统地时,这些输入也称为单端真双极性。 此外,虽然从电气角度来看双极性和真双极性之间存在显着差异,但 IIO 没有明确区分它们。
这是一个单端双极性通道的设备树描述示例
adc@0 {
...
#address-cells = <1>;
#size-cells = <0>;
channel@0 {
reg = <0>;
bipolar;
};
};
1.2 差分通道¶
差分电压测量将正输入 (IN+) 处的电压电平相对于负输入 (IN-) 数字化,范围为 -VREF 到 +VREF。 换句话说,差分通道测量 IN+ 和 IN- 之间的电势差,通常用 IN+ - IN- 公式表示。
1.2.1 差分双极性通道¶
-------- +VREF ------ +-------------------+
´ ` ´ ` / |
/ \ / \ / --- < IN+ |
`-´ `-´ | |
-------- -VREF ------ | |
| ADC |
-------- +VREF ------ | |
´ ` ´ ` | |
\ / \ / \ --- < IN- |
`-´ `-´ \ +VREF -VREF |
-------- -VREF ------ +-------------------+
^ ^
| +---- External -VREF
External +VREF
差分双极性输入的模拟信号也允许从 -VREF 摆动到 +VREF。 名称的双极性部分意味着差 (IN+ - IN-) 的结果值可以是正数或负数。 如果 -VREF 低于系统 GND,则这些也称为差分真双极性输入。
差分双极性通道的设备树示例
adc@0 {
...
#address-cells = <1>;
#size-cells = <0>;
channel@0 {
reg = <0>;
bipolar;
diff-channels = <0 1>;
};
};
在 ADC 驱动程序中,将 differential = 1
设置到通道的 struct iio_chan_spec
中。 即使有三种通用输入类型,differential
也仅用于区分差分输入和非差分输入(单端或伪差分)输入类型。 有关更多信息,请参阅 include/linux/iio/iio.h
。
1.2.2 差分单极性通道¶
对于差分单极性通道,正输入处的模拟电压也必须高于负输入处的电压。 因此,差分单极性通道允许的实际输入范围是 IN- 到 +VREF。 因为允许 IN+ 随测量的模拟信号摆动,并且输入设置必须保证 IN+ 不会低于 IN-(IN- 也不会高于 IN+),所以大多数差分单极性通道设置都将 IN- 固定到已知的电压,该电压不在测量信号的预期电压范围内。 这导致一种等效于伪差分通道的设置。 因此,差分单极性设置通常可以作为伪差分单极性通道支持。
1.3 伪差分通道¶
还有第三种 ADC 输入类型,称为伪差分或单端到差分配置。 伪差分通道类似于差分通道,因为它也测量相对于 IN- 的 IN+。 但是,与双极性差分通道不同,负输入被限制在窄电压范围内(作为恒定电压),而只允许 IN+ 摆动。 可以通过将负输入限制为已知电压,同时只允许正输入摆动,从而从差分输入对中获得伪差分通道。 有时,提供给 IN- 的输入称为共模电压。 此外,某些部件具有 COM 引脚,允许单端输入引用共模电压,从而使它们成为伪差分通道。 通常,共模输入电压可以在设备树中描述为电压调节器(例如 com-supply
),因为它基本上是一个恒定的电压源。
1.3.1 伪差分单极性通道¶
-------- +VREF ------ +-------------------+
´ ` ´ ` / |
/ \ / \ / --- < IN+ |
`-´ `-´ | |
--------- IN- ------- | ADC |
| |
Common-mode voltage --> --- < IN- |
\ +VREF -VREF |
+-------------------+
^ ^
| +---- External -VREF
External +VREF
伪差分单极性输入具有差分单极性通道的限制,这意味着正输入 IN+ 的模拟电压必须保持在 IN- 到 +VREF 范围内。 IN- 的固定电压通常称为共模电压,它必须在 -VREF 到 +VREF 范围内,正如从任何差分通道负输入的信号所期望的那样。
从 IN+ 测量的电压相对于 IN-,但与差分通道不同,伪差分设置旨在测量单端输入信号。 为了使应用程序能够计算相对于系统地的 IN+ 电压,IIO 通道可以提供一个 _offset
sysfs 属性,以便在将原始数据转换为电压单位时添加到 ADC 输出。 在许多设置中,共模电压输入位于 GND 电平,并且由于始终为零,因此省略了 _offset
属性。
伪差分单极性通道的设备树示例
adc@0 {
...
#address-cells = <1>;
#size-cells = <0>;
channel@0 {
reg = <0>;
single-channel = <0>;
common-mode-channel = <1>;
};
};
不要在伪差分通道的通道 iio_chan_spec
结构中设置 differential
。
1.3.2 伪差分双极性通道¶
-------- +VREF ------ +-------------------+
´ ` ´ ` / |
/ \ / \ / --- < IN+ |
`-´ `-´ | |
-------- -VREF ------ | ADC |
| |
Common-mode voltage --> --- < IN- |
\ +VREF -VREF |
+-------------------+
^ ^
| +---- External -VREF
External +VREF
伪差分双极性输入不受 IN- 电平的限制,但它将受到 -VREF 或 GND 的限制,这取决于特定 ADC 的输入范围的下端。 与它们的单极性对应物类似,伪差分双极性通道应该声明一个 _offset
属性,以启用将原始 ADC 数据转换为电压单位。 对于 IN- 连接到 GND 的设置,通常省略 _offset
。
伪差分双极性通道的设备树示例
adc@0 {
...
#address-cells = <1>;
#size-cells = <0>;
channel@0 {
reg = <0>;
bipolar;
single-channel = <0>;
common-mode-channel = <1>;
};
};