[H8-ML(4070)] Re: [H8-ML(4068)]モータの制御について
From: "Kazuaki Kamei" <kkamei@xxxxxxxxxxxxxxxxx>
Date: 2003年11月11日(火)12時09分02秒
亀井@大和市在住です

> > 既にこのような制御プログラムの経験がある方や、
> > 何かいい案がある方がいれば教えてください。

少し興味のある話題です。

私の作ったパルスジェネレータです。
Nios cpu 16bit版 20MHz で 約500Kppsが出ています。
私も、もっと良いジェネレータプログラムを知りたいので
どなたか公開して頂けませんか?

下記は、8bitのバスに ステッピングモータの CW/CCW信号を2ビット接続
して使っています。
参考になるでしょうか(*^_^*)


//アドレスの定義
#define MOTOR     (*((volatile unsigned int *)(0x868)))   //モーター接続コネクタ(CN5)のアドレス

//モータードライブのパラメータ・グローバル変数
unsigned int hi;          // 速度上限値  1〜lo    (    1 = 最大速度)
unsigned int lo;          // 速度下限値 hi〜65534 (65534 = 最低速度)
unsigned int acc;        // 加減速時間  1〜8     (    1 = 最大加速)
unsigned int feed;       // 送りパルス量
unsigned char rev;       // パルス出力の[ON]ビットパターン 8Bit

//モーター関数のプロトタイプ宣言
void motor_run(void); 

//***************************
//      メインプログラム
//***************************
int main(void)
{
    //動作に必要なパラメータを変数にセットする
       hi   = 150;             // 速度上限値セット 
       lo   = 1000;            // 速度下限値セット
       acc  = 2;               // 加減速時間セット
       feed = 50;              // 送出パルス数の設定
       rev  = 0x55;           // 回転方向の設定(ポートに出すON信号パターン)

loop:
   //起動条件は適当に入れる事・・・
       motor_run();          // モーター駆動関数の呼び出し
    goto loop;

 }//end



//モーター位置決め駆動関数++++++++++++++++++++++++++++++++++++++++++++++++

void motor_run(void)
{
     unsigned int a;     // 送りパルス数:出力済みパルス数 の比較変数
     unsigned int b;     // パルス間隔減算タイマーの加算変数
     unsigned int c;     // パルス間隔減算タイマーの比較変数 
     unsigned int e;     // 加速に使ったパルス数
     unsigned int k;

//加速駆動部 --------------------------------------------------------------
 
    c = lo; // 加減速パルス間隔タイマーの減算値 
    e = 0; // 加減速パルスの数

    for(a=1 ; a<=feed/2 ; a++)       // 送りパルスの前半(1/2)を処理
    { 
       MOTOR = rev;                // パルス [ONのパターン]
       if(c > hi)                        // 加速タイマーが速度上限値以下なら
       { c = lo / a * acc;            // 加速タイマー値のセット
        e++;                             // e <= 加速に使ったパルス数を加算   
       }
       if(c < hi){ c = hi; }       
       for(b=0 ; b<=c ; b++){}        // 加速パルス間隔タイマー
       MOTOR = 0xff;                 // パルス [OFFのパターン] 
    }
   
//減速駆動部  ----------------------------------------------------------- 
  
    for(a=feed/2 ; a>=1 ; a--)           // 送りパルスの後半(1/2)を処理
    { 
       MOTOR = rev;                      // パルス [ONのパターン]
       if(a<e ){c = lo / a * acc ;}        // 減速領域ならタイマー値のセット
       for(b=0;b<=c;b++){}                 // 減速パルス間隔タイマー
       MOTOR = 0xff;                      // パルス [OFFのパターン]   
    } 
} //end 


スレッド概略
[4068(R)](起点)
 └[4069(U)]
   └[表示中]
     └[4072(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]