Arduinoは入力(アナログ/デジタル)でPWMデューティサイクル値を読み取ります

のような自動操縦の比較に取り組んでいますArdupilot CC3D KK2.1.5 。比較は、飛行中に与えるシステムの反応/動作に関するものです。この目的のために、オートパイロットカードからPWMデューティサイクル(オシラスコープのように、PWM周波数は50〜430 Hzで変化する可能性があります)の値を読み取る必要があります。一般的なクワッドローターには、4つのコマンド入力PWMと4つのesc制御PWMがあります。 デジタル/アナログ入力ピンで8つのデューティサイクル値を読み取る必要があります。 8つのPWM信号のデューティサイクルを測定するにはどうすればよいですか?また、デジタルまたはアナログ測定は正確で高速ですか?

attachInterrupt コマンドに関する注意: arduino.cc によると、AtMega328シリーズには 2 割り込みがあります、Arduino ATmega2560シリーズには 7 割り込みがあります。

回答

質問18183に対する私の回答に示されているコード「PulseInの代わりに割り込みを使用してRCレシーバーチャネルを読み取る」。その答えには、RCPWMの4つのチャネルを読み取るコードが含まれています。 8つのチャネルで動作するように簡単に適合させることができます。選択したピンが変更されたときに実行されるISRがあります。変更されたチャネルを分類し、変更のたびにmicros()の値を保存します。

質問19106に対する私の答え、「外部割り込みを「328(宇野)」で一緒にORすることはできますか?」その答えには、適切なISRコードを生成するためのスケッチが含まれています。 質問32572 「ロータリーエンコーダの方向を検出する方法」に対する私の答えは、別の例を示しています。

デジタル入力。上記のコードで使用されている場合、ISRではマイクロ秒で10マイクロ秒かかります。 dannyfのコメントに記載されているように、forループを展開し、(可能な場合は)変数の代わりに定数を使用すると、ISR内の時間を3.4μsに短縮できます。ISRの開始と終了に注意してください。それでも数マイクロ秒を追加します。

一方、10ビットのアナログ入力は、読み取りごとに約104マイクロ秒かかります。これは、測定するパルス幅の一部に匹敵する時間です。したがって、十分な速度ではありません。ADCの精度の低下が許容できる場合は、 microsmart.co.zaのWebページで説明されているようにADCクロックの倍率を下げることができます。 AD変換時間を20μsに短縮します。これはデジタル入力にかかる時間の約3倍なので、かなり遅くなります。

コメント

  • >はISRで1マイクロ秒未満かかりますが、その可能性は低いと思います。明らかに、'どのコード部分について話しているのかわかりません。それらは3つですが、それらを因果的に見ると、ISRの本体を実行するのに16ティック以上かかることが示唆されます-オーバーヘッドは数えません。実際、私の小さなバーディーはそうすると言いました。 Unoで実行するには8usに近づきます:)
  • @dannyf、それを書いたとき、私はより単純なISR(シングルエンコーダーカウント)の1つを見ていましたので、正しい答えを編集する必要があります時間。ごめんなさい!
  • 問題ありません。2つの提案: 1)whileループを展開します。 2)変数ではなく定数を使用します。また、コードがよりモジュール化されるように、rcOldをISR内で静的にします。これにより、実行時間が3.4usに短縮されました。
  • リンクの代わりにコードを共有できますか。また、AtMega328シリーズには2つの割り込みがあり、Arduino ATmega2560シリーズには7つの割り込みがあります。では、どうすれば8つの同時PWM信号を測定できますか? arduino.cc/en/Reference/attachInterrupt
  • @ acs、ATmega328 ' 26の異なる割り込みベクトル。参照されるコードで使用されるベクトルは、ピン変更割り込み(PCINT)用であり、これらのベクトルのうち3つを使用します。 PCINTは、ATmega328ベースのNanoピンのうち22個で使用でき、Uno 'でも同様の数です。前の質問に示されているコードを参照してください。現時点では、期限を守る必要があります。

回答

アナログで実行する場合は、lpfを介してpwmを実行し、出力でadcを実行します。

デジタルで実行する場合は、タイマーのキャプチャ機能を使用するか、外部割り込み/ピン変更割り込みを使用します。タイムベースからのタイミングをキャプチャします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です