在高级应用程序中使用 ADC
重要
这是 Azure Sphere(旧版)文档。 Azure Sphere(旧版)将于 2027 年 9 月 27 日停用,用户此时必须迁移到 Azure Sphere(集成)。 使用位于 TOC 上方的版本选择器查看 Azure Sphere(集成)文档。
本主题介绍如何在高级应用程序中使用模-数转换器 (ADC)。 有关在 RTApp 中使用 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
调用,该路径以 /dev/adc<number>
“number”为控制器 ID 开头。 如果调用成功,将返回文件描述符。 否则,将返回错误值。
请参阅 参数、权限和错误检查的示例实现 。
获取通道规范
在使用高级函数时,在轮询、设置参考电压或获取样本位计数之前,使用 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 设置通道的参考电压:
设置在 Get Channel 规范中检索的结构中
iio_ioctl_chan_spec_buffer
填充的 ADC 信息。获取要为通道设置的属性的属性索引。
使用属性索引和通道规范信息编写参考电压。
获取参考电压属性的索引:
iio_ioctl_chan_spec_buffer
从“获取通道”规范中检索的结构中,使用字段中的值channel
,channel
从字段中使用字段中的值ext_info
。 该ext_info
字段是通道iio_ioctl_chan_spec_ext_info
的属性描述符链接列表的头的结构。从 0 开始,遍历计数节点的列表,直到
name
字段与字符串匹配reference_voltage
。- 列表中的每个节点都有一个“下一步”字段,该字段指向列表中的下一个节点。 最后一个节点指向 NULL。
- 生成的计数器是属性的索引。
若要设置参考电压,请使用
IIO_WRITE_CHANNEL_EXT_INFO_IOCTL
采用类型iio_ioctl_write_chan_ext_info
结构的 ioctl,其中包含相关数据(在本例中为电压)、要设置的通道,以及为该通道设置的特定属性(参考电压)。
获取示例位计数
使用高级 API 设置参考电压:
确保获取正确 ADC 通道的信息。 此信息在
iio_ioctl_chan_spec_buffer
“获取通道规范”部分中检索的结构中填充。获取要为通道读取的属性的属性索引,在本例中为示例位计数。
使用 Linux ioctls 通过属性索引和通道规范获取示例位计数。
若要获取样本位计数的属性索引,请使用与 设置参考电压相同的过程。 但是,在循环访问类型调用ext_info
iio_ioctl_chan_spec_ext_info
的链接列表时,匹配字符串current_bits
。
调用 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 开发板、模块和芯片的定义。 它包含标头和 JSON 文件,这些文件定义 MT3620、MT3620 RDB 和其他 MT3620 硬件的主接口。 HardwareDefinitions 文件夹的默认位置位于 C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions
Windows 和 /opt/azurespheresdk/HardwareDefinitions
Linux 上。
GitHub 上的 Azure Sphere 示例存储库包含标头和 JSON 文件,用于定义 MT3620 芯片和 MT3620 RDB 的 SPI 主接口,以及其他 MT3620 硬件。->