Usare adc in applicazioni di alto livello

Questo argomento descrive come usare convertitori da analogico a digitale in un'applicazione di alto livello. Per informazioni sull'utilizzo di ADC in RTApps, vedere Usare le periferiche in un'applicazione in tempo reale .

Azure Sphere supporta la conversione da analogico a digitale. Un ADC converte un input analogico in un valore digitale corrispondente. Il numero di canali di input e la risoluzione (come numero di bit di output ADC) dipendono dal dispositivo.

Nell'esempio ADC_HighLevelApp viene illustrato come accedere ad ADC in un dispositivo MT3620.

I frammenti di periferiche ADC mostrano due modi per interagire con gli ADC utilizzando funzioni semplificate o avanzate .

Mt3620 contiene un ADC a 12 bit con 8 canali di input. L'ADC confronta una tensione di input con una tensione di riferimento e produce un valore compreso tra 0 e 4095 come output. I canali di input ADC e GPIO bloccano la mappa da GPIO41 a GPIO48 agli stessi pin sull'MT3260. Tuttavia, se l'applicazione usa ADC, tutti gli 8 pin vengono allocati per l'uso come input ADC. Nessuna di esse può essere utilizzata per GPIO.

Requisiti ADC

Le applicazioni che comunicano con adc devono includere il file di intestazione adc.h e aggiungere le impostazioni ADC al manifesto dell'applicazione.

Tutte le applicazioni devono impostare l'hardware di destinazione e includere il file di intestazione di definizione hardware corrispondente.

File di intestazione

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

Sostituire "path-to-your-target-hardware.h" con il percorso del file di intestazione per l'hardware.

Impostazioni del manifesto dell'applicazione

L'impostazione ADC nel manifesto dell'applicazione elenca i controller ADC a cui l'applicazione accede. Per configurare queste impostazioni, aggiungi la Adc funzionalità al manifesto dell'applicazione e quindi aggiungi ogni controller ADC alla funzionalità. L'argomento manifesto dell'applicazione Azure Sphere contiene ulteriori dettagli.

Nel codice, utilizza le costanti definite per l'hardware per identificare i controller ADC. Il compilatore tradurrà questi valori in valori non elaborati quando si compila l'app.

Ad esempio, ecco un estratto di un manifesto dell'applicazione per un'applicazione che si rivolge a una scheda di sviluppo di riferimento (RDB) di MT3620.

   "Adc": [ "$MT3620_RDB_ADC_CONTROLLER0" ]

Il seguente estratto mostra come specificare lo stesso controller ADC in un'applicazione che si rivolge a Avnet MT3620 Starter Kit:

   "Adc": [ "$AVNET_MT3620_SK_ADC_CONTROLLER0" ]

Panoramica dell'implementazione

Per implementare l'applicazione per l'accesso ad ADC, usare uno dei due approcci seguenti:

Questo argomento descrive entrambi i metodi. Il codice di esempio completo per ogni metodo è disponibile qui:

Accesso ADC con funzioni semplificate

Le applicazioni di alto livello Azure Sphere possono accedere ad ADC chiamando le API ADC Applibs.

Aprire un controller ADC

Per aprire un controller ADC per l'accesso, chiamare ADC_Open e passare l'ID del controller come parametro. Se la chiamata ha esito positivo, verrà restituito un descrittore di file. In caso contrario, verrà restituito un valore di errore.

int ADC_Open(ADC_ControllerId id);

Leggere da un adc

Per leggere da ADC, chiamare ADC_Poll. Per ADC_Poll, passare i seguenti parametri: il descrittore di file restituito da ADC_Open, il canale ADC e un puntatore alla posizione in cui verrà archiviato il valore ADC.

Per ottenere il numero di bit (risoluzione) validi restituiti dalla funzione ADC_Poll, chiamare ADC_GetSampleBitCount.

Impostare la tensione di riferimento ADC

Chiamare ADC_SetReferenceVoltage per impostare la tensione di riferimento ADC.

L'MT3620 è dotato di un riferimento su chip da 2,5 volt. In alternativa, può essere collegato a un riferimento di tensione esterna minore o uguale a 2,5 volt.

Accesso ADC con funzioni avanzate

In alternativa alle funzioni semplificate di alto livello per interagire con la periferica, è possibile sfruttare la libreria ioctl per aprire la funzionalità. In questa sezione viene illustrato come eseguire questa operazione e come l'utilizzo di ioctls è diverso dall'uso delle funzioni Linux generiche.

Frammento di funzioni avanzate ADC mostra come leggere ADC usando le funzioni avanzate di Azure Sphere.

Ad esempio, puoi vedere un confronto affiancato della lettura di ADC con le implementazioni di sysfs semplificate, avanzate e linux:

Aprire il canale ADC

Per aprire un controller ADC per l'accesso, utilizza la chiamata Linux open passando il percorso alla directory che inizierà con /dev/adc<number> il punto in cui "numero" è l'ID controller. Se la chiamata ha avuto esito positivo, viene restituito un descrittore di file. In caso contrario, viene restituito un valore di errore.

Vedere Implementazione di esempio per parametri, autorizzazioni e controllo degli errori.

Ottenere le specifiche del canale

Durante l'uso delle funzioni avanzate, ottenere la specifica del canale utilizzando le chiamate ioctl prima del polling, impostando la tensione di riferimento o ottenendo il numero di bit di esempio. Questo passaggio può essere ignorato codificando a livello di codice alcuni dei valori ottenuti, ma non è consigliabile. Si noti che questo passaggio viene gestito dal codice fornito nelle funzioni semplici.


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

Impostare la tensione di riferimento

Per impostare la tensione di riferimento di un canale utilizzando l'API avanzata:

  1. Impostare le informazioni ADC popolate nella iio_ioctl_chan_spec_buffer struttura recuperata nella specifica Get Channel.

  2. Ottenere l'indice della proprietà da impostare per il canale.

  3. Scrivere la tensione di riferimento utilizzando le informazioni sull'indice di proprietà e sulle specifiche dei canali.

Per ottenere l'indice della proprietà della tensione di riferimento:

  1. iio_ioctl_chan_spec_buffer Dalla struttura recuperata nella specifica Get Channel, usare il valore del channel campo e, dal channel campo, usare il valore del ext_info campo. Il ext_info campo è una iio_ioctl_chan_spec_ext_info struttura che rappresenta la testa di un elenco collegato di descrittori di proprietà per il canale.

  2. A partire da 0, scorrere l'elenco contando i nodi fino a quando il name campo non corrisponde alla reference_voltage stringa.

    • Ogni nodo nell'elenco ha un campo "successivo" che punta al nodo successivo nell'elenco. L'ultimo nodo punta a NULL.
    • Il contatore risultante è l'indice della proprietà.
  3. Per impostare la tensione di riferimento, utilizzare il IIO_WRITE_CHANNEL_EXT_INFO_IOCTL ioctl che accetta una struttura di tipo iio_ioctl_write_chan_ext_info, che contiene i dati rilevanti (in questo caso la tensione), il canale da impostare e la proprietà specifica (tensione di riferimento) impostata per quel canale.

Ottenere il numero di bit di esempio

Per impostare la tensione di riferimento utilizzando le API avanzate:

  1. Assicurati di ottenere le informazioni del canale ADC corretto. Queste informazioni vengono popolate nella iio_ioctl_chan_spec_buffer struttura recuperata nella sezione Get Channel Specification.

  2. Ottenere l'indice della proprietà che si vuole leggere per il canale, che in questo caso è il numero di bit di esempio.

  3. Utilizzare ioctls Linux per ottenere il numero di bit di esempio utilizzando l'indice delle proprietà e le specifiche del canale.

Per ottenere l'indice delle proprietà del numero di bit di esempio, utilizzare un processo identico a Impostare la tensione di riferimento. Tuttavia, durante l'iterazione sull'elenco collegato chiamato ext_info di tipo iio_ioctl_chan_spec_ext_info, corrisponde alla stringa current_bits.

Chiamare il comando ioctl IIO_READ_CHANNEL_EXT_INFO_IOCTL per popolare una struttura di tipo iio_ioctl_read_chan_ext_info con i dati necessari nel buffercampo.

Leggere il canale ADC

Per leggere il canale ADC, poll using the ioctl call IIO_READ_RAW_CHANNEL_INFO_IOCTL, passing in the struct iio_ioctl_raw_channel_info which will be populated with the data from the ADC channel.

Implementazione di esempio

Per leggere ADC con l'implementazione avanzata di Azure Sphere, vedi il frammento nell'esempio di app ADC Advanced.

Per confrontare le differenze nella semantica tra l'interazione con la periferica quando si codifica per Azure Sphere e la codifica per un sistema Linux generico, vedi LinuxSysfsNodes.

Supporto per MT3620

Le funzionalità ADC supportate per MT3620 sono elencate nello stato del supporto per MT3620. Il manuale dell'utente della bacheca di sviluppo MT3620 descrive le funzioni di layout pin e pin.

La cartella HardwareDefinitions nella directory di installazione di Microsoft Azure Sphere SDK contiene le definizioni per comuni schede di sviluppo, moduli e chip di Azure Sphere. Contiene file di intestazione e JSON che definiscono le interfacce master per MT3620, MT3620 RDB, insieme ad altri hardware MT3620. Il percorso predefinito per la cartella HardwareDefinitions è C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions in Windows e /opt/azurespheresdk/HardwareDefinitions su Linux.