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

質問が来て嬉しいです(*^_^*)


> ご返答ありがとうございます。
> 
> c = lo / a * acc;            // 加速タイマー値のセット

着眼点は、 lo(定数です値は変わりません)
        a(変数です、ループ毎に値は増えます) 
        acc(定数です値は変わりません) 

分母がどんどん増えますから

Cの値は、どんどん 減ります。

> 
> の計算の意味が今ひとつ分からないのですが、
> 詳しく教えてはいただけないでしょうか?
> よろしくお願いします。
> 素人ですみません。

考え方として、加速する時には 出力するパルスの間隔が
段々と狭く(短い間隔)になりますよね。
つまり、時間稼ぎのタイマー(for 〜 next ループ)の設定値は
段々と小さくなる事が必要です。
従って 変数 C の値は段々減少するようになっています。
以下は、加速部のパルス間隔時間稼ぎです。

 >        if(c < hi){ c = hi; }

加速は、 hi(速度上限値)に達すると if 文でキャンセルされ
変数 C (パルス間隔タイマー値)には、速度上限値が入ります。
そして、速度上限値の値で(for 〜 next ループ)が行われて
パルス間隔が一定となり、加速を終えて定速領域に移行します。

 >         for(b=0 ; b<=c ; b++){}        // 加速パルス間隔タイマー

言うまでも無く、設定値 C の数だけループする待ち部分です。

C  = 次のパルスを出すまでループして待つ回数で
   数値が多いほど遅くなる
lo = 速度の下限値で数値が多いほど遅い
a  = 加速部では、パルスを出した数
   減速部では、残りのパルス数
acc=加減速時間で数値が大きいほど

減速部の考え方は上記の逆です。

> 
> ----- Original Message ----- 
> From: "Kazuaki Kamei" <kkamei@xxxxxxxxxxxxxxxxx>
> To: <h8@xxxxxxx>
> Sent: Tuesday, November 11, 2003 12:09 PM
> Subject: [H8-ML(4070)] Re:モータの制御について
> 
> 
> > 亀井@大和市在住です
> >
> > > > 既にこのような制御プログラムの経験がある方や、
> > > > 何かいい案がある方がいれば教えてください。
> >
> > 少し興味のある話題です。
> >
> > 私の作ったパルスジェネレータです。
> > 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)](起点)
 └[4072(U)]
   └[表示中]


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


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