在高级应用程序中使用 ADC

本主题介绍如何在高级应用程序中) 使用模数转换器 (ADC。 有关 RTApps 中 ADC 使用的信息 ,请参阅在支持实时的应用程序中使用外围设备

Azure Sphere 支持模拟到数字转换。 ADC 将模拟输入转换为相应的数字值。 输入通道数和分辨率 () ADC 输出位数取决于设备。

ADC_HighLevelApp示例演示如何访问 MT3620 设备上的 ADC。

ADC 外围设备代码片段演示了使用 简化 函数或 高级 函数与 ADC 交互的两种方法。

MT3620 包含具有 8 个输入通道的 12 位 ADC。 ADC 将输入电压与参考电压进行比较,并生成 0 到 4095 之间的值作为其输出。 ADC 输入通道和 GPIO 引脚 GPIO41 到 GPIO48 映射到 MT3260 上的相同引脚。 但是,如果应用程序使用 ADC,则将分配所有 8 个引脚用作 ADC 输入。 它们都不能用于 GPIO。

ADC 要求

与 ADC 通信的应用程序必须包含 adc.h 头文件,并将 ADC 设置添加到 应用程序清单

所有应用程序都必须 设置其目标硬件 ,并包含相应的硬件定义头文件。

头文件

 #include <applibs/adc.h>
 #include "path-to-your-target-hardware.h"

将“path-to-your-target-hardware.h”替换为硬件头文件的路径。

应用程序清单设置

应用程序清单中的 ADC 设置列出了应用程序访问的 ADC 控制器。 若要配置这些设置,请将 Adc 功能添加到应用程序清单,然后将每个 ADC 控制器添加到功能。 Azure Sphere 应用程序清单 主题提供了更多详细信息。

在代码中,使用为硬件定义的常量来标识 ADC 控制器。 生成应用时,编译器会将这些值转换为原始值。

例如,下面是面向 MT3620 参考开发板的应用程序的应用程序清单的摘录, (RDB)

   "Adc": [ "$MT3620_RDB_ADC_CONTROLLER0" ]

以下摘录演示如何在面向 Avnet MT3620 初学者工具包的应用程序中指定相同的 ADC 控制器:

   "Adc": [ "$AVNET_MT3620_SK_ADC_CONTROLLER0" ]

实现概述

若要实现应用程序以访问 ADC,请使用以下两种方法之一:

本主题介绍这两种方法。 可在此处找到每个方法的完整示例代码:

使用简化函数进行 ADC 访问

Azure Sphere 高级应用程序可以通过调用 Applibs ADC API 来访问 ADC。

打开 ADC 控制器

若要打开 ADC 控制器进行访问,请调用 ADC_Open 并将控制器的 ID 作为参数传递。 如果调用成功,将返回文件描述符。 否则,将返回错误值。

int ADC_Open(ADC_ControllerId id);

从 ADC 读取

若要从 ADC 读取数据,请调用 ADC_Poll。 将以下参数传递给ADC_Poll:ADC_Open返回的文件描述符、ADC 通道和指向将存储 ADC 值的指针。

若要获取 ADC_Poll 函数返回的有效位数 (解析) ,请调用 ADC_GetSampleBitCount

设置 ADC 参考电压

调用 ADC_SetReferenceVoltage 设置 ADC 参考电压。

MT3620 具有片上 2.5 伏基准。 或者,它可以连接到小于或等于 2.5 伏的外部电压基准。

使用高级函数进行 ADC 访问

作为与外围设备交互的高级简化函数的替代方法,可以利用 ioctl 库来打开功能。 本部分介绍如何执行此操作,以及使用 ioctls 与使用通用 Linux 函数有何不同。

ADC 高级函数代码片段 演示如何使用 Azure Sphere 高级函数读取 ADC。

例如,可以看到读取 ADC 与简化的、高级的和 linux sysfs 实现的并排比较:

打开 ADC 通道

若要打开 ADC 控制器进行访问,请使用 Linux open 调用传入目录的路径,该路径以“number”为控制器 ID 开头 /dev/adc<number> 。 如果调用成功,则返回文件描述符。 否则,将返回错误值。

有关参数、权限和错误检查,请参阅 示例实现

获取通道规范

在使用高级函数时,请在轮询、设置参考电压或获取样本位计数之前使用 ioctl 调用来获取通道规范。 可以通过对获取的一些值进行硬编码来跳过此步骤,但不建议这样做。 请注意,此步骤由简单函数中提供的代码处理。


// Used to get the size of the buffer to allocate for the channel specification

IIO_GET_CHANNEL_SPEC_BUFFER_TOTAL_SIZE_IOCTL
// Used to get the channel specification and set the ‘iio_ioctl_chan_spec_buffer’ struct properly

IIO_GET_CHANNEL_SPEC_BUFFER_IOCTL

设置参考电压

若要使用高级 API 设置通道的参考电压,请执行以下操作:

  1. 设置在获取通道规范中检索的结构iio_ioctl_chan_spec_buffer中填充的 ADC 信息。

  2. 获取要为通道设置的属性的属性索引。

  3. 使用属性索引和通道规范信息编写参考电压。

获取参考电压属性的索引:

  1. iio_ioctl_chan_spec_bufferGet Channel 规范中检索到的结构中,使用 字段中的值channel,并从 channel 字段中使用 字段中的值ext_info。 字段 ext_info 是一个 iio_ioctl_chan_spec_ext_info 结构,它是通道的属性描述符链接列表的头。

  2. 从 0 开始,遍历计数节点的列表, name 直到字段与字符串匹配 reference_voltage

    • 列表中的每个节点都有一个“下一个”字段,该字段指向列表中的下一个节点。 最后一个节点指向 NULL。
    • 生成的计数器是 属性的索引。
  3. 若要设置参考电压,请使用 IIO_WRITE_CHANNEL_EXT_INFO_IOCTL 采用 类型 iio_ioctl_write_chan_ext_info结构的 ioctl,该结构包含相关数据 (在本例中为该通道设置的电压) 、要设置的通道,以及 (参考电压) 的特定属性。

获取样本位计数

使用高级 API 设置参考电压:

  1. 确保获取正确 ADC 通道的信息。 此信息在获取通道规范部分检索到的结构中 iio_ioctl_chan_spec_buffer 填充。

  2. 获取要为通道读取的属性的属性索引,在本例中为示例位计数。

  3. 使用 Linux ioctls 通过属性索引和通道规范获取示例位计数。

若要获取样本位计数的属性索引,请使用与 设置参考电压相同的过程。 但是,在循环访问类型为 的链接ext_info列表时,匹配字符串 current_bitsiio_ioctl_chan_spec_ext_info

调用 ioctl IIO_READ_CHANNEL_EXT_INFO_IOCTL 以使用 字段中的必要数据buffer填充 类型的iio_ioctl_read_chan_ext_info结构。

读取 ADC 通道

若要读取 ADC 通道,请使用 ioctl 调用 IIO_READ_RAW_CHANNEL_INFO_IOCTL进行轮询,传入结构,该结构 iio_ioctl_raw_channel_info 将使用 ADC 通道中的数据填充。

示例实现

若要使用 Azure Sphere 高级实现读取 ADC,请参阅 ADC 高级应用示例中的代码片段。

若要比较 Azure Sphere 编码时与外围设备交互与通用 Linux 系统编码之间的语义差异,请参阅 LinuxSysfsNodes

MT3620 支持

MT3620 支持的 ADC 功能在 MT3620 支持状态中列出。 MT3620 开发板用户指南介绍了引脚布局和引脚功能。

Microsoft Azure Sphere SDK 安装目录中的 HardwareDefinitions 文件夹包含常见 Azure Sphere 开发板、模块和芯片的定义。 它包含用于定义 MT3620、MT3620 RDB 以及其他 MT3620 硬件的主接口的标头和 JSON 文件。 HardwareDefinitions 文件夹的默认位置在 C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions Windows 和 /opt/azurespheresdk/HardwareDefinitions Linux 上。

GitHub 上的 Azure Sphere 示例存储库包含标头和 JSON 文件,这些文件为 MT3620 芯片MT3620 RDB以及其他 MT3620 硬件定义 SPI 主接口。-->