4

プロジェクトに STM32F4 検出ボードを使用していますが、問題に正しく取り組んでいるかどうか疑問に思っています。ボタンを押すと、ルーチンを実行する外部割り込みがトリガーされます。遅延を使用しない場合、この部分は正常に機能します。ルーチンがサーボを動かしてから元の位置に戻すと、サーボが元の位置に戻る前に新しい PWM 出力に追いつくことができるように遅延が追加されます。遅延を使用して新しい割り込みルーチンを実行すると、ボードがロックされます。デバッグでは、コードが遅延ループで停止しているように見えます。

遅延は単純な sysstick ルーチンです。これを割り込み内に配置するのは悪い習慣 (つまり、クラッシュの原因) ですか? 別の方法を使用する必要がありますか? たとえば、設定時間後にサーボを返す外部割り込みルーチン内にワンショットタイマーを設定しますか?

ありがとう!

4

2 に答える 2

6

お気づきのとおり、割り込みルーチンは、外部イベントの迅速な処理を実行し、追加の作業を他の機能に任せることを目的としています。これが、あなたの場合、遅延ループによってボードがロックされる理由です。コードが割り込みハンドラー内でスリープしている間、他の作業は実行されません。これは、すべての割り込みハンドラに共通する特徴です。

別のタスク(サーボを再度動かす)を実行する必要がある場合は、説明したようにスケジュールします。

  • サーボが指定された時間内に目的の位置に到達したことが保証されている場合は、その時間後に起動するようにタイマーを設定します
  • サーボ機構が指定された位置に到達したときに、おそらく別の割り込みを介して通知できる場合は、それを使用して元の位置に戻る動きを処理します。
于 2015-02-24T12:30:00.383 に答える
1

割り込みを生成できる予備のタイマーがあると仮定すると、次のステップを開始するタイマー割り込みハンドラーを割り込みハンドラーにセットアップさせることができます。セットアップされ、後で割り込みハンドラーによって呼び出される関数へのポインターを使用して、一連の論理ステップを通じて割り込み駆動プロセスを進めます。場合によっては、関数への一連の階層ポインターがあり、関数への各ポインターは、論理関数の終了アクション ハンドラーを呼び出すために使用されます。たとえば、高レベル関数 (準備完了の待機関数など) の終了アクション関数ポインターが設定され、高レベル関数が呼び出されます。次に、その高レベル関数は、低レベル関数の終了アクション関数ポインターを設定し、低レベル関数を呼び出してそれを開始します。次に、低レベル関数は、割り込み終了アクション関数ポインターを設定します。

正確なタイミングを維持し、一定期間のドリフトを回避するには、すべての「遅延」をタイマーの元の読み取り値に基づいて行う必要があります。ステップごとに、次の遅延ポイントを決定するために、タイマーの元の読み取り値で初期化された変数に固定カウントを追加します。タイマーの正確な倍数ではない周波数の場合、除算を使用して商と剰余を生成し、剰余を累積して各間隔ステップで必要に応じて商を切り上げることができます。

于 2015-02-24T16:16:28.810 に答える