用于 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>;
    };
};