亀井@大和市在住です
質問が来て嬉しいです(*^_^*)
> ご返答ありがとうございます。
>
> 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