亀井@大和市在住です
> > 既にこのような制御プログラムの経験がある方や、
> > 何かいい案がある方がいれば教えてください。
少し興味のある話題です。
私の作ったパルスジェネレータです。
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