Dela via


Använda ADC i program på hög nivå

I det här avsnittet beskrivs hur du använder analoga till digitala konverterare (ADC) i ett program på hög nivå. Mer information om ADC-användning i RTApps finns i Använda kringutrustning i ett program som kan användas i realtid .

Azure Sphere stöder analog till digital konvertering. En ADC konverterar en analog inmatning till ett motsvarande digitalt värde. Antalet indatakanaler och upplösningen (som antal ADC-utdatabitar) är enhetsberoende.

Det ADC_HighLevelApp exemplet visar hur du kommer åt ADC på en MT3620-enhet.

ADC Peripheral-avsnitten visar två sätt att interagera med ADC:er med hjälp av antingen förenklade eller avancerade funktioner.

MT3620 innehåller en 12-bitars ADC med 8 indatakanaler. ADC jämför en ingångsspänning med en referensspänning och ger ett värde mellan 0 och 4095 som utgång. ADC-indatakanalerna och GPIO fäster GPIO41 via GPIO48-kartan på samma stift på MT3260. Men om programmet använder ADC allokeras alla 8 stift för användning som ADC-indata. Ingen av dem kan användas för GPIO.

ADC-krav

Program som kommunicerar med ADC måste innehålla sidhuvudfilen adc.h och lägga till ADC-inställningar i programmanifestet.

Alla program måste ange målmaskinvara och inkludera motsvarande rubrikfil för maskinvarudefinition.

Rubrikfiler

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

Ersätt "path-to-your-target-hardware.h" med sökvägen till huvudfilen för maskinvaran.

Inställningar för programmanifest

ADC-inställningen i programmanifestet visar de ADC-styrenheter som programmet använder. Om du vill konfigurera de här inställningarna lägger du till Adc funktionen i programmanifestet och lägger sedan till varje ADC-kontroll i funktionen. I manifestavsnittet för Azure Sphere-program finns mer information.

Använd konstanterna som har definierats för maskinvaran i koden för att identifiera ADC-kontrollerna. Kompilatorn översätter dessa värden till raw-värden när du skapar appen.

Här är till exempel ett utdrag från ett programmanifest för ett program som riktar in sig på en MT3620-referensutvecklingstavla (RDB).

   "Adc": [ "$MT3620_RDB_ADC_CONTROLLER0" ]

Följande utdrag visar hur du anger samma ADC-styrenhet i ett program som riktar sig till Avnet MT3620 Starter Kit:

   "Adc": [ "$AVNET_MT3620_SK_ADC_CONTROLLER0" ]

Översikt över implementering

Om du vill implementera ditt program för åtkomst till ADC använder du en av två metoder:

I det här avsnittet beskrivs båda metoderna. Du hittar den fullständiga exempelkoden för varje metod här:

ADC-åtkomst med förenklade funktioner

Azure Sphere-program på hög nivå kan komma åt ADC genom att anropa Applibs ADC-API:er.

Öppna en ADC-kontroll

Om du vill öppna en ADC-kontroll för åtkomst ringer du ADC_Open och skickar ID:t för kontrollen som en parameter. En filbeskrivning returneras om samtalet lyckas. Annars returneras ett felvärde.

int ADC_Open(ADC_ControllerId id);

Läsa från en ADC

Om du vill läsa från ADC ringer du ADC_Poll. Du skickar följande parametrar till ADC_Poll: filbeskrivning som returneras av ADC_Open, ADC-kanalen och en pekare till den plats där ADC-värdet lagras.

Om du vill få antalet giltiga bitar (upplösning) som returneras av funktionen ADC_Poll anropar du ADC_GetSampleBitCount.

Ställ in ADC-referensspänningen

Ring ADC_SetReferenceVoltage för att ställa in ADC-referensspänningen.

MT3620 har en on-chip, 2,5 V referens. Alternativt kan den anslutas till en extern spänningsreferens som är mindre än eller lika med 2,5 V.

ADC-åtkomst med avancerade funktioner

Som ett alternativ till de förenklade funktionerna på hög nivå för att interagera med kringutrustningen kan du dra nytta av ioctl-biblioteket för att öppna upp funktionaliteten. I det här avsnittet förklaras hur du gör det och hur användningen av ioctls skiljer sig från att använda de allmänna Linux-funktionerna.

ADC Advanced Functions Snippet visar hur du läser ADC med hjälp av avancerade Azure Sphere-funktioner.

Som ett exempel kan du se en jämförelse sida vid sida av läsning av ADC med implementeringar av förenklade, avancerade och linux-sysfs:

Öppna ADC-kanalen

Om du vill öppna en ADC-kontroll för åtkomst använder du Linux-anropet open som passerar i sökvägen till katalogen som börjar med /dev/adc<number> där "nummer" är styrenhets-ID. En filbeskrivning returneras om samtalet lyckades. Annars returneras ett felvärde.

Se Exempel på implementering för parametrar, behörigheter och felkontroll.

Hämta kanalspecifikationen

När du använder de avancerade funktionerna får du kanalspecifikationen genom att använda ioctl-samtal före avsökning, ställa in referensspänning eller få exempelbiträkningen. Det här steget kan hoppas över genom att hårdkoda vissa av de värden som erhålls, men det rekommenderas inte. Observera att det här steget hanteras av kod som anges i de enkla funktionerna.


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

Ställ in referensspänningen

Så här anger du referensspänningen för en kanal med hjälp av det avancerade API:et:

  1. Ange ADC-informationen i den iio_ioctl_chan_spec_buffer struktur som hämtades i specifikationen för Hämta kanal.

  2. Hämta egenskapsindexet för egenskapen som ska anges för kanalen.

  3. Skriv referensspänningen med hjälp av information om egenskapsindex och kanalspecifikationer.

Så här hämtar du indexet för referensspänningsegenskapen:

  1. Från strukturen iio_ioctl_chan_spec_buffer som hämtas i specifikationen Hämta kanal använder du värdet från channel fältet och använder värdet från ext_info fältet från fältet från channel fältet. Fältet ext_info är en iio_ioctl_chan_spec_ext_info struct som är chefen för en länkad lista med egenskapsbeskrivningar för kanalen.

  2. Från och med 0 bläddrar du igenom listan och räknar noderna tills name fältet matchar strängen reference_voltage .

    • Varje nod i listan har ett "nästa" fält som pekar på nästa nod i listan. Den sista noden pekar på NULL.
    • Den resulterande räknaren är egenskapens index.
  3. För att ställa in referensspänningen IIO_WRITE_CHANNEL_EXT_INFO_IOCTL använder du den ioctl som intar en typ av struct iio_ioctl_write_chan_ext_info, som innehåller relevanta data (i detta fall spänningen), den kanal som ska ställas in och den specifika egenskap (referensspänning) som är inställd för den kanalen.

Få exempel på biträkning

Så här anger du referensspänningen med hjälp av de avancerade API:erna:

  1. Se till att du får information om rätt ADC-kanal. Den här informationen fylls i i strukturen iio_ioctl_chan_spec_buffer som hämtades i avsnittet Hämta kanalspecifikation.

  2. Hämta egenskapsindexet för den egenskap som du vill läsa för kanalen, vilket i det här fallet är exempelbiträkningen.

  3. Använd Linux-ioctls för att få exempelbiträkningen med hjälp av egenskapsindexet och kanalspecifikationen.

Om du vill få egenskapsindexet för antalet sampelbit använder du en process som är identisk med Ange referensspänning. Men när du itererar över den länkade listan som kallas ext_info av typen iio_ioctl_chan_spec_ext_infomatchar du strängen current_bits.

Anropa ioctl IIO_READ_CHANNEL_EXT_INFO_IOCTL om du vill fylla i en typ iio_ioctl_read_chan_ext_info struct med nödvändiga data i fältet buffer.

Läs ADC-kanalen

Om du vill läsa ADC-kanalen gör du en omröstning med hjälp av ioctl-anropet IIO_READ_RAW_CHANNEL_INFO_IOCTL, som passerar i den struct iio_ioctl_raw_channel_info som ska fyllas i med data från ADC-kanalen.

Exempel på implementering

Mer information om hur du läser ADC med avancerad implementering av Azure Sphere finns i avsnittet i exempel på ADC Advanced-appen.

Information om hur du jämför skillnaderna i semantik mellan att interagera med kringutrustningen vid kodning för Azure Sphere och kodning för ett generiskt Linux-system finns i LinuxSysfsNodes.

MT3620-support

De ADC-funktioner som stöds för MT3620 visas i MT3620-supportstatus. Användarhandboken för utvecklingstavlan för MT3620 beskriver pin-layouten och fästfunktionerna.

Mappen HardwareDefinitions i installationskatalogen Microsoft Azure Sphere SDK innehåller definitioner för vanliga azure sphere-utvecklingstavlor, moduler och kretsar. Den innehåller rubrik- och JSON-filer som definierar huvudgränssnitten för MT3620, MT3620 RDB, tillsammans med annan MT3620-maskinvara. Standardplatsen för mappen HardwareDefinitions är C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions i Windows och /opt/azurespheresdk/HardwareDefinitions linux.

Azure Sphere Samples-repo på GitHub innehåller rubrik- och JSON-filer som definierar SPI-huvudgränssnitt för MT3620-chipet och MT3620 RDB, tillsammans med annan MT3620-maskinvara.-->