/******************************************************** PCD4511ステッピングコントローラテスト RIKIYA 2003.9.12 npmstep1.c(GDL) S字加減速の基本的動作 Port A Port B 0:CS OUT 0:DATA0 1:RD OUT 1:DATA1 2:WR OUT 2:DATA2 3:A0 OUT 3:DATA3 4:A1 OUT 4:DATA4 5:RST OUT 5:DATA5 6:BUSY IN 6:DATA6 7:NC OUT 7:DATA7 **********************************************************/ #include <3048.h> #include #define CS PA.DR.BIT.B0 #define RD PA.DR.BIT.B1 #define WR PA.DR.BIT.B2 #define A0 PA.DR.BIT.B3 #define A1 PA.DR.BIT.B4 #define RST PA.DR.BIT.B5 #define BUSY PA.DR.BIT.B6 #define DATA PB.DR.BYTE #define CLK 4915200 int START_CMD; // スタートモードコマンド int CTRL_CMD; // 制御モードコマンド int REG_CMD; // レジスタセレクトコマンド int OUT_CMD; // 出力モードコマンド /* メイン関数 **********************************************/ int main(void){ int i; PA.DDR = 0xBF; //portA制御ポート PB.DDR = 0xFF; //portB出力に設定 RST = 0; //RESET信号出力 timer_init(); //wait関数用初期化 pcd_init(); //PCD4511の初期化 for(i=0;i<5;i++){ while(BUSY == 0){} //動作中次の処理を待機 wait(500); //500mS待機 pcd_cw(0); //正転 pcd_precnt(480); //カウント数480にセット pcd_start(); //スタート while(BUSY == 0){} //動作中次の処理を待機 wait(500); //500mS待機 pcd_cw(1); //逆転 pcd_precnt(960); //カウント数960にセット pcd_start(); //スタート } pcd_stop(); //ストップ while(1){} } /* コントローラ初期化 *************************************** S字加減速用の設定 *************************************************************/ pcd_init(){ CS = 1; RD = 1; WR = 1; A0 = 1; A1 = 1; // RESET 処理 RST = 0; wait(1); RST = 1; // CS(CHIP SELECT)処理 CS = 0; // 制御モードコマンドの設定 pcd_cmdwr(0x74); //S字加速,OTS=1,動作+方向,プリセット有効,SD/ORG無効 CTRL_CMD = 0x74; //制御モードコマンドの保存 // レジスタセレクトコマンドの設定 pcd_cmdwr(0x80); //外部スタートINTなし,SD_INTなし,プリセットカウント動作 //レジスタはR0にしておく REG_CMD = 0x80; //レジスタセレクトコマンドの保存 // R4レジスタ(倍率)設定→2倍(300 0x012C) pcd_reg(4); //R4レジスタ選択 pcd_datam(0x01); //中位バイト書き込み pcd_datal(0x2c); //下位バイト書き込み // R1レジスタ(初速度FL)設定→50pps (25 0x0019) pcd_reg(1); //R1レジスタ選択 pcd_datam(0x00); //中位バイト書き込み pcd_datal(0x19); //下位バイト書き込み // R6レジスタ(アイドリングパルス)設定→0 pcd_reg(6); //R6レジスタ選択 pcd_datal(0x00); //下位バイト書き込み // 出力モードコマンドの設定 pcd_cmdwr(0xF0); //拡張モニタ,低感度,加減速動作,励磁出力,パルス出力 OUT_CMD = 0xF0; //出力モードコマンドの保存 /* S字加減速パラメータの設定 *************************/ // R2レジスタ(動作速度FH)設定→500pps (250 0x00FA) pcd_reg(2); //R2レジスタ選択 pcd_datam(0x00); //中位バイト書き込み pcd_datal(0xFA); //下位バイト書き込み // R3レジスタ(加減速レート)設定→0.468s (1023 0x03FF) pcd_reg(3); //R3レジスタ選択 pcd_datam(0x03); //中位バイト書き込み pcd_datal(0xFF); //下位バイト書き込み // R5レジスタ(スローダウンポイント)設定→25パルス (0x0019) pcd_reg(5); //R5レジスタ選択 pcd_datam(0x00); //中位バイト書き込み pcd_datal(0x19); //下位バイト書き込み // スタートコマンドの設定 pcd_cmdwr(0x05); //INTなし,高速モード,外部スタートなし,FH速度 START_CMD = 0x05; //スタートモードコマンドの保存 } /* コマンドバッファ書き込み ****************************/ // DATA : 書き込みデータ pcd_cmdwr(int cmd_data){ A0 = 0; //コマンドバッファ指定 A1 = 0; DATA = cmd_data; pcd_wr(); //書き込み信号出力 } /* レジスタ選択 ****************************************/ // REG : レジスタ番号0〜7の指定 pcd_reg(int reg){ DATA = REG_CMD; //現在のレジスタセレクトコマンドをロード A0 = 0; //コマンドバッファ指定 A1 = 0; PB.DR.BIT.B7 = 1; //D7 レジスタセレクトコマンド選択 PB.DR.BIT.B6 = 0; //D6 PB.DR.BIT.B3 = 0; //D3 switch(reg){ case 0: //R0選択 PB.DR.BIT.B0 = 0; PB.DR.BIT.B1 = 0; PB.DR.BIT.B2 = 0; break; case 1: //R1選択 PB.DR.BIT.B0 = 1; PB.DR.BIT.B1 = 0; PB.DR.BIT.B2 = 0; break; case 2: //R2選択 PB.DR.BIT.B0 = 0; PB.DR.BIT.B1 = 1; PB.DR.BIT.B2 = 0; break; case 3: //R3選択 PB.DR.BIT.B0 = 1; PB.DR.BIT.B1 = 1; PB.DR.BIT.B2 = 0; break; case 4: //R4選択 PB.DR.BIT.B0 = 0; PB.DR.BIT.B1 = 0; PB.DR.BIT.B2 = 1; break; case 5: //R5選択 PB.DR.BIT.B0 = 1; PB.DR.BIT.B1 = 0; PB.DR.BIT.B2 = 1; break; case 6: //R6選択 PB.DR.BIT.B0 = 0; PB.DR.BIT.B1 = 1; PB.DR.BIT.B2 = 1; break; case 7: //R7選択 PB.DR.BIT.B0 = 1; PB.DR.BIT.B1 = 1; PB.DR.BIT.B2 = 1; break; } pcd_wr(); //書き込み信号出力 REG_CMD = DATA; //変更後のレジスタセレクトコマンドの保存 } /* 上位データ書き込み **************************/ // data_h : 書き込みデータ pcd_datah(int data_h){ A0 = 1; //レジスタ上位バイトの指定 A1 = 1; DATA = data_h; //上位バイトの書き込み pcd_wr(); //書き込み信号出力 } /* 中位データ書き込み **************************/ // data_m : 書き込みデータ pcd_datam(int data_m){ A0 = 0; //レジスタ中位バイトの指定 A1 = 1; DATA = data_m; //中位バイトの書き込み pcd_wr(); //書き込み信号出力 } /* 下位データ書き込み **************************/ // data_l : 書き込みデータ pcd_datal(int data_l){ A0 = 1; //レジスタ下位バイトの指定 A1 = 0; DATA = data_l; //下位バイトの書き込み pcd_wr(); //書き込み信号出力 } /* R0 プリセットカウンタ設定 ********************************/ // precnt : long型プリセットカウント値 pcd_precnt(long precnt){ long dummy; pcd_reg(0); //R0レジスタ選択 pcd_datah(0); //上位バイト書き込み 強制0固定 dummy = (precnt >> 8) & 0x000000FF; //中位データの抽出 pcd_datam((int)dummy); //中位バイト書き込み dummy = precnt & 0x000000FF; //下位データの抽出 pcd_datal((int)dummy); //下位バイト書き込み } /* スタート制御 ********************************************/ // pcd_start(){ DATA = START_CMD; //現在のスタートモードコマンドのロード A0 = 0; //コマンドバッファ指定 A1 = 0; PB.DR.BIT.B7 = 0; //D7 スタートモードコマンド選択 PB.DR.BIT.B6 = 0; //D6 PB.DR.BIT.B3 = 0; //D3 ストップ制御 OFF PB.DR.BIT.B4 = 1; //D4 スタート制御 ON pcd_wr(); //書き込み信号出力 START_CMD = DATA; //変更後のスタートモードコマンドの保存 } /* ストップ制御 ********************************************/ // pcd_stop(){ DATA = START_CMD; //現在のスタートモードコマンドのロード A0 = 0; //コマンドバッファ指定 A1 = 0; PB.DR.BIT.B7 = 0; //D7 スタートモードコマンド選択 PB.DR.BIT.B6 = 0; //D6 PB.DR.BIT.B3 = 1; //D3 ストップ制御 ON PB.DR.BIT.B4 = 0; //D4 スタート制御 OFF pcd_wr(); //書き込み信号出力 START_CMD = DATA; //変更後のスタートモードコマンドの保存 } /* 方向制御 ********************************************/ // rotate : 0 → 正転、1 → 逆転 pcd_cw(int rotate){ DATA = CTRL_CMD; //現在の制御モードコマンドのロード A0 = 0; //コマンドバッファ指定 A1 = 0; PB.DR.BIT.B7 = 0; //D7 制御モードコマンド選択 PB.DR.BIT.B6 = 1; //D6 PB.DR.BIT.B3 = rotate; //D3 0:正転 1:逆転 pcd_wr(); //書き込み信号出力 CTRL_CMD = DATA; //変更後の制御モードコマンドの保存 } /* WR信号出力 ********************************************/ pcd_wr(){ WR = 0; wait(1); WR = 1; //コマンド書き込みタイミング wait(1); }