2012-03-07 12 views
2

私はモータ制御用の組み込みアプリケーションを開発しており、ADCの数値を符号付き物理値(Amps)に変換する計算には何があるのか​​疑問があります。どこに計算を入れますか?割り込みハンドラまたはメインループの内部? (埋め込みリアルタイムアプリケーション)

割り込みハンドラで計算する必要がありますか、フラグが設定されているときにグローバルループを設定してメインループで計算するだけでよいですか?

ありがとうございます。

答えて

1

これには一応の答えはありません。あなたのタイミング要件、既存の割り込み負荷などに依存します。

これはかなり単純な乗算または何かの場合は、私はちょうど割り込みでそれを行うと移動します。

あなたがしていることを知っているかどうかを確認し、割り込みよりも時間を過ごさないようにしてください。

3

割込みハンドラでできることが少ないほど良いでしょう。あなたのアプリケーションにとって大きな問題はないかもしれませんが、システムの負荷が高くなり、優先順位の高い他のタスクを中断して割り込みを処理したくない場合があります。単にグローバルフラグを設定するのではなく、セマフォと適切なマルチスレッドを調べることができます。

+0

ベアメタルを実行している場合、セマフォを持っていない可能性があります。 –

+0

絶対に。しかし、基本的なスレッディングやセマフォーの実装にかかるオーバーヘッドはそれほど多くなく、プログラミングプロセスを真剣に*緩和することができます。 –

+0

@Carl、おそらく、セマフォとスレッディングを使用するというアイデアや、アプリケーションがすでにかなり複雑なので、プログラミングを簡単にする方法を詳しく説明することができます。この段階でrtosを適応させるのは恐ろしいようです。 –

2

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

たとえば、ADCが8カウント/ボルトを出力し、ADCが1.5ボルトを超えると報告すると非常停止を発生させる必要がある場合は、割り込みコードを書いて12カウントで停止させます。 ADCのカウントをメインループに引き渡して、ユーザインタフェースのためにユーザーフレンドリーなユニットに変換することができます。

一般的な原則は、締め切りを満たすことを保証するために、それらの期限を満たすためにできるだけ簡単にするための設定。何かがハードデッドラインを持っていない場合は、それをメインループに入れてください(もう一度、一般的に)。

0

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

delta = data-lastData; 
    //ISR could update data here. 
    lastData = data; 
    something = K1* data + K2 * delta; //this may be wrong now 
関連する問題