Share via


Verwenden von ADCs in allgemeinen Anwendungen

In diesem Thema wird die Verwendung von Analog-Digital-Konvertern (ADCs) in einer allgemeinen Anwendung beschrieben. Informationen zur Verwendung von ADC in RTApps finden Sie unter Verwenden von Peripheriegeräten in einer Echtzeitanwendung .

Azure Sphere unterstützt die analoge in digitale Konvertierung. Ein ADC konvertiert einen analogen Eingang in einen entsprechenden digitalen Wert. Die Anzahl der Eingabekanäle und die Auflösung (als Anzahl der ADC-Ausgabebits) sind geräteabhängig.

Das ADC_HighLevelApp Beispiel veranschaulicht den Zugriff auf ADCs auf einem MT3620-Gerät.

Die ADC-Peripherie-Codeausschnitte veranschaulichen zwei Möglichkeiten der Interaktion mit ADCs mithilfe vereinfachter oder erweiterter Funktionen.

Das MT3620 enthält einen 12-Bit-ADC mit 8 Eingangskanälen. Der ADC vergleicht eine Eingangsspannung mit einer Referenzspannung und erzeugt als Ausgang einen Wert zwischen 0 und 4095. Die ADC-Eingabekanäle und die GPIO-Pins GPIO41 bis GPIO48 sind den gleichen Pins auf dem MT3260 zugeordnet. Wenn Ihre Anwendung jedoch den ADC verwendet, werden alle 8 Pins für die Verwendung als ADC-Eingaben zugewiesen. Keiner von ihnen kann für GPIO verwendet werden.

ADC-Anforderungen

Anwendungen, die mit ADCs kommunizieren, müssen die Headerdatei adc.h enthalten und dem Anwendungsmanifest ADC-Einstellungen hinzufügen.

Alle Anwendungen müssen ihre Zielhardware festlegen und die entsprechende Hardwaredefinitionsheaderdatei enthalten.

Headerdateien

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

Ersetzen Sie "path-to-your-target-hardware.h" durch den Pfad zur Headerdatei für Ihre Hardware.

Anwendungsmanifesteinstellungen

Die ADC-Einstellung im Anwendungsmanifest listet die ADC-Controller auf, auf die die Anwendung zugreift. Um diese Einstellungen zu konfigurieren, fügen Sie die Adc Funktion dem Anwendungsmanifest hinzu, und fügen Sie dann jeden ADC-Controller zur Funktion hinzu. Weitere Informationen finden Sie im Thema Azure Sphere-Anwendungsmanifest .

Verwenden Sie in Ihrem Code die Konstanten, die für Ihre Hardware definiert sind, um die ADC-Controller zu identifizieren. Der Compiler übersetzt diese Werte beim Erstellen der App in Rohwerte.

Hier ist beispielsweise ein Auszug aus einem Anwendungsmanifest für eine Anwendung, die auf ein MT3620 Reference Development Board (RDB) ausgerichtet ist.

   "Adc": [ "$MT3620_RDB_ADC_CONTROLLER0" ]

Der folgende Auszug zeigt, wie Sie denselben ADC-Controller in einer Anwendung angeben, die auf das Avnet MT3620 Starter Kit ausgerichtet ist:

   "Adc": [ "$AVNET_MT3620_SK_ADC_CONTROLLER0" ]

Übersicht über die Implementierung

Verwenden Sie einen von zwei Ansätzen, um Ihre Anwendung für den Zugriff auf ADC zu implementieren:

In diesem Thema werden beide Methoden beschrieben. Den vollständigen Beispielcode für jede Methode finden Sie hier:

ADC-Zugriff mit vereinfachten Funktionen

Allgemeine Azure Sphere-Anwendungen können auf ADCs zugreifen, indem sie Applibs-ADC-APIs aufrufen.

Öffnen eines ADC-Controllers

Um einen ADC-Controller für den Zugriff zu öffnen, rufen Sie ADC_Open auf, und übergeben Sie die ID des Controllers als Parameter. Wenn der Aufruf erfolgreich ist, wird ein Dateideskriptor zurückgegeben. Andernfalls wird ein Fehlerwert zurückgegeben.

int ADC_Open(ADC_ControllerId id);

Lesen aus einem ADC

Um aus dem ADC zu lesen, rufen Sie ADC_Poll auf. Sie übergeben die folgenden Parameter an ADC_Poll: den von ADC_Open zurückgegebenen Dateideskriptor, den ADC-Kanal und einen Zeiger auf den Speicherort des ADC-Werts.

Um die Anzahl der gültigen Bits (Auflösung) abzurufen, die von der ADC_Poll-Funktion zurückgegeben werden, rufen Sie ADC_GetSampleBitCount auf.

Festlegen der ADC-Referenzspannung

Rufen Sie ADC_SetReferenceVoltage auf, um die ADC-Referenzspannung festzulegen.

Das MT3620 verfügt über eine On-Chip-Referenz mit 2,5 Volt. Alternativ kann es an einen externen Spannungsbezug angeschlossen werden, der kleiner oder gleich 2,5 Volt ist.

ADC-Zugriff mit erweiterten Funktionen

Als Alternative zu den allgemeinen vereinfachten Funktionen für die Interaktion mit dem Peripheriegerät können Sie die ioctl-Bibliothek nutzen, um die Funktionalität zu öffnen. In diesem Abschnitt wird erläutert, wie dies funktioniert und wie sich die Verwendung von ioctls von der Verwendung der generischen Linux-Funktionen unterscheidet.

Der Codeausschnitt für erweiterte ADC-Funktionen zeigt, wie ADC mithilfe der erweiterten Azure Sphere-Funktionen gelesen wird.

Als Beispiel können Sie einen parallelen Vergleich des Lesens von ADC mit den vereinfachten, erweiterten und Linux-Sysfs-Implementierungen sehen:

Öffnen des ADC-Kanals

Um einen ADC-Controller für den Zugriff zu öffnen, verwenden Sie den Linux-Aufruf open , der den Pfad zum Verzeichnis übergibt, der mit /dev/adc<number> beginnt, wobei "number" die Controller-ID ist. Wenn der Aufruf erfolgreich war, wird ein Dateideskriptor zurückgegeben. Andernfalls wird ein Fehlerwert zurückgegeben.

Informationen zu Parametern, Berechtigungen und Fehlerüberprüfungen finden Sie unter Beispielimplementierung .

Abrufen der Kanalspezifikation

Rufen Sie bei Verwendung der erweiterten Funktionen die Kanalspezifikation ab, indem Sie ioctl-Aufrufe vor dem Abruf verwenden, die Referenzspannung festlegen oder die Stichprobenbitanzahl abrufen. Dieser Schritt kann übersprungen werden, indem einige der erhaltenen Werte hartcodiert werden. Dies wird jedoch nicht empfohlen. Beachten Sie, dass dieser Schritt von Code verarbeitet wird, der in den einfachen Funktionen bereitgestellt wird.


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

Festlegen der Referenzspannung

So legen Sie die Referenzspannung eines Kanals mithilfe der erweiterten API fest:

  1. Legen Sie die ADC-Informationen fest, die in der Struktur aufgefüllt werden, die iio_ioctl_chan_spec_buffer unter Get Channel specification abgerufen wurde.

  2. Ruft den Eigenschaftenindex der Eigenschaft ab, die für den Kanal festgelegt werden soll.

  3. Schreiben Sie die Referenzspannung mithilfe des Eigenschaftenindexes und der Kanalspezifikationsinformationen.

So rufen Sie den Index der Referenzspannungseigenschaft ab:

  1. Verwenden Sie aus der iio_ioctl_chan_spec_buffer In Get Channel-Spezifikation abgerufenen Struktur den Wert aus dem channel Feld und aus dem channel Feld den Wert aus dem ext_info Feld. Das ext_info Feld ist eine iio_ioctl_chan_spec_ext_info Struktur, die der Kopf einer verknüpften Liste von Eigenschaftendeskriptoren für den Kanal ist.

  2. Ab 0 durchlaufen Sie die Liste, die die Knoten zählt, bis das name Feld mit der reference_voltage Zeichenfolge übereinstimmt.

    • Jeder Knoten in der Liste verfügt über ein Feld "Weiter", das auf den nächsten Knoten in der Liste verweist. Der letzte Knoten zeigt auf NULL.
    • Der resultierende Zähler ist der Index der Eigenschaft.
  3. Um die Referenzspannung festzulegen, verwenden Sie die IIO_WRITE_CHANNEL_EXT_INFO_IOCTL ioctl, die eine Struktur vom Typ iio_ioctl_write_chan_ext_infoannimmt, die die relevanten Daten (in diesem Fall die Spannung), den festzulegenden Kanal und die spezifische Eigenschaft (Referenzspannung) enthält, die für diesen Kanal festgelegt ist.

Abrufen der Bitanzahl des Beispiels

So legen Sie die Referenzspannung mithilfe der erweiterten APIs fest:

  1. Stellen Sie sicher, dass Sie die Informationen zum richtigen ADC-Kanal erhalten. Diese Informationen werden in der iio_ioctl_chan_spec_buffer Struktur aufgefüllt, die im Abschnitt Kanalspezifikation abrufen abgerufen wurde.

  2. Rufen Sie den Eigenschaftenindex der Eigenschaft ab, die Sie für den Kanal lesen möchten, in diesem Fall die Anzahl der Stichprobenbits.

  3. Verwenden Sie Linux ioctls, um die Beispielbitanzahl mithilfe des Eigenschaftenindexes und der Kanalspezifikation abzurufen.

Um den Eigenschaftsindex der Stichprobenbitanzahl abzurufen, verwenden Sie einen Prozess, der mit Bezugsspannung festlegen identisch ist. Beim Durchlaufen der verknüpften Liste vom ext_info Typ iio_ioctl_chan_spec_ext_infostimmen Sie jedoch mit der Zeichenfolge current_bitsüberein.

Rufen Sie ioctl IIO_READ_CHANNEL_EXT_INFO_IOCTL auf, um eine Struktur vom Typ iio_ioctl_read_chan_ext_info mit den erforderlichen Daten im bufferFeld aufzufüllen.

Lesen des ADC-Kanals

Um den ADC-Kanal zu lesen, rufen Sie mit dem ioctl-Aufruf IIO_READ_RAW_CHANNEL_INFO_IOCTLab, und übergeben Sie die Struktur iio_ioctl_raw_channel_info , die mit den Daten aus dem ADC-Kanal aufgefüllt wird.

Beispielimplementierung

Informationen zum Lesen von ADC mithilfe der erweiterten Azure Sphere-Implementierung finden Sie im Codeausschnitt im ADC Advanced App-Beispiel.

Informationen zum Vergleich der Semantikunterschiede zwischen der Interaktion mit dem Peripheriegerät beim Codieren für Azure Sphere und der Codierung für ein generisches Linux-System finden Sie unter LinuxSysfsNodes.

MT3620-Unterstützung

Die unterstützten ADC-Features für den MT3620 sind unter MT3620-Supportstatus aufgeführt. Im Benutzerhandbuch des MT3620-Entwicklungsboards werden das Pinlayout und die Pinfunktionen beschrieben.

Der Ordner HardwareDefinitions im Installationsverzeichnis des Microsoft Azure Sphere SDK enthält Definitionen für allgemeine Azure Sphere-Entwicklungsboards, -Module und -Chips. Sie enthält Header- und JSON-Dateien, die die master Schnittstellen für mt3620, MT3620 RDB und andere MT3620-Hardware definieren. Der Standardspeicherort für den Ordner HardwareDefinitions ist C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions unter Windows und /opt/azurespheresdk/HardwareDefinitions unter Linux.

Das Repository mit den Azure Sphere-Beispielen auf GitHub enthält Header- und JSON-Dateien, die SPI master Schnittstellen für den MT3620-Chip und MT3620 RDB sowie andere MT3620-Hardware definieren.>