Usar ADC en aplicaciones de alto nivel
En este tema se describe cómo usar convertidores analógicos a digitales (ADC) en una aplicación de alto nivel. Consulta Usar periféricos en una aplicación compatible con tiempo real para obtener información sobre el uso de ADC en RTApps.
Azure Sphere admite la conversión analógica a digital. Un ADC convierte una entrada analógica en un valor digital correspondiente. El número de canales de entrada y la resolución (como número de bits de salida ADC) dependen del dispositivo.
El ADC_HighLevelApp muestra cómo obtener acceso a los ADC en un dispositivo MT3620.
Los fragmentos de código periféricos de ADC demuestran dos formas de interactuar con los ADC mediante funciones simplificadas o avanzadas .
El MT3620 contiene un ADC de 12 bits con 8 canales de entrada. El ADC compara un voltaje de entrada con un voltaje de referencia y produce un valor entre 0 y 4095 como salida. Los canales de entrada ADC y GPIO ancla GPIO41 a GPIO48 se asignan a las mismas clavijas en el MT3260. Sin embargo, si su aplicación utiliza el ADC, los 8 pines se asignan para su uso como entradas ADC. Ninguno de ellos se puede usar para GPIO.
Requisitos de ADC
Las aplicaciones que se comunican con ADCs deben incluir el archivo de encabezado adc.h y agregar la configuración de ADC al manifiesto de la aplicación.
Todas las aplicaciones deben establecer su hardware de destino e incluir el archivo de encabezado de definición de hardware correspondiente.
Archivos de encabezado
#include <applibs/adc.h>
#include "path-to-your-target-hardware.h"
Reemplace "path-to-your-target-hardware.h" por la ruta de acceso al archivo de encabezado del hardware.
Configuración de manifiesto de la aplicación
La configuración de ADC en el manifiesto de la aplicación enumera los controladores ADC a los que accede la aplicación. Para configurar estas opciones, agregue la Adc
funcionalidad al manifiesto de la aplicación y, a continuación, agregue cada controlador ADC a la funcionalidad. El tema de manifiesto de la aplicación Azure Sphere tiene más detalles.
En el código, usa las constantes definidas para el hardware para identificar los controladores ADC. El compilador traducirá estos valores a valores RAW al crear la aplicación.
Por ejemplo, este es un extracto de un manifiesto de aplicación para una aplicación que se centra en un panel de desarrollo de referencia de MT3620 (RDB).
"Adc": [ "$MT3620_RDB_ADC_CONTROLLER0" ]
El siguiente extracto muestra cómo especificar el mismo controlador ADC en una aplicación que se centra en el kit de inicio Avnet MT3620:
"Adc": [ "$AVNET_MT3620_SK_ADC_CONTROLLER0" ]
Información general sobre la implementación
Para implementar la aplicación para obtener acceso a ADC, use uno de estos dos enfoques:
En este tema se describen ambos métodos. Puede encontrar el código de ejemplo completo para cada método aquí:
Acceso ADC con funciones simplificadas
Las aplicaciones de alto nivel de Azure Sphere pueden acceder a los ADCs llamando a las API de ADC de Applibs.
Abrir un controlador ADC
Para abrir un controlador ADC para el acceso, llame ADC_Open y pase el id. del regulador como parámetro. Si la llamada se realiza correctamente, se devolverá un descriptor de archivo. En caso contrario, se devolverá un valor de error.
int ADC_Open(ADC_ControllerId id);
Leer desde un ADC
Para leer desde el ADC, llame a ADC_Poll. Los parámetros siguientes se pasan a ADC_Poll: el descriptor de archivo devuelto por ADC_Open, el canal ADC y un puntero al lugar donde se almacenará el valor de ADC.
Para obtener el número de bits (resolución) válidos devueltos por la función ADC_Poll, llame a ADC_GetSampleBitCount.
Establecer el voltaje de referencia de ADC
Llame a ADC_SetReferenceVoltage para establecer la tensión de referencia ADC.
El MT3620 tiene una referencia en chip de 2,5 voltios. Como alternativa, se puede conectar a una referencia de tensión externa que sea menor o igual a 2,5 voltios.
Acceso ADC con funciones avanzadas
Como alternativa a las funciones simplificadas de alto nivel para interactuar con el periférico, puede aprovechar la biblioteca ioctl para abrir funcionalidades. En esta sección se explica cómo hacerlo y cómo el uso de ioctls difiere del uso de las funciones genéricas de Linux.
Fragmento de código de funciones avanzadas de ADC muestra cómo leer ADC con las funciones avanzadas de Azure Sphere.
Por ejemplo, puede ver una comparación en paralelo de la lectura de ADC con las implementaciones sysfs simplificadas, avanzadas y linux:
- Fragmento de funciones simplificadas de ADC
- Fragmento de nodos de Linux Sysfs de ADC
- Fragmento de código de funciones avanzadas de ADC
Abrir el canal ADC
Para abrir un controlador ADC para el acceso, utilice la llamada de Linux open
que pasa en la ruta de acceso al directorio que empezará con /dev/adc<number>
donde 'número' es el id. del controlador. Si la llamada se realizó correctamente, se devolverá un descriptor de archivo. En caso contrario, se devuelve un valor de error.
Vea Implementación de ejemplo para parámetros, permisos y comprobación de errores.
Obtener la especificación de canal
Mientras usa las funciones avanzadas, obtenga la especificación de canal mediante llamadas ioctl antes del sondeo, estableciendo el voltaje de referencia o obteniendo el recuento de bits de muestra. Este paso se puede omitir mediante la codificación rígida de algunos de los valores obtenidos, pero no se recomienda. Tenga en cuenta que este paso se controla mediante código proporcionado en las funciones sencillas.
// 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
Establecer la tensión de referencia
Para establecer la tensión de referencia de un canal mediante la API avanzada:
Establezca la información de ADC rellenada en la
iio_ioctl_chan_spec_buffer
estructura recuperada en Obtener especificación de canal.Obtenga el índice de propiedades de la propiedad que se va a establecer para el canal.
Escriba la tensión de referencia utilizando el índice de propiedades y la información de especificación del canal.
Para obtener el índice de la propiedad de voltaje de referencia:
En la
iio_ioctl_chan_spec_buffer
estructura recuperada en Obtener especificación de canal, use el valor delchannel
campo y, desde elchannel
campo, use el valor delext_info
campo. Elext_info
campo es unaiio_ioctl_chan_spec_ext_info
estructura que es el encabezado de una lista vinculada de descriptores de propiedades para el canal.Empezando desde 0, atraviesa la lista contando los nodos hasta que el
name
campo coincida con lareference_voltage
cadena.- Cada nodo de la lista tiene un campo "siguiente" que apunta al nodo siguiente de la lista. El último nodo apunta a NULL.
- El contador resultante es el índice de la propiedad.
Para establecer la tensión de referencia, utilice el
IIO_WRITE_CHANNEL_EXT_INFO_IOCTL
ioctl que toma una estructura de tipoiio_ioctl_write_chan_ext_info
, que contiene los datos relevantes (en este caso el voltaje), el canal que se va a establecer y la propiedad específica (tensión de referencia) que se establece para ese canal.
Obtener el recuento de bits de muestra
Para establecer el voltaje de referencia mediante las API avanzadas:
Asegúrese de que está recibiendo la información del canal ADC adecuado. Esta información se rellena en la
iio_ioctl_chan_spec_buffer
estructura recuperada en la sección Obtener especificación de canal.Obtenga el índice de propiedades de la propiedad que desea leer para el canal, que en este caso es el recuento de bits de ejemplo.
Use ioctls de Linux para obtener el recuento de bits de muestra con el índice de propiedades y la especificación de canales.
Para obtener el índice de propiedades del recuento de bits de muestra, utilice un proceso idéntico a Establecer voltaje de referencia. Sin embargo, al iterar por la lista vinculada llamada ext_info
de tipo iio_ioctl_chan_spec_ext_info
, coinciden con la cadena current_bits
.
Llame al ioctl IIO_READ_CHANNEL_EXT_INFO_IOCTL
para rellenar una estructura de tipo iio_ioctl_read_chan_ext_info
con los datos necesarios en el buffer
campo.
Leer el canal de ADC
Para leer el canal ADC, sondee mediante la llamada IIO_READ_RAW_CHANNEL_INFO_IOCTL
ioctl , pasando la estructura iio_ioctl_raw_channel_info
que se rellenará con los datos del canal ADC.
Implementación de ejemplo
Para leer ADC con la implementación avanzada de Azure Sphere, consulte el fragmento de ejemplo de la aplicación avanzada de ADC.
Para comparar las diferencias semánticas entre interactuar con el periférico al codificar para Azure Sphere y la codificación para un sistema Linux genérico, consulte LinuxSysfsNodes.
Compatibilidad con MT3620
Las características de ADC compatibles con MT3620 se enumeran en Estado de soporte técnico de MT3620. La guía de usuario de la placa de desarrollo MT3620 describe el diseño del pin y las funciones de anclar.
La carpeta HardwareDefinitions del directorio de instalación del SDK de Sphere de Microsoft Azure contiene definiciones para placas de desarrollo, módulos y chips comunes de Azure Sphere. Contiene archivos de encabezado y JSON que definen las interfaces maestras para el MT3620, MT3620 RDB, junto con otro hardware MT3620. La ubicación predeterminada para la carpeta HardwareDefinitions se encuentra C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions
en Windows y /opt/azurespheresdk/HardwareDefinitions
en Linux.