2

私はモーター制御用の組み込みアプリケーションを開発していますが、ADCの数値を符号付きの物理値(アンペア)に変換するいくつかの計算をどうするかについて疑問があります。

割り込みハンドラーで計算を行う必要がありますか、それともハンドラーを使用してグローバルフラグを設定し、フラグが設定されたときにメインループで計算を行う必要がありますか?

前もって感謝します。

4

4 に答える 4

3

割り込みハンドラで実行できる作業が少ないほど、優れています。今のところ、アプリケーションにとっては大したことではないかもしれませんが、システムの負荷が高くなり、割り込みを処理するために他の優先度の高いタスクを延期したくない場合があります。グローバルフラグを設定するだけでなく、セマフォと適切なマルチスレッドを調べたい場合があります。

于 2012-03-07T22:13:01.670 に答える
2

これは、ADC値で何をしたいか、およびそれを実行する必要がある速度によって異なります。ADC値に基づいてタイムクリティカルなアクションを実行する必要がある場合は、割り込みで対処する必要があります。ただし、これが当てはまる場合は、ADCカウントから「実際の」アナログ値を最初に計算する費用を節約するために、ADCカウントの観点から重要なしきい値を表す必要があります。

たとえば、ADCが1ボルトあたり8カウントを出力し、ADCが1.5ボルトを超えると報告した場合に緊急停止を起動する必要がある場合、12カウントでEストップを起動するように割り込みコードを記述します。その後、ADCカウントをメインループに渡して、ユーザーインターフェイスなどの目的でユーザーフレンドリーなユニットに変換することができます。

一般的な原則は、期限に間に合うことを保証するために、アプリケーションと設定を構造化して、期限にできるだけ簡単に間に合うようにすることです。何かに厳しい期限がない場合は、それをメインループに入れます(これも一般的に)。

于 2012-03-07T22:20:36.570 に答える
2

これに対する万能の答えはありません。タイミング要件、既存の割り込み負荷などによって異なります。

かなり単純な乗算か何かの場合は、割り込みでそれを実行して次に進みます。

自分が何をしているのかを理解していることを確認し、必要以上に割り込みに時間を費やさないようにしてください。

于 2012-03-07T22:21:52.843 に答える
0

考慮すべきことの1つは、データの一貫性です。ADCからいくつかの関連する値(位置、電圧、電流など)を取得している場合は、一貫したセットで作業していることを確認するために何かを行うことができます。これは、バックグラウンド更新がISRの更新よりも優れていることを意味する場合があります。アルゴリズムの特定のパスに対する単一の読み取りの一貫性でさえ重要な場合があります。このバックグラウンドコードを検討してください。

  delta = data-lastData;
  //ISR could update data here.
  lastData = data;
  something = K1* data + K2 * delta;  //this may be wrong now
于 2012-03-09T08:02:42.917 に答える