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:
- Frammento di funzioni semplificate di ADC
- Frammento di nodi ADC Linux Sysfs
- Frammento di snippet funzioni avanzate ADC
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:
Impostare le informazioni ADC popolate nella
iio_ioctl_chan_spec_buffer
struttura recuperata nella specifica Get Channel.Ottenere l'indice della proprietà da impostare per il canale.
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:
iio_ioctl_chan_spec_buffer
Dalla struttura recuperata nella specifica Get Channel, usare il valore delchannel
campo e, dalchannel
campo, usare il valore delext_info
campo. Ilext_info
campo è unaiio_ioctl_chan_spec_ext_info
struttura che rappresenta la testa di un elenco collegato di descrittori di proprietà per il canale.A partire da 0, scorrere l'elenco contando i nodi fino a quando il
name
campo non corrisponde allareference_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à.
Per impostare la tensione di riferimento, utilizzare il
IIO_WRITE_CHANNEL_EXT_INFO_IOCTL
ioctl che accetta una struttura di tipoiio_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:
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.Ottenere l'indice della proprietà che si vuole leggere per il canale, che in questo caso è il numero di bit di esempio.
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 buffer
campo.
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.