工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial Internet of Things >> 埋め込み

最新のセンサーとのインターフェース:ポーリングされたADCドライバー

前回の投稿では、最新の組み込みアプリケーションで、開発者が低レベルのドライバー実装の詳細をアプリケーションコードから切り離すインターフェイスを作成する方法を検討しました。このインターフェースは、ハードウェアへの依存を減らすことにより、アプリケーションコードのスケーラビリティと移植性を向上させるアーキテクチャの抽象化を提供します。

ここで、マイクロコントローラーの3つのドライバー設計手法で説明した手法に基づいて、開発者がADCドライバーを実装できるいくつかの異なる方法を検討し始めます。この記事では、ポーリング手法の使用方法を詳しく調べ、ブロッキングドライバーと非ブロッキングドライバーの違いについて説明します。

ブロックするかブロックしないか、それが質問です

マイクロコントローラー用のドライバーを開発する場合、開発者はドライバーをブロックするか非ブロックにするかを決定する必要があります。ブロッキングドライバーは、基本的に、ドライバーがタスクを完了するまでコードの実行を停止します。たとえば、UARTにマップされるprintfの一般的な実装はブロッキングです。

次のような電話をかけるとき:

printf( "Hello World!");

開発者は、そのステートメントに続くコード行が「HelloWorld!」全体まで実行されないことを知っています。ステートメントはUARTから出力されています。 "こんにちは世界!" 12バイト、96ビットが含まれていますが、ステートメントがブロックする時間はUARTボーレートによって異なります。 1 Mbpsで構成されたUARTの場合、約96マイクロ秒が予想されます。 9600 bpsで構成されたUARTの場合、約10,000マイクロ秒が予想されます。これは、ハードウェアの構成方法によって大きな違いがあり、UARTドライバーがブロッキングドライバーとして構成されている場合、プログラムの実行に劇的な影響を与える可能性があります。

非ブロッキングドライバーは、ドライバーがタスクを完了している間、プログラムの実行を停止させないドライバーです。たとえば、前の例のprintfとUARTドライバーは、ブロックせず、代わりに各バイトがUARTから送信されている間、アプリケーションが実行を継続できるように構成できます。これにより、適切な状況下でより効率的なアプリケーションを作成できますが、割り込み、DMA、または少なくとも送信バッファの使用など、追加のセットアップが必要になります。

ドライバーを設計する方法の決定は、アプリケーションとハードウェアによって異なります。たとえば、UARTが1 Mbpsに構成されている場合、非ブロッキングドライバーを作成しても、効率の観点からはあまりメリットがなく、プログラムがさらに複雑になることで修正されるよりも多くの問題が発生する可能性があります。ただし、アプリケーションが9600 bpsを要求し、アプリケーションコードが10ミリ秒ブロックされる場合、非ブロックドライバーを使用すると、プログラムの効率が大幅に向上し、タイミングの複雑さの問題がさらに発生するリスクが大幅に軽減され、管理しやすくなります。

組み込みADCドライバーの概要

1つのブログでは、完全なADCドライバーを作成するために必要なすべての手順を説明することはできないことに注意してください。 20ページの論文を簡単に書いたり、ウェビナー全体を提供したりすることはできますが、それでもすべての詳細をカバーすることはできないでしょうが、少なくともいくつかの主要な部分を見ることができます。

ADCドライバーを整理する方法はいくつかありますが、私がそれらを整理する方法には、次の3つのコンポーネントが必要です。

低レベルドライバーは、初期化中に構成モジュールを取得し、構成に基づいてハードウェアをセットアップします。低レベルドライバーは、アプリケーションコードが使用できる共通のハードウェアアブストラクションレイヤー(HAL)を提供します。 ADC HAL呼び出しは、高レベルのアプリケーションが必要な方法でハードウェアを構成できるように、また再利用可能でスケーラブルにできるように、汎用である必要があります。たとえば、私が過去に使用したいくつかのADCHAL呼び出しには次のものがあります。

最初の3つのAPIは、ADCハードウェアを初期化し、変換を開始してから、変換ステータスを確認する機能を提供します。最後の3つの機能は、低レベルのハードウェアへのスケーラビリティを可能にするように設計されています。たとえば、HALが単一のADCチャネルの変換など、アプリケーションに必要なオプションを提供しない場合、HALはAdc_RegisterReadおよびAdc_RegisterWrite関数を使用して拡張できます。これにより、圧倒的なAPIを作成することなく、アプリケーションのニーズに基づいた柔軟性が提供されます。

シンプルなブロッキングADCドライバーの作成

ハードウェア層の上にある非常に単純なADCドライバーを作成できます。たとえば、ADCハードウェアを起動してすべての結果をバッファに保存するAdc_Sampleという名前の単純な関数を作成して、アプリケーションからアクセスできるようにすることができます。アナログ値カウント値を格納するバッファは、必ずしも単一の値を格納する必要はありませんが、アプリケーションのニーズに基づいて後で平均化またはフィルタリングできる複数の値を格納できます。サンプリング関数のブロックバージョンは、次のようになります。

このコードでわかるように、whileループは、ADCハードウェアが変換を完了するまで実行をブロックし、その後、値をアプリケーションバッファーに格納します。

シンプルなノンブロッキングADCドライバーの作成

ブロッキングドライバーを非ブロッキングコードに変換するのは非常に簡単ですが、上位レベルのアプリケーションコードを変更する必要があります。たとえば、現在、アプリケーションがセンサーをサンプリングする場合、開発者は次のように呼び出します。

Adc_Sample();

非ブロッキングバージョンでは、開発者はAdc_Sampleからの戻り値をチェックして、サンプルが完成し、使用できる状態になっているかどうかを確認する必要があります。これにより、サンプルをバックグラウンドで実行し、アプリケーションコードを実行し続け、ドライバーコードを次のように更新できます。

結論

この投稿で見たように、ADCを作成する方法は複数あり、実装は必要に応じてブロッキングまたは非ブロッキングにすることができます。ブロッキングドライバーは、非ブロッキングドライバーよりも単純で完全ではない傾向がありますが、非効率的である可能性があります。非ブロッキングドライバーを使用すると、ドライバーの動作中に他のコードを実行できますが、アプリケーションコードは、ポーリングされた実装ではそれ自体が非効率的なステータスをチェックインする必要があります。

このシリーズの次の記事では、割り込みを使用するADC周辺機器を介してセンサーをサンプリングするアプリケーションを作成する方法を検討します。


埋め込み

  1. センサーの種類と回路図
  2. Bulgin:新しいスリムライン光電センサーを備えた費用効果の高いIIoTソリューション
  3. 革新的なデモンストレーションでSensorsExpo2019をライトアップするams
  4. DATA MODULは、タッチセンサーポートフォリオをさらに大きなサイズに拡張します
  5. Contrinex:Bluetoothインターフェースを備えたクラウド対応のスマートセンサーとセーフティライトカーテン
  6. 統合されたドライバーがステッピングモーターの設計を容易にします
  7. 実際のセンサーで効果を制御する
  8. 1つのGPIOピンでアナログセンサーを読み取る
  9. HC-SR501PIRモーションセンサーとRaspberryPiのインターフェース
  10. IoTセンサーによる大気汚染モニタリングの改善
  11. 建設用トラックのドライバー不足をコンベアで解決