///////////////////////////////////////////////////////// // 日本パルスモータ PCD4511制御用ヘッダ 2003.11.23 // PIC16F873 PCD4511.H //S字加減速の基本的動作 //ピンファンクションは以下の通り //Port C Port B PortA // 0:CS OUT 0:DATA0 OUT 0:--- OUT // 1:RD OUT 1:DATA1 OUT 1:--- OUT // 2:WR OUT 2:DATA2 OUT 2:--- OUT // 3:A0 OUT 3:DATA3 OUT 3:--- OUT // 4:A1 OUT 4:DATA4 OUT 4:--- OUT // 5:RST OUT 5:DATA5 OUT 5:BUSY IN // 6:TxD OUT 6:DATA6 OUT // 7:RxD IN 7:DATA7 OUT ///////////////////////////////////////////////////////// #use delay(clock = 10000000) // clock 10MHz #use fast_io(A) #use fast_io(B) #use fast_io(C) #define CS PIN_C0 #define RD PIN_C1 #define WR PIN_C2 #define A0 PIN_C3 #define A1 PIN_C4 #define RST PIN_C5 #define BUSY PIN_A5 int START_CMD; // スタートモードコマンド int CTRL_CMD; // 制御モードコマンド int REG_CMD; // レジスタセレクトコマンド int OUT_CMD; // 出力モードコマンド void pcd_init(); //コントローラ初期化 void pcd_cmdwr(int cmd_data); //コマンドバッファ書き込み関数 void pcd_reg(int reg); //レジスタ選択関数 void pcd_datah(int data_h); //上位データ書き込み関数 void pcd_datam(int data_m); //中位データ書き込み関数 void pcd_datal(int data_l); //下位データ書き込み関数 void pcd_precnt(long precnt); //プリセット値書き込み関数 void pcd_speed(int speed); //回転速度書き込み関数 void pcd_start(); //回転開始関数 void pcd_stop(); //回転停止関数 void pcd_cw(int rotate); //回転方向設定関数 void pcd_ots(int ots); //OTS出力関数 void pcd_wr(); //書き込みパルス出力関数 /* コントローラ初期化 ***************************************/ void pcd_init(){ set_tris_a(0x20); //PortA input set_tris_b(0x00); //PortB output set_tris_c(0x80); //PortC 7in 6-0out output_bit(RST,0); //RESET信号出力 output_bit(CS,1); //CS信号出力 output_bit(RD,1); //RD信号出力 output_bit(WR,1); //WR信号出力 output_bit(A0,1); //A0信号出力 output_bit(A1,1); //A1信号出力 // RESET 処理 delay_ms(1); //1ms待機 パルス幅1ms output_bit(RST,1); //RST信号戻し // CS(CHIP SELECT)処理 output_bit(CS,0); //CS信号LOW // 制御モードコマンドの設定 pcd_cmdwr(0x64); //S字加速,OTS=0,動作+方向,プリセット有効,SD/ORG無効 CTRL_CMD = 0x64; //制御モードコマンドの保存 // レジスタセレクトコマンドの設定 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; //出力モードコマンドの保存 pcd_speed(200); // 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; //スタートモードコマンドの保存 pcd_ots(0); //OTS出力なし } /* コマンドバッファ書き込み ****************************/ // cmd_data : 書き込みデータ pcd_cmdwr(int cmd_data){ output_bit(A0,0); //コマンドバッファ指定 output_bit(A1,0); output_b(cmd_data); //cmd_data出力 pcd_wr(); //書き込み信号出力 } /* レジスタ選択 ****************************************/ // REG : レジスタ番号0〜7の指定 pcd_reg(int reg){ output_b(REG_CMD); //現在のレジスタセレクトコマンドをロード output_bit(A0,0); //コマンドバッファ指定 output_bit(A1,0); output_bit(PIN_B7,1); //D7 レジスタセレクトコマンド選択 output_bit(PIN_B6,0); //D6 output_bit(PIN_B3,0); //D3 switch(reg){ case 0: //R0選択 output_bit(PIN_B0,0); output_bit(PIN_B1,0); output_bit(PIN_B2,0); break; case 1: //R1選択 output_bit(PIN_B0,1); output_bit(PIN_B1,0); output_bit(PIN_B2,0); break; case 2: //R2選択 output_bit(PIN_B0,0); output_bit(PIN_B1,1); output_bit(PIN_B2,0); break; case 3: //R3選択 output_bit(PIN_B0,1); output_bit(PIN_B1,1); output_bit(PIN_B2,0); break; case 4: //R4選択 output_bit(PIN_B0,0); output_bit(PIN_B1,0); output_bit(PIN_B2,1); break; case 5: //R5選択 output_bit(PIN_B0,1); output_bit(PIN_B1,0); output_bit(PIN_B2,1); break; case 6: //R6選択 output_bit(PIN_B0,0); output_bit(PIN_B1,1); output_bit(PIN_B2,1); break; case 7: //R7選択 output_bit(PIN_B0,1); output_bit(PIN_B1,1); output_bit(PIN_B2,1); break; } pcd_wr(); //書き込み信号出力 REG_CMD = input_b(); //変更後のレジスタセレクトコマンドの保存 } /* 上位データ書き込み **************************/ // data_h : 書き込みデータ pcd_datah(int data_h){ output_bit(A0,1); //レジスタ上位バイトの指定 output_bit(A1,1); output_b(data_h); //上位バイトの書き込み pcd_wr(); //書き込み信号出力 } /* 中位データ書き込み **************************/ // data_m : 書き込みデータ pcd_datam(int data_m){ output_bit(A0,0); //レジスタ中位バイトの指定 output_bit(A1,1); output_b(data_m); //中位バイトの書き込み pcd_wr(); //書き込み信号出力 } /* 下位データ書き込み **************************/ // data_l : 書き込みデータ pcd_datal(int data_l){ output_bit(A0,1); //レジスタ下位バイトの指定 output_bit(A1,0); output_b(data_l); //下位バイトの書き込み pcd_wr(); //書き込み信号出力 } /* R0 プリセットカウンタ設定 ********************************/ // precnt : long型プリセットカウント値 pcd_precnt(long precnt){ long dummy; pcd_reg(0); //R0レジスタ選択 pcd_datah(0); //上位バイト書き込み 強制0固定 dummy = (precnt >> 8) & 0x0000FF; //中位データの抽出 pcd_datam((int)dummy); //中位バイト書き込み dummy = precnt & 0x0000FF; //下位データの抽出 pcd_datal((int)dummy); //下位バイト書き込み } /* R2 動作速度FH設定 ********************************/ // speed : int型回転速度 pps pcd_speed(int speed){ int dummy; speed/=2; //speed = speed / 2 pcd_reg(2); //R2レジスタ選択 dummy = (speed >> 8) & 0x00FF; //中位データの抽出 pcd_datam(dummy); //中位バイト書き込み dummy = speed & 0x00FF; //下位データの抽出 pcd_datal(dummy); //下位バイト書き込み } /* スタート制御 ********************************************/ // pcd_start(){ output_b(START_CMD); //現在のスタートモードコマンドのロード output_bit(A0,0); //コマンドバッファ指定 output_bit(A1,0); output_bit(PIN_B7,0); //D7 スタートモードコマンド選択 output_bit(PIN_B6,0); //D6 output_bit(PIN_B3,0); //D3 ストップ制御 OFF output_bit(PIN_B4,1); //D4 スタート制御 ON pcd_wr(); //書き込み信号出力 START_CMD = input_b(); //変更後のスタートモードコマンドの保存 } /* ストップ制御 ********************************************/ // pcd_stop(){ output_b(START_CMD); //現在のスタートモードコマンドのロード output_bit(A0,0); //コマンドバッファ指定 output_bit(A1,0); output_bit(PIN_B7,0); //D7 スタートモードコマンド選択 output_bit(PIN_B6,0); //D6 output_bit(PIN_B3,1); //D3 ストップ制御 ON output_bit(PIN_B4,0); //D4 スタート制御 OFF pcd_wr(); //書き込み信号出力 START_CMD = input_b(); //変更後のスタートモードコマンドの保存 } /* 方向制御 ********************************************/ // rotate : 0 → 正転、1 → 逆転 pcd_cw(int rotate){ if((rotate == 0) || (rotate == 1)){ output_b(CTRL_CMD); //現在の制御モードコマンドのロード output_bit(A0,0); //コマンドバッファ指定 output_bit(A1,0); output_bit(PIN_B7,0); //D7 制御モードコマンド選択 output_bit(PIN_B6,1); //D6 output_bit(PIN_B3,rotate); //D3 0:正転 1:逆転 pcd_wr(); //書き込み信号出力 CTRL_CMD = input_b(); //変更後の制御モードコマンドの保存 } } /* OTS出力制御 ********************************************/ // ots : 0 → 出力しない、1 → 出力する pcd_ots(int ots){ if((ots == 0) || (ots == 1)){ output_b(CTRL_CMD); //現在の制御モードコマンドのロード output_bit(A0,0); //コマンドバッファ指定 output_bit(A1,0); output_bit(PIN_B7,0); //D7 制御モードコマンド選択 output_bit(PIN_B6,1); //D6 output_bit(PIN_B4,ots);//D3 0:なし 1:あり pcd_wr(); //書き込み信号出力 CTRL_CMD = input_b(); //変更後の制御モードコマンドの保存 } } /* WR信号出力 ********************************************/ pcd_wr(){ output_bit(WR,0); delay_us(10); output_bit(WR,1); //コマンド書き込みタイミング delay_us(10); }