ANA国内線【PR】

thirtythirtythirty

yuurebonbo.exblog.jp

トップ

モーター選定

モーター選定

○仕様を満足するためにどのようなモーターが必要か?
 
 モーターの使用箇所は、X軸とY軸の水平移動機構に置いてであります。
 必要な事は、位置を正確に把握できる事。
       装置の構成をシンプルにする事。

○ステッピングモーターの特徴

 長所:パルス数で距離を計測できる。
    距離を測る装置が不要。
 短所:負荷が大きすぎたり、周波数が高すぎると脱調(モーターの挙動が異
    常になる)という現象が起きる。

 この様な特徴からステッピングモーターを使用することに決定しました。

○選定計算
 
選定方法に置いてはオリエンタルモーターの資料を参考に致しました。
http://www.orientalmotor.co.jp/knowledge/technical/pdf/Select_Motor_Tech.pdf

 駆動機構の決定
 要求仕様の確認
 負荷計算
 モーター機種の選択
 選定計算 
 

○吸着機側モーターY軸

 テーブルとワークの総重量m  = 1048g
 しゅう動面の摩擦係数μ  = 0.1
 ボールねじの効率η  = 0.3
 ボールねじの軸径DB = 10mm
 ボールねじの全長LB = 400mm
 ボールねじの材質鉄 密度 7.9 * 10^3 kg / ㎥
 ボールねじのリード        PB = 1.5mm
 要求分解能Δl = 3.7μm
 送り量l  = 400mm
 位置決め時間t0 = 約10秒
 ローター慣性モーメントjo= モーター固有の値
○動作パルス数
 A  = l/ PB * 360° / θs
○運転パルス速度[HZ]
 f2 = A – f1 * t1 / t0 – t1

○必要トルクTm[Nm]
 運転方向荷重F[N]
    F = FA + mg(sin α + μ cos α)
    負荷トルク[Nm]
    TL = F * PB / 2πη + μ0 * F0 * PB / 2π
   
   ○加速トルクTa[Nm]
    ボールねじの慣性モーメントJB[Kg㎡]
     JB = π * 密度 * LB * DB^4 / 32
    テーブルとワークの慣性モーメントJT[kg㎡]
     JT = m(PB / 2π)^2
    負荷慣性モーメントJL[Kg㎡]
     JL = JB + JT
   加速トルクTa[Nm]
     Ta = (J0 + JL) * π * θs * (f2 – f1) / 180 * t1
   ○必要トルクTM
     TM = (TL + Ta) * 安全率3



〇リニアラックX軸

 テーブルとワークの総重量m  = 2210g
しゅう動面の摩擦係数 μ  = 0.1
  ボールねじの効率 η  = 0.3
  ボールねじの軸径 DB = 22mm
  ボールねじの全長 LB = 800mm
  ボールねじの材質 鉄 密度 7.9 * 10^3 kg / ㎥
  ボールねじのリード        PB = 62.84mm
  要求分解能 Δl = 0.15mm
  送り量l  = 800mm
  位置決め時間 t0 = 約5秒
 減速比i = 1
ローター慣性モーメントjoモーター固有の値
〇外力F[N]
 F = μmg
〇負荷トルクTL(N * m)
  TL = FD / 2
〇直線運動モーメント[Kg ㎡]
  JC = WD^2 / 4
   〇全慣性モーメントJL[Kg㎡]
     JL = Jc + Jr / i^2
   〇加速トルク[Nm]
     Ta = (Jo + JL) * π * 0.9 / 180 * f2 / t1
   〇必要トルクTM[Nm]
     TM = (TL + Ta) * S










 吸着機側
リニアラック側
運転パルス速度
1400HZ
1250HZ
外力           F
2.05 N
4.33 N
慣性モーメント      JT
5.97*10^-7 Kg㎡

ボールねじ慣性モーメント JB
6.2*10^-6 Kg㎡

負荷慣性モーメント    JL
6.32*10^-6 Kg㎡

直線運動モーメント    JC

0.26*10^-3 Kg㎡
加速トルク        Ta
384.5*10^-6 Nm
5.98*10^-3 Nm
負荷トルク        TL
1.37*10^-3 Nm
0.0476 Nm
必要トルク        TM
0.003    Nm
0.1607 Nm

上記の計算式を用いてこの値が算出されました。
この値を満たすモーターを選定した結果
吸着機側PK223PB(オリエンタルモーター)
リニアラック側PK244PB-L(オリエンタルモーター)
にきまりました。

# by yuurebonbo | 2011-12-16 02:10

ステップ調整


/***********************************************************************/
/* */
/* FILE :stepmotor.c */
/* DATE :Tue, Sep 20, 2011 */
/* DESCRIPTION :Main Program */
/* CPU TYPE :H8/3694F */
/* */
/* This file is generated by Renesas Project Generator (Ver.4.16). */
/* */
/***********************************************************************/
#include "iodefine.h"
#include

#define on IO.PDRB.BIT.B1
//#define scalaIO.PDRB.BIT.B2
//#define z_onIO.PDRB.BIT.B3
///////// →3694f /////////////////
#define x_moveIO.PDRB.BIT.B2
#define y_moveIO.PDRB.BIT.B3
////////// →PLC ////////////////////
#define x_maeteiitiIO.PDR5.BIT.B4//PLCへ定位置送信
#define y_maeteiitiIO.PDR5.BIT.B5
#define x_atoteiitiIO.PDR5.BIT.B6
#define y_atoteiitiIO.PDR5.BIT.B7


void main(void);
void init_timerv(void);//少しづつデバッグまずひとつ変えデバッグ それが成功したら次//
void cw_step(void);//時計回り
void ccw_step(void);//反時計回り
void p_change(int);//定位置判断
void tachiagari(int);//立ち上がり動作
void tachisagari(int);//立下り動作
void ijou(void);//異常時動作

volatile int cnt;//一周計測カウンタ//割り込み関係変数にはvolatile
int check_delay;//最高速(HZ)計測カウンタ
int data;//立ち上がり立下り時間計測カウンタ
volatile int ck_sw;//順番確認変数
int data_cnt;//遅延使用変数、dataと同じ
char pm2[] = {0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//ステップモーター励磁順番
char teiiti = 0;//定位置フラグ
char stop;//到達位置予想時間経過フラグ

void main(void)
{
int x;
long c;
int i = 7;
long y;


set_imask_ccr(1);
IO.PCR8 = 0xff;
IO.PCR5 = 0xf0;
IO.PDR8.BYTE = 0x00;
IO.PDR5.BYTE = 0x00;
IO.PCR1 = 0xff;
init_timerv();
set_imask_ccr(0);
while(1)
{
do
{x = on;//スタート信号待ち//
for(c = 0; c < 10000; c++)
{
IO.PDR1.BIT.B7 = 1;//check//


}
}while(x == 0);
ck_sw = 0;
x = 1;
IO.PDR1.BYTE = 0x00;//check//
for(y = 0; y < 800000; y++)
{
;
}
while(x == 1)
{
///////////////////////初期動作定位置x.y軸移動 ////////////////////////////////////////////////
if(ck_sw == 0)
{
IO.PDR1.BIT.B4 = 1;//check//
cnt = 0;//カウンタリセット
check_delay = 0;//カウンタリセット
while(0x03 != (IO.PDR5.BYTE & 0x03))//x側目標位置にいなければ
{
IO.PDR1.BIT.B6 = 1;//check//
if(IO.PDR5.BIT.B1 != 1)//Y軸定位置移動//
{
IO.PDR1.BIT.B5 = 1;//check//
p_change(i);
}
if(IO.PDR5.BIT.B0 != 1)//X軸定位置移動//
{
IO.PDR1.BIT.B4 = 1;//check//
p_change(i);
}
}
cnt = 0;//カウンタリセット
ck_sw ++;//次のシーケンスへ
teiiti = 0;//定位置フラグリセット
x_maeteiiti = 1;
//////////////////////////// 2番目位置動作Y//////////////////////////////////////////////////
}else if(ck_sw == 1)
{
IO.PDR1.BYTE = 0x00;//check//
if(y_move == 0)//PLCからの信号がはいったら
{
IO.PDR1.BIT.B6 = 1;//check//
cnt = 0;
check_delay = 0;
if(0x05 != (IO.PDR5.BYTE & 0x05))//Y側目標位置にいなければ
{
cw_step();//移動動作
ck_sw++;//次のシーケンスへ
teiiti = 0;//定位置フラグリセット//
y_maeteiiti = 1;
}
}


////////////////////////// 3番目Y///////////////////////////////////////////////////////
}else if(ck_sw == 2)//
{
IO.PDR1.BYTE = 0x20;//check//
if(y_move == 0)
{
IO.PDR1.BIT.B5 = 1;//check//
cnt = 0;
check_delay = 0;
if(0x03 != (IO.PDR5.BYTE & 0x03))
{
ccw_step();
ck_sw++;
teiiti = 0;
}
}
//////////////////////// 4番 X ////////////////////////////////////////////////////
}else if(ck_sw == 3)
{
IO.PDR1.BYTE = 0x50;//check//
if(x_move == 0)
{
IO.PDR1.BIT.B4 = 1;//check//
cnt = 0;
check_delay = 0;
if(0x0a != (IO.PDR5.BYTE & 0x0a))
{
cw_step();
ck_sw++;
teiiti = 0;
x_atoteiiti = 1;
}
}
/////////////////////////// 5番Y///////////////////////////////////////////////////
}else if(ck_sw == 4)
{
IO.PDR1.BYTE = 0x70;//check
if(y_move == 0)//z信号ハイリッパ//
{
IO.PDR1.BIT.B5 = 1;//check//
cnt = 0;
check_delay = 0;
if(0x0c != (IO.PDR5.BYTE & 0x0c))
{
cw_step();
ck_sw++;
teiiti = 0;
y_atoteiiti = 1;
}
}
///////////////////////// 6番Y //////////////////////////////////////////////////////
}else if(ck_sw == 5)
{
IO.PDR1.BYTE = 0x80;//check
if(y_move == 0)//z信号ハイリッパ//
{
IO.PDR1.BIT.B2 = 1;//check//
cnt = 0;
check_delay = 0;
if(0x0a != (IO.PDR5.BYTE & 0x0a))
{
ccw_step();
ck_sw++;
teiiti = 0;

}
}

///////////////////////// 7番Y //////////////////////////////////////////////////////
}else if(ck_sw == 6)
{
IO.PDR1.BYTE = 0xf0;//check
if(x_move == 0)//z信号ハイリッパ//
{
IO.PDR1.BIT.B1 = 1;//check//
cnt = 0;
check_delay = 0;
if(0x03 != (IO.PDR5.BYTE & 0x03))
{
ccw_step();
ck_sw = 1;
teiiti = 0;
x_maeteiiti = 1;
}
}

}
}
}
}
///////////////////////// タイマーV設定 //////////////////////////////////////////////////////
void init_timerv(void)
{
TV.TCRV0.BIT.CMIEB = 0;
TV.TCRV0.BIT.CMIEA = 1;
TV.TCRV0.BIT.OVIE = 0;
TV.TCRV0.BIT.CCLR = 1;
TV.TCRV0.BIT.CKS = 1;
TV.TCRV1.BIT.ICKS = 0;
TV.TCORA = 250;
TV.TCSRV.BIT.OS = 0;
}
///////////////////////// 時計回り //////////////////////////////////////////////////////
void cw_step(void)
{
int i;

i = 0;
cnt = 0;
data = 0;
data_cnt = 0;
check_delay = 0;
while(teiiti == 0)
{
if(i == 8)
{
i = 0;
}
p_change(i);
switch(cnt)
{
case 0:
IO.PDR1.BYTE = 0x10;
tachiagari(i);
i++;
break;
case 1:
if(data_cnt >= 2)
{
IO.PDR1.BYTE = 0x20;
i++;
data_cnt = 0;
}
break;
case 2:
if(data_cnt >= 2)
{
IO.PDR1.BYTE = 0x30;
i++;
data_cnt = 0;
}
break;
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
IO.PDR1.BYTE = 0x40;
tachisagari(i);
i++;
break;
default:
break;

}

}
}
///////////////////////// 反時計回り //////////////////////////////////////////////////////
void ccw_step(void)
{
int i;

i = 7;
cnt = 0;
data = 0;
data_cnt = 0;
check_delay = 0;

IO.PDR1.BYTE = 0x50;
while(teiiti == 0)
{
p_change(i);
if(i == 0)
{
i = 7;
}
switch(cnt)
{
case 0:
IO.PDR1.BYTE = 0x11;
tachiagari(i);
i--;
break;
case 1:
IO.PDR1.BYTE = 0x20;
if(data_cnt >= 2)
{
IO.PDR1.BYTE = 0x20;
i--;
data_cnt = 0;
}
break;
case 2:
IO.PDR1.BYTE = 0x30;
if(data_cnt >= 2)
{
IO.PDR1.BYTE = 0x20;
i--;
data_cnt = 0;
}
break;
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
IO.PDR1.BYTE = 0x40;
tachisagari(i);
i--;
break;
default:
break;

}
}
IO.PDR1.BYTE = 0x05;//check//
}
///////////////////////// センサ位置判断&励磁 //////////////////////////////////////////////////////
void p_change(int i)
{
int REGY;
long c;

REGY = 0;
switch(ck_sw)
{
case 0://1番目動作
do{

if(0x02 == (IO.PDR5.BYTE & 0x02))//もしY側定位置にいなければ
{
IO.PDR1.BYTE = 0x10;//check////X軸移動
REGY = pm2[i];//一度変数に格納
IO.PDR8.BYTE = REGY;//モーター励磁
i--;//次の動作に切り替え
}else//Y軸定位置でなければ
{
IO.PDR1.BYTE = 0x20;//check//
REGY = pm2[i];
IO.PDR8.BYTE = REGY<<4;//Y軸移動
i--;//次の動作へ
}
for(c = 0; c < 20000; c++)//タイムラグが無いと速度が速すぎて回らない
{
;
}
if(i == 0)//励磁配列位置下限まできたら
{
i = 7;//上限へ戻す
}

}while(0x03 != (IO.PDR5.BYTE & 0x03));//定位置にいない間ループ
break;

case 1:
if(0x05 == (IO.PDR5.BYTE & 0x05))//定位置ならば
{
teiiti = 1;//定位置フラグ立てる
stop = 0;//「立下り関数」で出たストップフラグリセット
}else
{
REGY = pm2[i];
IO.PDR8.BYTE = ((REGY<<4) & 0xf0);//&無しだと違うbiitまで光る。ノイズかな?//
}
break;
case 2:
if(0x03 == (IO.PDR5.BYTE & 0x03))
{
teiiti = 1;
stop = 0;
}else
{
REGY = pm2[i];
IO.PDR8.BYTE = REGY<<4;
}
break;
case 3:
if(0x0a == (IO.PDR5.BYTE & 0x0a))
{
teiiti = 1;
stop = 0;
}else
{
REGY = pm2[i];
IO.PDR8.BYTE = (REGY & 0x0f);
}
break;
case 4:
if(0x0c == (IO.PDR5.BYTE & 0x0c))
{
teiiti = 1;
stop = 0;
}else
{
REGY = pm2[i];
IO.PDR8.BYTE = REGY<<4;
}
break;
case 5:
if(0x0a == (IO.PDR5.BYTE & 0x0a))
{
teiiti = 1;
stop = 0;
}else
{
REGY = pm2[i];
IO.PDR8.BYTE = REGY<<4;
}
break;
case 6:
if(0x03 == (IO.PDR5.BYTE & 0x03))
{
teiiti = 1;
stop = 0;
}else
{
REGY = pm2[i];
IO.PDR8.BYTE = (REGY & 0x0f);
}
break;



}
}
///////////////////////// 立ち上がり動作 //////////////////////////////////////////////////////
void tachiagari(int i)
{
if((ck_sw == 0x03) || (ck_sw == 0x06))//条件同士をorする事//X移動かY軸移動判定//
{
if(data <= 200)
{
while(!((data <= 200) && (data_cnt >= 5)))//徐々に速く立ち上げ
{
}
data_cnt = 0;
}else if(data <= 400)
{
while(!((data <= 400) && (data_cnt >= 4)))
{
}
data_cnt = 0;
}else if(data <= 600)
{
while(!((data <= 600) && (data_cnt >= 3)))
{
}
data_cnt = 0;
}else if(data <= 960)
{
while(!((data <= 960) && (data_cnt >= 2)))
{
}
data_cnt = 0;
}else if(data > 960)
{
while(data_cnt <= 1)
{
}
data_cnt = 0;
}
}else//Y軸移動時//
{
IO.PDR1.BYTE = 0xf0;//check//
if((0 <= data) && (data <= 3300))
{
while(!((data <= 3300) && (data_cnt >= 6)))
{
}
IO.PDR1.BYTE = 0x00;//check//
data_cnt = 0;
}else if((3300 < data) && (data <= 6600))
{
while(!((data <= 6600) && (data_cnt >= 5)))
{
}
data_cnt = 0;
}else if((6600 < data) && (data <= 9900))
{
while(!((data <= 9900) && (data_cnt >= 4)))
{
}
data_cnt = 0;
}else if((9900 < data) && (data <= 11000))
{
while(!((data <= 11000) && (data_cnt >= 3)))
{
}
data_cnt = 0;
}else if((11000 < data) && (data <= 12000))
{
while(!((data <= 12000) && (data_cnt >= 2)))
{
}
data_cnt = 0;
}else if(data > 12000)
{
while(data_cnt <= 2)
{
}
data_cnt = 0;
}
}
}
///////////////////////// 立下り動作 //////////////////////////////////////////////////////
void tachisagari(int i)
{

//IO.PDR1.BYTE = 0xc0;//check//
if(stop == 0)
{
if((ck_sw == 0x03) || (ck_sw == 0x06))//条件同士をorする事//
{
if(data <= 320)
{
while(!((data <= 320) && (data_cnt >= 2)))
{
}
data_cnt = 0;
}else if((320 <= data) && (data <= 640))
{
while(!((data <= 640) && (data_cnt >= 2)))
{
}
data_cnt = 0;
}else if((640 <= data) && (data <= 960))
{
while(!((data <= 960) && (data_cnt >= 3)))
{
}
data_cnt = 0;
}else if((960 <= data) && (data <= 1284))
{
while(!((data <= 1284) && (data_cnt >= 4)))
{
}
data_cnt = 0;
IO.PDR1.BYTE = 0xe0;//check//
stop = 1;
}else if((1284 < data) && (data == 1285))
{
stop = 1;

}
}else
{
if((0 <= data) && (data <= 3300))
{
while(!((data <= 3300) && (data_cnt >= 2)))
{
}
IO.PDR1.BYTE = 0x00;//check//
data_cnt = 0;
}else if((3300 <= data) && (data <= 6600))
{
while(!((data <= 6600) && (data_cnt >= 2)))
{
}
data_cnt = 0;
}else if((6600 <= data) && (data <= 9900))
{
while(!((data <= 9900) && (data_cnt >= 3)))
{
}
data_cnt = 0;
}else if((9900 <= data) && (data <= 11000))
{
while(!((data <= 11000) && (data_cnt >= 4)))
{
}
data_cnt = 0;
}else if((11000 <= data) && (data <= 12000))
{
while(!((data <= 12000) && (data_cnt >= 5)))
{
}
data_cnt = 0;
}else if((9900 <= data) && (data <= 13240))
{

while(!((data <= 13240) && (data_cnt == 6)))
{
}
data_cnt = 0;
}else
{
stop = 1;
}

}
}else if(stop == 1)
{
while(data_cnt <= 10)//予想時間以降、定位置までのゆるり移動//
{
IO.PDR1.BYTE = 0x00;
}
data_cnt = 0;
}
}
///////////////////////// 異常時動作 //////////////////////////////////////////////////////
void ijou(void)
{
long t;

while(1)
{
for(t = 0; t < 800000; t++)
{
;
}
IO.PDR1.BYTE = ~IO.PDR1.BYTE;
}
}

#ifdef __cplusplus
void abort(void)
{

}
#endif

# by yuurebonbo | 2011-10-27 01:32

単純励磁

/***********************************************************************/
/* */
/* FILE :stepmotor.c */
/* DATE :Tue, Sep 20, 2011 */
/* DESCRIPTION :Main Program */
/* CPU TYPE :H8/3694F */
/* */
/* This file is generated by Renesas Project Generator (Ver.4.16). */
/* */
/***********************************************************************/
#include "iodefine.h"
#include

#define on IO.PDRB.BIT.B1
#define scalaIO.PDRB.BIT.B2
#define z_onIO.PDRB.BIT.B3
//#define x_moveIO.PDRB.BIT.B2
//#define y_moveIO.PDRB.BIT.B3


void main(void);
void init_timerv(void);//少しづつデバッグまずひとつ変えデバッグ それが成功したら次//
void cw_step(void);//時計回り
void ccw_step(void);//反時計回り
void p_change(int);//定位置判断
void tachiagari(int);//立ち上がり動作
void tachisagari(int);//立下り動作
void ijou(void);//異常時動作

volatile int cnt;//一周計測カウンタ//割り込み関係変数にはvolatile
int check_delay;//最高速(HZ)計測カウンタ
volatile int data;//立ち上がり立下り時間計測カウンタ
volatile int ck_sw;//順番確認変数
volatile int data_cnt;//遅延使用変数、dataと同じ
char pm2[] = {0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//ステップモーター励磁順番
char teiiti = 0;//定位置フラグ
volatile char stop;//到達位置予想時間経過フラグ

void main(void)
{
int x;
long c;
int i = 7;
long y;


//set_imask_ccr(1);
IO.PCR8 = 0xff;
IO.PDR8.BYTE = 0x01;
IO.PDR5.BYTE = 0x00;
IO.PCR1 = 0xff;
//init_timerv();
//set_imask_ccr(0);
while(1)
{
while(z_on == 1)
{
//IO.PDR8.BYTE = IO.PDR8.BYTE << 1;
c = pm2[i];
IO.PDR8.BYTE = c;
for(y = 0; y < 10000; y++)
{
;
}
if(i >= 7)
{
i = 0;
}
i++;
/*if(IO.PDR8.BYTE == 0x08)
{
IO.PDR8.BYTE = 0x01;
}*/
}

}
}
///////////////////////// タイマーV設定 //////////////////////////////////////////////////////
void init_timerv(void)
{
TV.TCRV0.BIT.CMIEB = 0;
TV.TCRV0.BIT.CMIEA = 1;
TV.TCRV0.BIT.OVIE = 0;
TV.TCRV0.BIT.CCLR = 1;
TV.TCRV0.BIT.CKS = 1;
TV.TCRV1.BIT.ICKS = 0;
TV.TCORA = 250;
TV.TCSRV.BIT.OS = 0;
}
///////////////////////// 時計回り //////////////////////////////////////////////////////
void cw_step(void)
{
int i;

i = 0;
cnt = 0;
data = 0;
data_cnt = 0;
check_delay = 0;
while(teiiti == 0)
{
p_change(i);
if(i > 7)
{
i = 0;
}

switch(cnt)
{
case 0:
IO.PDR1.BYTE = 0x10;
tachiagari(i);
i++;
break;
case 1:
if(data_cnt >= 2)
{
IO.PDR1.BYTE = 0x20;
i++;
data_cnt = 0;
}
break;
case 2:
if(data_cnt >= 2)
{
IO.PDR1.BYTE = 0x30;
i++;
data_cnt = 0;
}
break;
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
IO.PDR1.BYTE = 0x40;
tachisagari(i);
i++;
break;
default:
break;

}

}
}
///////////////////////// 反時計回り //////////////////////////////////////////////////////
void ccw_step(void)
{
int i;

i = 7;
cnt = 0;
data = 0;
data_cnt = 0;
check_delay = 0;

IO.PDR1.BYTE = 0x50;
while(teiiti == 0)
{
p_change(i);
if(i < 0)
{
i = 7;
}
switch(cnt)
{
case 0:
IO.PDR1.BYTE = 0x11;
tachiagari(i);
i--;
break;
case 1:
IO.PDR1.BYTE = 0x20;
if(data_cnt >= 2)
{
IO.PDR1.BYTE = 0x20;
i--;
data_cnt = 0;
}
break;
case 2:
IO.PDR1.BYTE = 0x30;
if(data_cnt >= 2)
{
IO.PDR1.BYTE = 0x20;
i--;
data_cnt = 0;
}
break;
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
IO.PDR1.BYTE = 0x40;
tachisagari(i);
i--;
break;
default:
break;

}
}
IO.PDR1.BYTE = 0x05;//check//
}
///////////////////////// センサ位置判断&励磁 //////////////////////////////////////////////////////
void p_change(int i)
{
int REGY;
long c;

REGY = 0;
switch(ck_sw)
{
case 0://1番目動作
do{

if(0x02 == (IO.PDR5.BYTE & 0x02))//もしY側定位置にいなければ
{
IO.PDR1.BYTE = 0x10;//check////X軸移動
REGY = pm2[i];//一度変数に格納
IO.PDR8.BYTE = REGY;//モーター励磁
i--;//次の動作に切り替え
}else//Y軸定位置でなければ
{
IO.PDR1.BYTE = 0x20;//check//
REGY = pm2[i];
IO.PDR8.BYTE = REGY<<4;//Y軸移動
i--;//次の動作へ
}
/*for(c = 0; c < 20000; c++)//
{
;
}*/
if(i == 0)//励磁配列位置下限まできたら
{
i = 7;//上限へ戻す
}

}while(0x03 != (IO.PDR5.BYTE & 0x03));//定位置にいない間ループ
break;

case 1:
if(0x05 == (IO.PDR5.BYTE & 0x05))//定位置ならば
{
teiiti = 1;//定位置フラグ立てる
stop = 0;//「立下り関数」で出たストップフラグリセット
}else
{
REGY = pm2[i];
IO.PDR8.BYTE = ((REGY<<4) & 0xf0);//&無しだと違うbiitまで光る。ノイズかな?//
}
break;
case 2:
if(0x03 == (IO.PDR5.BYTE & 0x03))
{
teiiti = 1;
stop = 0;
}else
{
REGY = pm2[i];
IO.PDR8.BYTE = REGY<<4;
}
break;
case 3:
if(0x0a == (IO.PDR5.BYTE & 0x0a))
{
teiiti = 1;
stop = 0;
}else
{
REGY = pm2[i];
IO.PDR8.BYTE = (REGY & 0x0f);
}
break;
case 4:
if(0x0c == (IO.PDR5.BYTE & 0x0c))
{
teiiti = 1;
stop = 0;
}else
{
REGY = pm2[i];
IO.PDR8.BYTE = REGY<<4;
}
break;
case 5:
if(0x0a == (IO.PDR5.BYTE & 0x0a))
{
teiiti = 1;
stop = 0;
}else
{
REGY = pm2[i];
IO.PDR8.BYTE = REGY<<4;
}
break;
case 6:
if(0x03 == (IO.PDR5.BYTE & 0x03))
{
teiiti = 1;
stop = 0;
}else
{
REGY = pm2[i];
IO.PDR8.BYTE = (REGY & 0x0f);
}
break;



}
}
///////////////////////// 立ち上がり動作 //////////////////////////////////////////////////////
void tachiagari(int i)
{
if((ck_sw == 0x03) || (ck_sw == 0x06))//条件同士をorする事//X移動かY軸移動判定//
{
if(data <= 320)
{
while(!((data <= 320) && (data_cnt >= 4)))//徐々に速く立ち上げ
{
}
data_cnt = 0;
}else if(data <= 640)
{
while(!((data <= 640) && (data_cnt >= 3)))
{
}
data_cnt = 0;
}else if(data <= 960)
{
while(!((data <= 960) && (data_cnt >= 2)))
{
}
data_cnt = 0;
}else if(data > 960)
{
while(data_cnt <= 1)
{
}
data_cnt = 0;
}
}else//Y軸移動時//
{
IO.PDR1.BYTE = 0xf0;//check//
if((0 <= data) && (data <= 3300))
{
while(!((data <= 3300) && (data_cnt >= 6)))
{
}
IO.PDR1.BYTE = 0x00;//check//
data_cnt = 0;
}else if((3300 <= data) && (data <= 6600))
{
while(!((data <= 6600) && (data_cnt >= 5)))
{
}
data_cnt = 0;
}else if((6600 <= data) && (data <= 9900))
{
while(!((data <= 9900) && (data_cnt >= 4)))
{
}
data_cnt = 0;
}else if((9900 <= data) && (data <= 11000))
{
while(!((data <= 11000) && (data_cnt >= 3)))
{
}
data_cnt = 0;
}else if((11000 <= data) && (data <= 12000))
{
while(!((data <= 12000) && (data_cnt >= 2)))
{
}
data_cnt = 0;
}else if(data > 12000)
{
while(data_cnt <= 2)
{
}
data_cnt = 0;
}
}
}
///////////////////////// 立下り動作 //////////////////////////////////////////////////////
void tachisagari(int i)
{

//IO.PDR1.BYTE = 0xc0;//check//
if(stop == 0)
{
if((ck_sw == 0x03) || (ck_sw == 0x06))//条件同士をorする事//
{
if(data <= 320)
{
while(!((data <= 320) && (data_cnt >= 2)))
{
}
data_cnt = 0;
}else if((320 <= data) && (data <= 640))
{
while(!((data <= 640) && (data_cnt >= 2)))
{
}
data_cnt = 0;
}else if((640 <= data) && (data <= 960))
{
while(!((data <= 960) && (data_cnt >= 3)))
{
}
data_cnt = 0;
}else if((960 <= data) && (data <= 1284))
{
while(!((data <= 1284) && (data_cnt >= 4)))
{
}
data_cnt = 0;
IO.PDR1.BYTE = 0xe0;//check//
stop = 1;
}else if((1284 < data) && (data == 1285))
{
stop = 1;

}
}else
{
if((0 <= data) && (data <= 3300))
{
while(!((data <= 3300) && (data_cnt >= 1)))
{
}
IO.PDR1.BYTE = 0x00;//check//
data_cnt = 0;
}else if((3300 <= data) && (data <= 6600))
{
while(!((data <= 6600) && (data_cnt >= 2)))
{
}
data_cnt = 0;
}else if((6600 <= data) && (data <= 9900))
{
while(!((data <= 9900) && (data_cnt >= 3)))
{
}
data_cnt = 0;
}else if((9900 <= data) && (data <= 11000))
{
while(!((data <= 11000) && (data_cnt >= 4)))
{
}
data_cnt = 0;
}else if((11000 <= data) && (data <= 12000))
{
while(!((data <= 12000) && (data_cnt >= 5)))
{
}
data_cnt = 0;
}else if((9900 <= data) && (data <= 13248))
{

while(!((data <= 13248) && (data_cnt == 6)))
{
}
data_cnt = 0;
}else if(data == 13249)
{
stop = 1;
}

}
}else if(stop == 1)
{
while(data_cnt <= 10)//予想時間以降、定位置までのゆるり移動//
{
IO.PDR1.BYTE = 0x00;
}
data_cnt = 0;
}
}
///////////////////////// 異常時動作 //////////////////////////////////////////////////////
void ijou(void)
{
long t;

while(1)
{
for(t = 0; t < 800000; t++)
{
;
}
IO.PDR1.BYTE = ~IO.PDR1.BYTE;
}
}

#ifdef __cplusplus
void abort(void)
{

}
#endif

# by yuurebonbo | 2011-10-27 00:14

int20

/***********************************************************************/
/* */
/* FILE :intprg.c */
/* DATE :Tue, Sep 20, 2011 */
/* DESCRIPTION :Interrupt Program */
/* CPU TYPE :H8/3694F */
/* */
/* This file is generated by Renesas Project Generator (Ver.4.16). */
/* */
/***********************************************************************/


#include"iodefine.h"
#include

extern int check_delay;
extern int cnt;
extern intdata;
extern int data_cnt;
extern int ck_sw;
int x;

#pragma section IntPRG
// vector 1 Reserved

// vector 2 Reserved

// vector 3 Reserved

// vector 4 Reserved

// vector 5 Reserved

// vector 6 Reserved

// vector 7 NMI
__interrupt(vect=7) void INT_NMI(void) {/* sleep(); */}
// vector 8 TRAP #0
__interrupt(vect=8) void INT_TRAP0(void) {/* sleep(); */}
// vector 9 TRAP #1
__interrupt(vect=9) void INT_TRAP1(void) {/* sleep(); */}
// vector 10 TRAP #2
__interrupt(vect=10) void INT_TRAP2(void) {/* sleep(); */}
// vector 11 TRAP #3
__interrupt(vect=11) void INT_TRAP3(void) {/* sleep(); */}
// vector 12 Address break
__interrupt(vect=12) void INT_ABRK(void) {/* sleep(); */}
// vector 13 SLEEP
__interrupt(vect=13) void INT_SLEEP(void) {/* sleep(); */}
// vector 14 IRQ0
__interrupt(vect=14) void INT_IRQ0(void) {/* sleep(); */}
// vector 15 IRQ1
__interrupt(vect=15) void INT_IRQ1(void) {/* sleep(); */}
// vector 16 IRQ2
__interrupt(vect=16) void INT_IRQ2(void) {/* sleep(); */}
// vector 17 IRQ3
__interrupt(vect=17) void INT_IRQ3(void) {/* sleep(); */}
// vector 18 WKP
__interrupt(vect=18) void INT_WKP(void) {/* sleep(); */}
// vector 19 Timer A Overflow
__interrupt(vect=19) void INT_TimerA(void) {/* sleep(); */}
// vector 20 Reserved

// vector 21 Timer W
__interrupt(vect=21) void INT_TimerW(void) {/* sleep(); */}
// vector 22 Timer V
__interrupt(vect=22) void INT_TimerV(void) {

TV.TCSRV.BYTE = TV.TCSRV.BYTE & 0x10;
check_delay++;

if((ck_sw == 0x03) || (ck_sw == 0x06))//条件同士をorする事
{
if(14 <= check_delay)
{
data++;
check_delay = 0;
data_cnt++;
}

if(data >= 1286)
{
cnt++;
data = 0;
}
if(cnt >= 60)
{
cnt = 0;
ijou();
}
}else
{

if(4 <= check_delay)
{
data++;
check_delay = 0;
data_cnt++;
}

if(13250 <= data)
{
cnt++;
data = 0;
}
if(cnt >= 30)
{
cnt = 0;
ijou();

}
}
}
// vector 23 SCI3
__interrupt(vect=23) void INT_SCI3(void) {/* sleep(); */}
// vector 24 IIC2
__interrupt(vect=24) void INT_IIC2(void) {/* sleep(); */}
// vector 25 ADI
__interrupt(vect=25) void INT_ADI(void) {/* sleep(); */}

# by yuurebonbo | 2011-10-20 09:03

stepff

/***********************************************************************/
/* */
/* FILE :stepmotor.c */
/* DATE :Tue, Sep 20, 2011 */
/* DESCRIPTION :Main Program */
/* CPU TYPE :H8/3694F */
/* */
/* This file is generated by Renesas Project Generator (Ver.4.16). */
/* */
/***********************************************************************/
#include "iodefine.h"
#include

#define on IO.PDRB.BIT.B1
#define scalaIO.PDRB.BIT.B2
#define z_onIO.PDRB.BIT.B3



void main(void);
void init_timerv(void);//少しづつデバッグまずひとつ変えデバッグ それが成功したら次//
void cw_step(void);
void ccw_step(void);
void p_change(int);
void tachiagari(int);
void tachisagari(int);
void ijou(void);

int cnt;
int check_delay;
int data;
int ck_sw;
int data_cnt;
char pm2[] = {0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
char teiiti = 0;
volatile char stop;

void main(void)
{
int x;
long c;
int i = 8;
long y;


set_imask_ccr(1);
IO.PCR8 = 0xff;
IO.PDR8.BYTE = 0x00;
IO.PDR5.BYTE = 0x00;
IO.PCR1 = 0xff;
init_timerv();
set_imask_ccr(0);
while(1)
{
do
{x = on;//スタート信号待ち//
for(c = 0; c < 10000; c++)
{
IO.PDR1.BIT.B7 = 1;//check//
}
}while(x == 0);
ck_sw = 0;
x = 1;
IO.PDR1.BYTE = 0x00;//check//
for(y = 0; y < 800000; y++)
{
;
}
while(x != 0)
{
////x.y軸移動 ////
if(ck_sw == 0)//初期動作定位置へ//
{
IO.PDR1.BIT.B4 = 1;//check//
cnt = 0;
check_delay = 0;
while(0x03 != (IO.PDR5.BYTE & 0x03))
{
IO.PDR1.BIT.B6 = 1;//check//
if(IO.PDR5.BIT.B1 != 1)//Y軸定位置//
{
IO.PDR1.BIT.B5 = 1;//check//
p_change(i);
}
if(IO.PDR5.BIT.B0 != 1)//X軸定位置//
{
IO.PDR1.BIT.B4 = 1;//check//
p_change(i);
}
}
cnt = 0;
ck_sw ++;
teiiti = 0;
// Y
}else if(ck_sw == 1)//
{
IO.PDR1.BYTE = 0x00;//check//
if(z_on == 1)
{
IO.PDR1.BIT.B6 = 1;//check//
cnt = 0;
check_delay = 0;
if(0x05 != (IO.PDR5.BYTE & 0x05))
{
cw_step();
ck_sw++;
teiiti = 0;//定位置フラグ消去//
}
}
// Y
}else if(ck_sw == 2)
{
IO.PDR1.BYTE = 0x20;//check//
if(z_on == 1)
{
IO.PDR1.BIT.B5 = 1;//check//
cnt = 0;
check_delay = 0;
if(0x03 != (IO.PDR5.BYTE & 0x03))
{
ccw_step();
ck_sw++;
teiiti = 0;
}
}
// X
}else if(ck_sw == 3)
{
IO.PDR1.BYTE = 0x50;//check//
if(scala)
{
IO.PDR1.BIT.B4 = 1;//check//
cnt = 0;
check_delay = 0;
if(0x0a != (IO.PDR5.BYTE & 0x0a))
{
cw_step();
ck_sw++;
teiiti = 0;

}
}
// Y
}else if(ck_sw == 4)
{
IO.PDR1.BYTE = 0x70;//check
if(z_on)//z信号ハイリッパ//
{
IO.PDR1.BIT.B5 = 1;//check//
cnt = 0;
check_delay = 0;
if(0x0c != (IO.PDR5.BYTE & 0x0c))
{
cw_step();
ck_sw++;
teiiti = 0;

}
}
// Y
}else if(ck_sw == 5)
{
IO.PDR1.BYTE = 0x80;//check
if(z_on)//z信号ハイリッパ//
{
IO.PDR1.BIT.B2 = 1;//check//
cnt = 0;
check_delay = 0;
if(0x0a != (IO.PDR5.BYTE & 0x0a))
{
ccw_step();
ck_sw++;
teiiti = 0;

}
}

/// X ///
}else if(ck_sw == 6)
{
IO.PDR1.BYTE = 0xf0;//check
if(z_on)//z信号ハイリッパ//
{
IO.PDR1.BIT.B1 = 1;//check//
cnt = 0;
check_delay = 0;
if(0x03 != (IO.PDR5.BYTE & 0x03))
{
ccw_step();
ck_sw = 1;
teiiti = 0;
}
}

}
}
}
}
/*x = IO.PDRB.BIT.B1;
if(IO.PDRB.BIT.B1)
{
x = 1;
IO.PDR8.BIT.B7 = 1;
ck_sw = 0;
}
while(x){//この記述だとfor文でxが変わった瞬間にループから抜ける//
IO.PDR8.BIT.B5 = 1;
switch(ck_sw)
{
case 0:
IO.PDR8.BIT.B6 = 1;
break;
case 1:
IO.PDR8.BIT.B6 = ~IO.PDR8.BIT.B6;
for(x = 0; x > 10000; x++)
{
;
}
break;
}
}
}
}*/




void init_timerv(void)
{
TV.TCRV0.BIT.CMIEB = 0;
TV.TCRV0.BIT.CMIEA = 1;
TV.TCRV0.BIT.OVIE = 0;
TV.TCRV0.BIT.CCLR = 1;
TV.TCRV0.BIT.CKS = 1;
TV.TCRV1.BIT.ICKS = 0;
TV.TCORA = 250;
TV.TCSRV.BIT.OS = 0;
}

void cw_step(void)
{
int i;

i = 0;
cnt = 0;
data = 0;
data_cnt = 0;
check_delay = 0;
while(teiiti == 0)
{
p_change(i);
if(i > 7)
{
i = 0;
}

switch(cnt)
{
case 0:
IO.PDR1.BYTE = 0x10;
tachiagari(i);
i++;
break;
case 1:
if(data_cnt >= 2)
{
IO.PDR1.BYTE = 0x20;
i++;
data_cnt = 0;
}
break;
case 2:
if(data_cnt >= 2)
{
IO.PDR1.BYTE = 0x30;
i++;
data_cnt = 0;
}
break;
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
IO.PDR1.BYTE = 0x40;
tachisagari(i);
i++;
break;
default:
break;

}

}
}

void ccw_step(void)
{
int i;

i = 7;
cnt = 0;
data = 0;
data_cnt = 0;
check_delay = 0;

IO.PDR1.BYTE = 0x50;
while(teiiti == 0)
{
p_change(i);
if(i < 0)
{
i = 7;
}
switch(cnt)
{
case 0:
IO.PDR1.BYTE = 0x11;
tachiagari(i);
i--;
break;
case 1:
IO.PDR1.BYTE = 0x20;
if(data_cnt >= 2)
{
IO.PDR1.BYTE = 0x20;
i--;
data_cnt = 0;
}
break;
case 2:
IO.PDR1.BYTE = 0x30;
if(data_cnt >= 2)
{
IO.PDR1.BYTE = 0x20;
i--;
data_cnt = 0;
}
break;
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
IO.PDR1.BYTE = 0x40;
tachisagari(i);
i--;
break;
default:
break;

}
}
IO.PDR1.BYTE = 0x05;//check//
}

void p_change(int i)
{
int REGY;
long c;

REGY = 0;
switch(ck_sw)
{
case 0:
do{

if(0x02 == (IO.PDR5.BYTE & 0x02))
{
IO.PDR1.BYTE = 0x10;//check//
REGY = pm2[i];
IO.PDR8.BYTE = REGY;
i--;
}else
{
IO.PDR1.BYTE = 0x20;//check//
REGY = pm2[i];
IO.PDR8.BYTE = REGY<<4;
i--;
}
for(c = 0; c < 20000; c++)
{
;
}
if(i == 0)
{
i = 7;
}

}while(0x03 != (IO.PDR5.BYTE & 0x03));
break;
case 1:
if(0x05 == (IO.PDR5.BYTE & 0x05))
{
teiiti = 1;
stop = 0;
}else
{
REGY = pm2[i];
IO.PDR8.BYTE = ((REGY<<4) & 0xf0);//&無しだと違うbiitまで光る。ノイズかな?//
}
break;
case 2:
if(0x03 == (IO.PDR5.BYTE & 0x03))
{
teiiti = 1;
stop = 0;
}else
{
REGY = pm2[i];
IO.PDR8.BYTE = REGY<<4;
}
break;
case 3:
if(0x0a == (IO.PDR5.BYTE & 0x0a))
{
teiiti = 1;
stop = 0;
}else
{
REGY = pm2[i];
IO.PDR8.BYTE = (REGY & 0x0f);
}
break;
case 4:
if(0x0c == (IO.PDR5.BYTE & 0x0c))
{
teiiti = 1;
stop = 0;
}else
{
REGY = pm2[i];
IO.PDR8.BYTE = REGY<<4;
}
break;
case 5:
if(0x0a == (IO.PDR5.BYTE & 0x0a))
{
teiiti = 1;
stop = 0;
}else
{
REGY = pm2[i];
IO.PDR8.BYTE = REGY<<4;
}
break;
case 6:
if(0x03 == (IO.PDR5.BYTE & 0x03))
{
teiiti = 1;
stop = 0;
}else
{
REGY = pm2[i];
IO.PDR8.BYTE = (REGY & 0x0f);
}
break;



}
}

void tachiagari(int i)
{
if((ck_sw == 0x03) || (ck_sw == 0x06))//条件同士をorする事//
{
if(data <= 320)
{
while(!((data <= 320) && (data_cnt >= 4)))
{
}
data_cnt = 0;
}else if(data <= 640)
{
while(!((data <= 640) && (data_cnt >= 3)))
{
}
data_cnt = 0;
}else if(data <= 960)
{
while(!((data <= 960) && (data_cnt >= 2)))
{
}
data_cnt = 0;
}else if(data > 960)
{
while(data_cnt <= 1)
{
}
data_cnt = 0;
}
}else
{
IO.PDR1.BYTE = 0xf0;//check//
if((0 <= data) && (data <= 3300))
{
while(!((data <= 3300) && (data_cnt >= 6)))
{
}
IO.PDR1.BYTE = 0x00;//check//
data_cnt = 0;
}else if((3300 <= data) && (data <= 6600))
{
while(!((data <= 6600) && (data_cnt >= 5)))
{
}
data_cnt = 0;
}else if((6600 <= data) && (data <= 9900))
{
while(!((data <= 9900) && (data_cnt >= 4)))
{
}
data_cnt = 0;
}else if((9900 <= data) && (data <= 11000))
{
while(!((data <= 11000) && (data_cnt >= 3)))
{
}
data_cnt = 0;
}else if((11000 <= data) && (data <= 12000))
{
while(!((data <= 12000) && (data_cnt >= 2)))
{
}
data_cnt = 0;
}else if(data > 12000)
{
while(data_cnt <= 2)
{
}
data_cnt = 0;
}
}
}

void tachisagari(int i)
{

//IO.PDR1.BYTE = 0xc0;//check//
//stop = 1;
if(stop == 0)
{
if((ck_sw == 0x03) || (ck_sw == 0x06))//条件同士をorする事//
{
if(data <= 320)
{
while(!((data <= 320) && (data_cnt >= 2)))
{
}
data_cnt = 0;
}else if((320 <= data) && (data <= 640))
{
while(!((data <= 640) && (data_cnt >= 2)))
{
}
data_cnt = 0;
}else if((640 <= data) && (data <= 960))
{
while(!((data <= 960) && (data_cnt >= 3)))
{
}
data_cnt = 0;
}else if((960 <= data) && (data <= 1284))
{
while(!((data <= 1284) && (data_cnt >= 4)))
{
}
data_cnt = 0;
IO.PDR1.BYTE = 0xe0;//check//
stop = 1;
}else if((1284 <= data) && (data <= 1285))
{
stop = 1;

}
}else
{
//IO.PDR1.BYTE = 0xf0;//check//
if((0 <= data) && (data <= 3300))
{
while(!((data <= 3300) && (data_cnt >= 1)))
{
}
IO.PDR1.BYTE = 0x00;//check//
data_cnt = 0;
}else if((3300 <= data) && (data <= 6600))
{
while(!((data <= 6600) && (data_cnt >= 2)))
{
}
data_cnt = 0;
}else if((6600 <= data) && (data <= 9900))
{
while(!((data <= 9900) && (data_cnt >= 3)))
{
}
data_cnt = 0;
}else if((9900 <= data) && (data <= 11000))
{
while(!((data <= 11000) && (data_cnt >= 4)))
{
}
data_cnt = 0;
}else if((11000 <= data) && (data <= 12000))
{
while(!((data <= 12000) && (data_cnt >= 5)))
{
}
data_cnt = 0;
}else if((9900 <= data) && (data <= 13248))
{

while(!((data <= 13248) && (data_cnt == 6)))
{
}
data_cnt = 0;
}else if(data == 13249)
{
stop = 1;
}

}
}else if(stop == 1)
{
while(data_cnt <= 10)//予想時間以降、定位置までのゆるり移動//
{
IO.PDR1.BYTE = 0x00;
}
data_cnt = 0;
}
}

void ijou(void)
{
long t;

while(1)
{
for(t = 0; t < 800000; t++)
{
;
}
IO.PDR1.BYTE = ~IO.PDR1.BYTE;
}
}

#ifdef __cplusplus
void abort(void)
{

}
#endif

# by yuurebonbo | 2011-10-20 09:02

< 前のページ 次のページ >