Top / Elec / App / ステッピングモータ

はじめに

全景.jpg
秋月電子で入手できる2相ユニポーラステッピングモータ「BH200575048」を使って、ステッピングモータを扱うための周辺回路を作りました。 ただし、今回はステッピングモータのコントローラとして、秋月電子のH8/3048マイコンボードを使用しています。(手持ちにこれしかなかったのでorz→現在も販売されていますが、3052を使用した少し性能の良いマイコンボードが主力になっているようです。プログラム、及びピン配置は互換性がありますので、そのまま使用できます)

部品について

ステッピングモータ

  • 2相ユニポーラステッピングモータ「BH200575048」 秋月電子のカタログ
    200ステップ(1.8度/ステップ)で、駆動電圧は5〜9Vです。 ステッピングモータ.jpg

モータドライバ

マイコンからの出力では当然駆動できませんので、増幅器が必要になります。

  • 2SC1815GR(東芝)
    Ic 150mA, hfe 200-400 の、非常に手に入りやすいトランジスタです。千石電商にて10本100円くらいで売っています。
  • 2SC2275(NEC)
    Ic 1.5A, hfe 150 の、たまたま手元にあったトランジスタです。^^;若松通商にて1本120円で入手できます。
    これらのトランジスタをダーリントン接続して使用しています。
  • 10E1
    整流ダイオードです。モータから発生する逆起電力による逆流防止用に挟みます。千石電商にて10本100円くらいで売っています。

マイコンボード

(先ほども書きましたが)秋月電子のH8/3048マイコンボードを使用しています。こちらについては、特に説明はしません。

モータドライバの製作

回路図

StepMotor.PNG
こんな感じの、非常に単純な回路です。 この回路を4個一組で、一つのステッピングモータを駆動できます。

実態図

モードラ.jpg モードラ裏面.jpg
こちらの実態図には、二組用意しています。

プログラムの制作

ポートはPBを使用します。 先ほど制作したモータドライバボードの入力端子を以下のように接続します。

PB-1X
PB-2X^
PB-3Y
PB-4Y^
Vcc(+5V)Common

ただし、モータ用電源は、できるだけマイコンとは別電源にしてください。

for文による簡単なプログラム

for文により、ステップ間隔を調整しますが、マイコンがモータ駆動のみに専念するため、あまりオススメではありません。
また励磁パターンは、配列により設定してありますので、コメントアウトを切り替えることで励磁パターンを切り替えることができます。
通常は、高回転数・高トルクが得られる2相励磁を使用します。

  • void wait(int t)
    ウェイト用関数です。 whileでループしていますので、数字が大きいほど長時間のウェイトになります。
  • void motor(int speed)
    モータ駆動用関数です。 配列mdに、予め励磁パターンが設定されていますので、順番にPBに書き込んでいきます。
  • int main(void)
    h8のプログラムでintなんて返す必要はないのですが、gccが警告を出す*1ので、こう書いています。
    PB.DDR = 0xff;
    で、ポートPBを全出力にしています。
    次のfor文で、モータの加速を行っています。
#include <3048.h>

void wait(int t)
{
    while (t--);
}

//モータ駆動
void motor(int speed)
{
  int i;
//  unsigned char md[] = {0x11, 0x22, 0x44, 0x88};  //1相励磁
  unsigned char md[] = {0x33, 0x66, 0xcc, 0x99};  //2相励磁
//  unsigned char md[] = {0x11, 0x33, 0x22, 0x66, 0x44, 0xcc, 0x88, 0x99};  //1-2相励磁

  for (i = 0; i < sizeof(md); i++){
    PB.DR.BYTE = md[i];
    wait(speed);
  }
}

int main(void)
{
  int i, j, speed;
  
  PB.DDR = 0xff;
  speed = 10000;
  
  while (1){
    
    motor(speed);
    
    //加速
    if (j > 5){
      j = 0;
      speed -= 500;
    }else{
      j++;
    }
  }
  
  return 0;
}

割り込みを使用したプログラム

マイコンのタイマ割り込みを使用します。
プログラムを整理するため、関数に細かく分けています。

//ステッピングモータの回転
//タイマ割り込み(ITU0)利用
//10msごとに割り込み

#include <3048.h>

int global_iMotorStep;


//入出力初期化
void init_io(void)
{
  PB.DDR = 0xff;
}


//ITU初期化
void init_itu(void)
{
  ITU0.TCR.BIT.CCLR = 1;      //カウンタクリア要因
  ITU0.TCR.BIT.TPSC = 3;      //タイマプリスケーラ 25MHz / 8 = 3.125MHz
  ITU0.GRA = 62499;           // 1 / 3.125MHz = 3.2e-4 ms , 20ms / 3.2e-4 ms = 15625
  ITU0.TIER.BIT.IMIEA = 1;    //IMFAフラグによる割り込み許可
}


//ITUインターバルタイマ割り込み
void int_imia0(void)
{
  static int iStep = 0;
  
  ITU0.TSR.BIT.IMFA = 0;
  PB.DR.BYTE = global_iMotorStep;
  global_iMotorStep <<= 1;
  if (global_iMotorStep == 0x110){
    global_iMotorStep = 0x11;
  }

}


//主処理
int main(void)
{
  int i;
  
  init_io();
  init_itu();
  
  ITU.TSTR.BIT.STR0 = 1;          //タイマ開始
  global_iMotorStep = 0x11;
  
  EI;       //割り込みの許可
  while(1);
  
  return 0;
}

ちょっと応用

別ページで紹介しているシリアル通信ライブラリと組み合わせた例です。
Tera Term等の通信プログラムからモータの回転速度と励磁パターンを切り替えることができます。

//ステッピングモータの回転
//タイマ割り込み(ITU0)利用
//10msごとに割り込み

#include <3048.h>
#include "h8sci.c"

//ステッピングモータの励磁パターン
#define STEP_PATTERN_1  0
#define STEP_PATTERN_2  1
#define STEP_PATTERN_12 2
unsigned char global_cMotorStep[3][9] = {
  {0x11, 0x22, 0x44, 0x88, 0x11, 0x22, 0x44, 0x88},  //1相励磁
  {0x33, 0x66, 0xcc, 0x99, 0x33, 0x66, 0xcc, 0x99},  //2相励磁
  {0x11, 0x33, 0x22, 0x66, 0x44, 0xcc, 0x88, 0x99}}; //1-2相励磁
unsigned char global_iStepPattern = STEP_PATTERN_2;

//入出力初期化
void init_io(void)
{
  PB.DDR = 0xff;
}


//ITU初期化
void init_itu(void)
{
  ITU0.TCR.BIT.CCLR = 1;      //カウンタクリア要因
  ITU0.TCR.BIT.TPSC = 3;      //タイマプリスケーラ 25MHz / 8 = 3.125MHz
  //ITU0.GRA = 62499;           // 1 / 3.125MHz = 3.2e-4 ms , 20ms / 3.2e-4 ms = 62499
  //ITU0.GRA = 46874;
  ITU0.GRA = 31249;           // 1 / 3.125MHz = 3.2e-4 ms , 10ms / 3.2e-4 ms = 31249
  //ITU0.GRA = 15625;           // 1 / 3.125MHz = 3.2e-4 ms ,  5ms / 3.2e-4 ms = 15625
  ITU0.TIER.BIT.IMIEA = 1;    //IMFAフラグによる割り込み許可
}


//ITUインターバルタイマ割り込み
void int_imia0(void)
{
  static int iStep = 0;
  
  ITU0.TSR.BIT.IMFA = 0;        //割り込みステータスフラグ クリア
  
  //モータの駆動
  PB.DR.BYTE = global_cMotorStep[global_iStepPattern][iStep];
  if (iStep++ > 7){
    iStep = 0;
  }
}


//主処理
int main(void)
{
  int i;
  char cBuffer;
  char strMessage[100];
  
  init_h8sci(BR57600);
  init_io();
  init_itu();
  
  h8sci_out_string("Hello\n");
  
  ITU.TSTR.BIT.STR0 = 1;          //タイマ開始
  
  EI;       //割り込みの許可
  
  while (1){
  
    //キー入力の受付
    cBuffer = h8sci_in_data();
    switch (cBuffer){
      //モータ回転制御
      case 'z':
        ITU0.GRA += 2000;
        h8sci_out_string("> Speed Down\n");
        break;
      case 'a':
        ITU0.GRA += 500;
        h8sci_out_string("> Speed Down\n");
        break;
      case 'q':
        ITU0.GRA -= 500;
        h8sci_out_string("> Speed Up\n");
        break;
      case '1':
        ITU0.GRA -= 2000;
        h8sci_out_string("> Speed Up\n");
        break;
      case 'w':
        global_iStepPattern = STEP_PATTERN_12;
        h8sci_out_string("> Step Pattern 1-2\n");
        break;
      case 's':
        global_iStepPattern = STEP_PATTERN_2;
        h8sci_out_string("> Step Pattern 2\n");
        break;
      case 'x':
        global_iStepPattern = STEP_PATTERN_1;
        h8sci_out_string("> Step Pattern 1\n");
        break;
        
      default:
        break;
    }
    
  }
  
  return 0;
}
2005-09-13 (火) 02:02:01

エレクトロニクス



*1 オプションつけて抑制すればいいのかな?

添付ファイル: file全景.jpg 528件 [詳細] fileモードラ裏面.jpg 495件 [詳細] fileモードラ.jpg 482件 [詳細] fileステッピングモータ.jpg 778件 [詳細] fileStepMotor.PNG 624件 [詳細]
トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2005-12-26 (月) 00:53:43 (4109d)