0

私はarduinoのメガベースのクワッドコプターを扱っており、4つのモーターのPWM周波数をそれぞれ400hzにしようとしています。
4 つの ATmega2560 16 ビット タイマーを使用して 4 つの ESC を PWM で制御し、400hz の周波数に到達できる興味深いソリューションを見つけました。700 ~ 2000µs は、ESC が扱う通常のパルス幅です。
1 秒/リフレッシュ間隔 = 1/0.0025 = 400hz。

this is servo.h lib:
#define MIN_PULSE_WIDTH       700     // the shortest pulse sent to a servo  
#define MAX_PULSE_WIDTH      2000     // the longest pulse sent to a servo 
#define DEFAULT_PULSE_WIDTH  1000     // default pulse width when servo is attached
#define REFRESH_INTERVAL     2500     // minimum time to refresh servos in microseconds 

#define SERVOS_PER_TIMER       1     // the maximum number of servos controlled by one timer 
#define MAX_SERVOS   (_Nbr_16timers  * SERVOS_PER_TIMER)

問題は、各 PWM を 1 つの 16 ビット タイマーで制御する必要があることです。それ以外の場合、たとえば、1 つのタイマーで 2 つの ESC を実行すると 200hz になります。そのため、すべての 16 ビット タイマーは 4 つの ESC の制御でビジーですが、受信機から入力 PPM を読み取る必要があります。そのためには、もう持っていない 16 ビット タイマーが少なくとももう 1 つ必要です。
通常の数値 escs が 1000..2000 などで動作するのに対し、それは 0..255 の数値しか読み取ることができない 1 つの 8 ビット タイマー フリー ビットです。

では、pwm と ppm の両方の読み取りに同じ 16 ビット タイマーを使用するとどうなるでしょうか? それはうまくいくでしょうか?急激に速度が落ちますか?
データのフィルタリング、デバッグなどを制御する Raspberry Pi とペアで arduino を使用していますが、ppm の読み取り値を Raspberry に移動した方がよいでしょうか?

4

2 に答える 2

0

700 と 2000 の単位は何ですか?私は usec を推測します。あなたの質問ではあまり説明していませんが、700 usec のオン時間が 0 度で、2000 が 180 度のパルス入力である 25 ミリ秒のパルスが必要であることを確認しました。各サーボには、AVR の任意の GPIO を接続できます。この GPIO は、サーボに PWM 信号を提供します。したがって、1 つのタイマーだけですべてのモーターを制御することもできると思います。この種のコードを使用すると、次のようになります。

50 秒ごとに割り込みを生成するタイマーがあるとします。モーターに 700 usec、モーター 3 に 2,900 usec、モーター 4 に 1,000 usec が必要な場合は、次のようにします。

#define CYCLE_PERIOD 500 // for 25 msec = 50 usec * 500

unsigned short motor1=14;  // 700usec = 50x14
unsigned short motor2=16;  // 800usec
unsigned short motor3=18;  // 900usec
unsigned short motor4=20;  // 1000usec

unsigned char motor1_high_flag=1;
unsigned char motor2_high_flag=1;
unsigned char motor3_high_flag=1;
unsigned char motor4_high_flag=1;

PA.0 = 1; // IO for motor1 
PA.1 = 1; // IO for motor2
PA.2 = 1; // IO for motor3
PA.3 = 1; // IO for motor4

void timer_inturrupt_at_50usec()
{
   motor1--;motor2--;motor3--;motor4--;
   if(!motor1)
   {
      if(motor1_high_flag)
      {
          motor1_high_flag = 0;
          PA.0 = 0;
          motor1 = CYCLE_PERIOD - motor1;
      }
      if(!motor1_high_flag)
      {
          motor1_high_flag = 1;
          PA.0 = 1;
          motor1 = 14;    // this one is dummy;if you want to change duty time update this in main
      }
   }

   if(!motor2)
   {
      if(motor2_high_flag)
      {
          motor2_high_flag = 0;
          PA.1 = 0;
          motor2 = CYCLE_PERIOD - motor2;
      }
      if(!motor2_high_flag)
      {
          motor2_high_flag = 1;
          PA.1 = 1;
          motor2 = 16;
      }
   }


   if(!motor3)
   {
      if(motor3_high_flag)
      {
          motor3_high_flag = 0;
          PA.2 = 0;
          motor3 = CYCLE_PERIOD - motor3;
      }
      if(!motor3_high_flag)
      {
          motor3_high_flag = 1;
          PA.2 = 1;
          motor3 = 18;
      }
   }

   if(!motor4)
   {
      if(motor4_high_flag)
      {
          motor4_high_flag = 0;
          PA.3 = 0;
          motor4 = CYCLE_PERIOD - motor4;
      }
      if(!motor4_high_flag)
      {
          motor4_high_flag = 1;
          PA.3 = 1;
          motor4 = 19;
      }
   }
}

& ESC とは何か教えてください。

于 2015-01-12T13:58:45.660 に答える