/*********************************************************** PCD4511ステッピングコントローラテスト RIKIYA 2003.8.31 npmstep0.c(GDL) 定速回転の基本的な動作 Port A Poer 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){ PA.DDR = 0xBF; //portA制御ポート PB.DDR = 0xFF; //portB出力に設定 RST = 0; //RESET信号出力 timer_init(); //wait関数用初期化 pcd_init(); //PCD4511の初期化 while(1){ pcd_cw(1); wait(2000); pcd_cw(0); wait(2000); } } /* コントローラ初期化 ************************************** 定速運転設定。1000pps ************************************************************/ 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(0x50); //直線加速,OTS=1,動作+方向,プリセット無効,SD/ORG無効 CTRL_CMD = 0x50; //制御モードコマンドの保存 // レジスタセレクトコマンドの設定 pcd_cmdwr(0x8C); //外部スタートINTなし,SD_INTなし,プリセットカウント停止 //レジスタはR4(倍率)にしておく REG_CMD = 0x8C; //レジスタセレクトコマンドの保存 // R4レジスタ(倍率)設定→2倍(300 0x012C) pcd_datam(0x01); //中位バイト書き込み pcd_datal(0x2c); //下位バイト書き込み // R1レジスタ(初速度FL)設定→500pps (250 0x00FA) pcd_reg(1); //R1レジスタ選択 pcd_datam(0x00); //中位バイト書き込み pcd_datal(0xFA); //下位バイト書き込み // R6レジスタ(アイドリングパルス)設定→7 pcd_reg(6); //R6レジスタ選択 pcd_datal(0x07); //下位バイト書き込み // 出力モードコマンドの設定 pcd_cmdwr(0xF0); //拡張モニタ,低感度,加減速動作,励磁出力,パルス出力 OUT_CMD = 0xF0; //出力モードコマンドの保存 // スタートコマンドの設定 pcd_cmdwr(0x10); //INTなし,定速モード,外部スタートなし,FL速度 } /* コマンドバッファ書き込み *********************************/ // 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(); //書き込み信号出力 } /* 方向制御 ************************************************/ // rotate : 0 → 正転、1 → 逆転 pcd_cw(int rotate){ 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(); //書き込み信号出力 } /* WR信号出力 ********************************************/ pcd_wr(){ WR = 0; wait(1); WR = 1; //コマンド書き込みタイミング wait(1); }