Usar ADCs em aplicativos de alto nível

Este tópico descreve como usar conversores analógicos para digitais (ADCs) em um aplicativo de alto nível. Consulte Usar periféricos em um aplicativo com capacidade em tempo real para obter informações sobre o uso do ADC em RTApps.

O Azure Sphere dá suporte à conversão analógica para digital. Um ADC converte uma entrada analógica em um valor digital correspondente. O número de canais de entrada e a resolução (como número de bits de saída do ADC) são dependentes do dispositivo.

O exemplo ADC_HighLevelApp demonstra como acessar ADCs em um dispositivo MT3620.

Os snippets periféricos do ADC demonstram duas maneiras de interagir com ADCs usando funções simplificadas ou avançadas .

O MT3620 contém um ADC de 12 bits com 8 canais de entrada. O ADC compara uma tensão de entrada a uma tensão de referência e produz um valor entre 0 e 4095 como sua saída. Os canais de entrada do ADC e o GPIO fixam o mapa GPIO41 a GPIO48 para os mesmos pinos no MT3260. No entanto, se o aplicativo usar o ADC, todos os 8 pinos serão alocados para uso como entradas ADC. Nenhum deles pode ser usado para GPIO.

Requisitos do ADC

Os aplicativos que se comunicam com ADCs devem incluir o arquivo de cabeçalho adc.h e adicionar configurações do ADC ao manifesto do aplicativo.

Todos os aplicativos devem definir seu hardware de destino e incluir o arquivo de cabeçalho de definição de hardware correspondente.

Arquivos de Cabeçalho

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

Substitua "path-to-your-target-hardware.h" pelo caminho para o arquivo de cabeçalho do hardware.

Configurações do manifesto do aplicativo

A configuração do ADC no manifesto do aplicativo lista os controladores ADC acessados pelo aplicativo. Para configurar essas configurações, adicione o Adc recurso ao manifesto do aplicativo e adicione cada controlador ADC ao recurso. O tópico de manifesto do aplicativo do Azure Sphere tem mais detalhes.

Em seu código, use as constantes definidas para seu hardware para identificar os controladores ADC. O compilador traduzirá esses valores em valores brutos ao compilar o aplicativo.

Por exemplo, aqui está um trecho de um manifesto de aplicativo para um aplicativo que tem como destino um RDB (conselho de desenvolvimento de referência) mt3620.

   "Adc": [ "$MT3620_RDB_ADC_CONTROLLER0" ]

O trecho a seguir mostra como especificar o mesmo controlador ADC em um aplicativo que tem como destino o Kit inicial do Avnet MT3620:

   "Adc": [ "$AVNET_MT3620_SK_ADC_CONTROLLER0" ]

Visão geral da implementação

Para implementar seu aplicativo para acessar o ADC, use uma das duas abordagens:

Este tópico descreve ambos os métodos. Você pode encontrar o código de exemplo completo para cada método aqui:

Acesso do ADC com funções simplificadas

Aplicativos de alto nível do Azure Sphere podem acessar ADCs chamando APIs ADC do Applibs.

Abrir um controlador ADC

Para abrir um controlador ADC para acesso, chame ADC_Open e passe a ID do controlador como parâmetro. Um descritor de arquivo será retornado se a chamada for bem-sucedida. Caso contrário, um valor de erro será retornado.

int ADC_Open(ADC_ControllerId id);

Ler de um ADC

Para ler no ADC, chame ADC_Poll. Você passa os seguintes parâmetros para ADC_Poll: o descritor de arquivo retornado por ADC_Open, o canal ADC e um ponteiro para onde o valor do ADC será armazenado.

Para obter o número de bits válidos (resolução) retornados pela função ADC_Poll, chame ADC_GetSampleBitCount.

Definir a tensão de referência do ADC

Chame ADC_SetReferenceVoltage para definir a tensão de referência do ADC.

O MT3620 tem uma referência de 2,5 volts no chip. Como alternativa, ele pode ser conectado a uma referência de tensão externa menor ou igual a 2,5 volts.

Acesso do ADC com funções avançadas

Como alternativa às funções simplificadas de alto nível para interagir com o periférico, você pode aproveitar a biblioteca ioctl para abrir a funcionalidade. Esta seção explica como fazer isso e como usar ioctls difere do uso das funções genéricas do Linux.

Snippet de Funções Avançadas do ADC mostra como ler o ADC usando as funções avançadas do Azure Sphere.

Como exemplo, você pode ver uma comparação lado a lado da leitura do ADC com as implementações simplificadas, avançadas e linux sysfs:

Abrir o canal do ADC

Para abrir um controlador do ADC para acesso, use a chamada Linux open passando o caminho para o diretório que começará com /dev/adc<number> onde 'number' é a ID do controlador. Um descritor de arquivo será retornado se a chamada tiver sido bem-sucedida. Caso contrário, um valor de erro será retornado.

Consulte Implementação de exemplo para parâmetros, permissões e verificação de erros.

Obter a especificação do canal

Ao usar as funções avançadas, obtenha a especificação do canal usando chamadas ioctl antes da votação, definindo a tensão de referência ou obtendo a contagem de bits de exemplo. Essa etapa pode ser ignorada pela codificação de alguns dos valores obtidos, mas não é recomendável. Observe que essa etapa é tratada por código fornecido nas funções simples.


// 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

Definir a tensão de referência

Para definir a tensão de referência de um canal usando a API avançada:

  1. Defina as informações do ADC preenchidas na iio_ioctl_chan_spec_buffer estrutura recuperada na especificação Get Channel.

  2. Obtenha o índice de propriedade da propriedade a ser definido para o canal.

  3. Escreva a tensão de referência usando o índice de propriedade e as informações de especificação do canal.

Para obter o índice da propriedade de tensão de referência:

  1. iio_ioctl_chan_spec_buffer Na estrutura recuperada na especificação Obter Canal, use o valor do channel campo e, do channel campo, use o valor do ext_info campo. O ext_info campo é um iio_ioctl_chan_spec_ext_info struct que é o chefe de uma lista vinculada de descritores de propriedade para o canal.

  2. A partir de 0, atravesse a lista contando os nós até que o name campo corresponda à reference_voltage cadeia de caracteres.

    • Cada nó na lista tem um campo "próximo" que aponta para o próximo nó na lista. O último nó aponta para NULL.
    • O contador resultante é o índice da propriedade.
  3. Para definir a tensão de referência, use o IIO_WRITE_CHANNEL_EXT_INFO_IOCTL ioctl que usa um struct do tipo iio_ioctl_write_chan_ext_info, que contém os dados relevantes (nesse caso, a tensão), o canal a ser definido e a propriedade específica (tensão de referência) definida para esse canal.

Obter a contagem de bits de exemplo

Para definir a tensão de referência usando as APIs avançadas:

  1. Verifique se você está recebendo as informações do canal ADC adequado. Essas informações são preenchidas na iio_ioctl_chan_spec_buffer estrutura recuperada na seção Obter Especificação do Canal.

  2. Obtenha o índice de propriedade da propriedade que você deseja ler para o canal, que nesse caso é a contagem de bits de exemplo.

  3. Use ioctls do Linux para obter a contagem de bits de exemplo usando o índice de propriedade e a especificação do canal.

Para obter o índice de propriedade da contagem de bits de exemplo, use um processo idêntico a Definir tensão de referência. No entanto, ao iterar sobre a lista vinculada chamada ext_info de tipo iio_ioctl_chan_spec_ext_info, corresponda à cadeia de caracteres current_bits.

Chame o ioctl IIO_READ_CHANNEL_EXT_INFO_IOCTL para preencher um struct de tipo iio_ioctl_read_chan_ext_info com os dados necessários no buffercampo.

Ler o canal do ADC

Para ler o canal ADC, pesquise usando a chamada IIO_READ_RAW_CHANNEL_INFO_IOCTLioctl , passando o struct iio_ioctl_raw_channel_info que será preenchido com os dados do canal ADC.

Implementação de exemplo

Para ler o ADC usando a implementação avançada do Azure Sphere, consulte o snippet no exemplo do aplicativo ADC Advanced.

Para comparar as diferenças na semântica entre interagir com o periférico ao codificar para o Azure Sphere e codificar para um sistema Linux genérico, consulte LinuxSysfsNodes.

Suporte a MT3620

Os recursos do ADC com suporte para o MT3620 estão listados no Status de Suporte do MT3620. O guia de usuário do painel de desenvolvimento MT3620 descreve o layout do pino e as funções de fixação.

A pasta HardwareDefinitions no diretório de instalação do SDK do Microsoft Azure Sphere contém definições para placas de desenvolvimento comuns do Azure Sphere, módulos e chips. Ele contém arquivos de cabeçalho e JSON que definem as interfaces master para o MT3620, MT3620 RDB, juntamente com outros hardwares MT3620. O local padrão da pasta HardwareDefinitions está C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions no Windows e /opt/azurespheresdk/HardwareDefinitions no Linux.

O repositório Exemplos do Azure Sphere no GitHub contém arquivos de cabeçalho e JSON que definem interfaces de master SPI para o chip MT3620 e o RDB MT3620, juntamente com outros hardwares MT3620.-->