高度なアプリケーションで ADC を使用する

このトピックでは、高度なアプリケーションでアナログ/デジタル コンバータ (ADC) を使用する方法について説明します。 RTApps での ADC の使用については、「リアルタイム対応アプリケーションで周辺機器を使用する」を参照してください。

Azure Sphere では、アナログからデジタルへの変換がサポートされています。 ADCはアナログ入力を対応するデジタル値に変換します。 入力チャンネル数と分解能(ADC出力ビット数)はデバイスによって異なります。

ADC_HighLevelApp サンプルでは、MT3620 デバイス上の ADC にアクセスする方法を示します。

ADC 周辺機器スニペットは、 簡略化された 関数または 高度な 機能を使用して ADC と対話する 2 つの方法を示しています。

MT3620は、8つの入力チャンネルを備えた12ビットADCを内蔵しています。 ADCは入力電圧を基準電圧と比較し、出力として0~4095の値を生成します。 ADC 入力チャネルと GPIO ピン GPIO41 から GPIO48 は、MT3260 上の同じピンにマップされます。 ただし、アプリケーションで ADC を使用する場合は、ADC 入力として使用するために 8 つのピンがすべて割り当てられます。 いずれも GPIO には使用できません。

ADC の要件

ADC と通信するアプリケーションには、adc.h ヘッダー ファイルを含め、ADC 設定を アプリケーション マニフェストに追加する必要があります。

すべてのアプリケーションで ターゲット ハードウェアを設定 し、対応するハードウェア定義ヘッダー ファイルを含める必要があります。

ヘッダー ファイル

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

"path-to-your-target-hardware.h" をハードウェアのヘッダー ファイルへのパスに置き換えます。

アプリケーション マニフェストの設定

アプリケーション マニフェストの ADC 設定には、アプリケーションからアクセスされる ADC コントローラーが一覧表示されます。 これらの設定を構成するには、アプリケーション マニフェストに Adc 機能を追加し、各 ADC コントローラーを機能に追加します。 Azure Sphere アプリケーション マニフェスト のトピックに関する詳細が記載されています。

コードで、ハードウェアに対して定義されている定数を使用して、ADC コントローラーを識別します。 コンパイラは、アプリをビルドするときに、これらの値を生の値に変換します。

たとえば、 MT3620 参照開発ボード (RDB) を対象とするアプリケーションのアプリケーション マニフェストからの抜粋を次に示します。

   "Adc": [ "$MT3620_RDB_ADC_CONTROLLER0" ]

次の抜粋は、 Avnet MT3620 Starter Kit をターゲットとするアプリケーションで同じ ADC コントローラーを指定する方法を示しています。

   "Adc": [ "$AVNET_MT3620_SK_ADC_CONTROLLER0" ]

実装の概要

ADC にアクセスするためのアプリケーションを実装するには、次の 2 つの方法のいずれかを使用します。

このトピックでは、両方の方法について説明します。 各メソッドの完全なサンプル コードは、次のとおりです。

簡素化された機能を備えたADCアクセス

Azure Sphere の高度なアプリケーションは、Applibs ADC API を呼び出すことによって ADC にアクセスできます。

ADC コントローラーを開く

アクセスのために ADC コントローラーを開くには、 ADC_Open を呼び出し、コントローラーの ID をパラメーターとして渡します。 呼び出しが成功すると、ファイル記述子が返されます。 それ以外の場合は、エラー値が返されます。

int ADC_Open(ADC_ControllerId id);

ADC から読み取る

ADC から読み取る場合は、 ADC_Pollを呼び出します。 ADC_Pollに渡すパラメーターは、ADC_Openによって返されるファイル記述子、ADC チャネル、および ADC 値が格納される場所へのポインターです。

ADC_Poll関数によって返される有効なビット数 (解決) を取得するには、 ADC_GetSampleBitCountを呼び出します。

ADC リファレンス電圧を設定する

ADC_SetReferenceVoltageを呼び出してADCリファレンス電圧を設定します。

MT3620は、2.5ボルトのリファレンスを内蔵しています。 あるいは、2.5ボルト以下の外部電圧リファレンスに接続することもできます。

高度な機能を備えた ADC アクセス

周辺機器と対話するための高度な簡略化された関数の代わりに、ioctl ライブラリを利用して機能を開くことができます。 このセクションでは、これを行う方法と、ioctls の使用が汎用 Linux 関数の使用とどのように異なるかについて説明します。

ADC Advanced Functions スニペット は、Azure Sphere の高度な関数を使用して ADC を読み取る方法を示しています。

例として、読み取り ADC と簡略化された高度な Linux sysfs 実装を並べて比較できます。

ADC チャネルを開く

アクセス用の ADC コントローラーを開くには、ディレクトリへのパスを渡す Linux open 呼び出しを使用します。これは、"number" がコントローラー ID で始まります /dev/adc<number> 。 呼び出しが成功した場合、ファイル記述子が返されます。 それ以外の場合は、エラー値が返されます。

パラメーター、アクセス許可、エラー チェックについては、「 実装の例 」を参照してください。

チャネルの仕様を取得する

高度な関数を使用する場合は、ポーリングの前に ioctl 呼び出しを使用してチャネル仕様を取得し、参照電圧を設定するか、サンプル ビット数を取得します。 この手順は、取得した値の一部をハードコーディングすることでスキップできますが、推奨されません。 この手順は、単純な関数で提供されるコードによって処理されることに注意してください。


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

基準電圧を設定する

高度な API を使用してチャネルの参照電圧を設定するには:

  1. Get Channel 仕様で取得した構造体にiio_ioctl_chan_spec_buffer入力された ADC 情報を設定します。

  2. チャネルに設定するプロパティのプロパティ インデックスを取得します。

  3. プロパティ インデックスとチャネル仕様情報を使用して、参照電圧を書き込みます。

参照電圧プロパティのインデックスを取得するには:

  1. iio_ioctl_chan_spec_bufferGet Channel 仕様で取得した構造体から、フィールドの値をchannel使用し、フィールドからchannelフィールドの値をext_info使用します。 ext_infoフィールドは、iio_ioctl_chan_spec_ext_infoチャネルのプロパティ記述子のリンクされたリストの先頭である構造体です。

  2. 0 以降では、フィールドが文字列と一致するまで name ノードをカウントするリストを reference_voltage 走査します。

    • リスト内の各ノードには、リスト内の次のノードを指す "next" フィールドがあります。 最後のノードは NULL を指します。
    • 結果のカウンターは、 プロパティのインデックスです。
  3. 参照電圧を設定するには、関連するデータ (この場合は電圧)、設定するチャネル、そのチャネルに設定されている特定のプロパティ (参照電圧) を含む、型iio_ioctl_write_chan_ext_infoの構造体を受け取る ioctl を使用IIO_WRITE_CHANNEL_EXT_INFO_IOCTLします。

サンプル ビット数を取得する

高度な API を使用して基準電圧を設定するには:

  1. 適切な ADC チャネルの情報を取得していることを確認します。 この情報は、「チャネルの仕様の iio_ioctl_chan_spec_buffer 取得」セクションで取得された構造体に設定されます。

  2. チャネルに対して読み取るプロパティのプロパティ インデックスを取得します。この場合はサンプル ビット数です。

  3. Linux ioctls を使用して、プロパティ インデックスとチャネル仕様を使用してサンプル ビット数を取得します。

サンプル ビット数のプロパティ インデックスを取得するには、 Set reference voltage と同じプロセスを使用します。 ただし、 型iio_ioctl_chan_spec_ext_infoと呼ばれるext_infoリンクされたリストを反復処理する際に、文字列 current_bitsと一致します。

ioctl IIO_READ_CHANNEL_EXT_INFO_IOCTL を呼び出して、型 iio_ioctl_read_chan_ext_info の構造体にフィールドに必要なデータを buffer設定します。

ADC チャネルを読み取る

ADC チャネルを読み取るために、ioctl 呼び出し IIO_READ_RAW_CHANNEL_INFO_IOCTLを使用してポーリングし、ADC チャネルからのデータが入力される構造体 iio_ioctl_raw_channel_info を渡します。

実装例

Azure Sphere の高度な実装を使用して ADC を読み取る方法については、 ADC Advanced アプリサンプルのスニペットを参照してください。

Azure Sphere のコーディング時の周辺機器との対話と汎用 Linux システムのコーディングのセマンティクスの違いを比較するには、「 LinuxSysfsNodes」を参照してください。

MT3620 のサポート

MT3620 でサポートされている ADC 機能は、 MT3620 のサポート状態に記載されています。 MT3620 開発ボードのユーザー ガイドでは、ピン レイアウトとピン機能について説明します。

Microsoft Azure Sphere SDK インストール ディレクトリの HardwareDefinitions フォルダーには、一般的な Azure Sphere 開発ボード、モジュール、チップの定義が含まれています。 これには、MT3620、MT3620 RDB、およびその他の MT3620 ハードウェアのマスター インターフェイスを定義するヘッダーファイルと JSON ファイルが含まれています。 HardwareDefinitions フォルダーの既定の場所は、 C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions Windows と /opt/azurespheresdk/HardwareDefinitions Linux 上にあります。