#include #include "iodefine.h" //右モータドライバ用PWM設定関数(PWMモード1) void init_PWM_1(void){ //モジュールスタンバイコントロールレジスタ[640P] MST.CR2.BIT._MTU = 0; //MTUを開放 //タイマアウトプットマスタイネーブルレジスタ[255P] MTU.TOER.BIT.OE4C = 1; //TIOC4C出力を許可 //ポートE コントロールレジスタ[558P] PFC.PECRL1.BIT.PE14MD = 1; //TIOC4C端子の機能をTIOC4C入出力に選択(01) PFC.PEIORL.BIT.B14 = 1; //TIOC4Cを有効にする(1) MTU.TSTR.BIT.CST4 = 0; //設定中はTCNT_4カウント停止(0) //TCR:タイマコントロールレジスタ設定[228P] MTU4.TCR.BIT.TPSC = 3; //内部クロック:P φ/64 でカウント(011) MTU4.TCR.BIT.CKEG = 0; //立ち上がりエッジでカウント(00) MTU4.TCR.BIT.CCLR = 6; //TGRDでTCNTクリアに設定(111)! //TIOR:タイマI/O コントロールレジスタ[232P] MTU4.TIOR.BIT.IOC = 3; //初期出力0出力,コンペアマッチで1出力に設定 MTU4.TIOR.BIT.IOD = 3; //初期出力0出力,コンペアマッチで0出力に設定 //TGR:タイマジェネラルレジスタ[252P] MTU4.TGRC = 0; //TGRCの値(ここでは初期:0) MTU4.TGRD = 0; //TGRDの値(ここでは初期:0) //タイマモードレジスタ[231P] MTU4.TMDR.BIT.BFB = 0; //tgrc,D通常動作を設定(0) MTU4.TMDR.BIT.BFA = 0; //TGRA,C通常動作を設定(0) MTU4.TMDR.BIT.MD = 2; //PWMモード1を設定(0010) //タイマスタートレジスタ[253P] MTU.TSTR.BIT.CST4 = 1; //TCNT_4カウント動作の設定(1) } //左モータドライバ用PWM設定関数(PWMモード1) void init_PWM_2(void){ //モジュールスタンバイコントロールレジスタ[640P] MST.CR2.BIT._MTU = 0; //MTUを開放 //タイマアウトプットマスタイネーブルレジスタ[255P] //TIOC3Cのタイマアウトプットマスタイネーブルレジスタは無い //ポートE コントロールレジスタ[558P] PFC.PECRL1.BIT.PE10MD = 1; //TIOC3C端子の機能をTIOC3C入出力に選択(01) PFC.PEIORL.BIT.B10 = 1; //TIOC3Cを有効にする(1) MTU.TSTR.BIT.CST3 = 0; //設定中はTCNT_3カウント停止(0) //TCR:タイマコントロールレジスタ設定[228P] MTU3.TCR.BIT.TPSC = 3; //内部クロック:P φ/64 でカウント(011) MTU3.TCR.BIT.CKEG = 0; //立ち上がりエッジでカウント(00) MTU3.TCR.BIT.CCLR = 6; //TGRDでTCNTクリアに設定(101) //TIOR:タイマI/O コントロールレジスタ[232P] MTU3.TIOR.BIT.IOC = 3; //初期出力0出力,コンペアマッチでトグル出力に設定 MTU3.TIOR.BIT.IOD = 3; //初期出力0出力,コンペアマッチでトグル出力に設定 //TGR:タイマジェネラルレジスタ[252P] MTU3.TGRC = 0; //TGRCの値(ここでは初期:0) MTU3.TGRD = 0; //TGRDの値(ここでは初期:0) //タイマモードレジスタ[231P] MTU3.TMDR.BIT.BFB = 0; //tgrc,D通常動作を設定(0) MTU3.TMDR.BIT.BFA = 0; //TGRA,C通常動作を設定(0) MTU3.TMDR.BIT.MD = 2; //PWMモード1を設定(0010) //タイマスタートレジスタ[253P] MTU.TSTR.BIT.CST3 = 1; //TCNT_4カウント動作の設定(1) } //右モータドライバ用デューティー比設定関数 void PWMDutyRatioSet_1(int tgrd,int tgrc){ MTU.TSTR.BIT.CST4 = 0; //設定中TCNT_4カウント停止(0) init_PWM_1(); //初期化 MTU4.TCNT = 0; //TCNTの初期化 MTU4.TGRD = tgrd; //TGRD値の設定 MTU4.TGRC = tgrc; //TGRC値の設定 MTU.TSTR.BIT.CST4 = 1; //設定終了TCNT_4カウント開始(1) } //左モータドライバ用デューティー比設定関数 void PWMDutyRatioSet_2(int tgrd,int tgrc){ MTU.TSTR.BIT.CST3 = 0; //設定中TCNT_3カウント停止(0) init_PWM_2(); //初期化 MTU3.TCNT = 0; //TCNTの初期化 MTU3.TGRD = tgrd; //TGRD値の設定 MTU3.TGRC = tgrc; //TGRC値の設定 MTU.TSTR.BIT.CST3 = 1; //設定終了TCNT_3ウント開始(1) } //モータドライバ入力ポート初期化関数 void init_PORT(void){ PFC.PDIORL.BIT.B15 = 1; //右モータドライブINA有効 PFC.PDIORL.BIT.B14 = 1; //左モータドライブINA有効 PFC.PDIORL.BIT.B13 = 1; //右モータドライブINB有効 PFC.PDIORL.BIT.B12 = 1; //左モータドライブINB有効 PFC.PDIORL.BIT.B11 = 1; //両モータ用DIAGA,DIAGB有効 PD.DR.BIT.B15 = 0; //右モータドライブINA Low PD.DR.BIT.B14 = 0; //左モータドライブINA Low PD.DR.BIT.B13 = 0; //右モータドライブINB Low PD.DR.BIT.B12 = 0; //左モータドライブINB Low PD.DR.BIT.B11 = 1; //両モータ用DIAGA,DIAGB Hight } //文字送信関数 void put_char(char str){ while(!SCI1.SSR.BIT.TDRE); SCI1.TDR = str; SCI1.SSR.BIT.TDRE = 0; while(!SCI1.SSR.BIT.TEND); } //文字列送信関数 void prt_str(char *str){ while(*str != 0){ put_char(*str); str++; } } //文字受信関数 char get_char(void){ char c; while(!(SCI1.SSR.BYTE & 0x78)); c = SCI1.RDR; while(!(SCI1.SSR.BIT.RDRF)); SCI1.SSR.BYTE &= ~0x78; return c; } //シリアル通信初期化関数 void init_SCI(void){ int i; MST.CR1.BIT._SCI1 = 0; // PFC.PAIORL.BIT.B4 = 1; // PFC.PACRL2.BIT.PA4MD = 1; // PFC.PACRL2.BIT.PA3MD = 1; // SCI1.SCR.BYTE = 0x00; // SCI1.SMR.BYTE = 0x00; // SCI1.BRR = 19; //38400bpsに設定 for(i=0;i<=1000;i++); SCI1.SCR.BIT.TE = 1; SCI1.SCR.BIT.RE = 1; } void main(void){ int i; //ループ用変数 char c; //シリアルで受信する文字格納用 int tgrc=20; //ビューティー比の初期値100-20=80% init_PORT(); //モータドライバ入力ポート初期化 init_SCI(); //シリアル通信初期 init_PWM_1(); //右モータ用PWM信号出力の設定 init_PWM_2(); //左モータ用PWM信号出力の設定 while(1){ prt_str("Input:"); c = get_char(); //入力された数字に応じてデューティ比変更 if (c=='0'){ tgrc=100; prt_str("Change Duty Ratio[0%]");} else if(c=='1'){ tgrc=90; prt_str("Change Duty Ratio[10%]");} else if(c=='2'){ tgrc=80; prt_str("Change Duty Ratio[20%]");} else if(c=='3'){ tgrc=70; prt_str("Change Duty Ratio[30%]");} else if(c=='4'){ tgrc=60; prt_str("Change Duty Ratio[40%]");} else if(c=='5'){ tgrc=50; prt_str("Change Duty Ratio[50%]");} else if(c=='6'){ tgrc=40; prt_str("Change Duty Ratio[60%]");} else if(c=='7'){ tgrc=30; prt_str("Change Duty Ratio[70%]");} else if(c=='8'){ tgrc=20; prt_str("Change Duty Ratio[80%]");} else if(c=='9'){ tgrc=10; prt_str("Change Duty Ratio[90%]");} else if(c=='-'){ tgrc=0; prt_str("Change Duty Ratio[100%]");} if(c=='0' || c=='1' || c=='2' || c=='3' || c=='4' || c=='5' || c=='6' || c=='7' || c=='8' || c=='9' || c=='-'){ put_char(0x0a); put_char(0x0d); } //入力された文字に応じて台車の移動方向の出力 //前進 if(c == 'w'){ prt_str("Front"); put_char(0x0a); put_char(0x0d); PD.DR.BIT.B15 = 1; //右モータドライブINA Hight PD.DR.BIT.B14 = 0; //左モータドライブINA Low PD.DR.BIT.B13 = 0; //右モータドライブINB Low PD.DR.BIT.B12 = 1; //左モータドライブINB Hight PWMDutyRatioSet_1(100,tgrc); //デューティー値代入 PWMDutyRatioSet_2(100,tgrc); //デューティー値代入 } //行進 else if(c == 'x'){ prt_str("Back"); put_char(0x0a); put_char(0x0d); PD.DR.BIT.B15 = 0; //右モータドライブINA Low PD.DR.BIT.B14 = 1; //左モータドライブINA Hight PD.DR.BIT.B13 = 1; //右モータドライブINB Hight PD.DR.BIT.B12 = 0; //左モータドライブINB Low PWMDutyRatioSet_1(100,tgrc); //デューティー値代入 PWMDutyRatioSet_2(100,tgrc); //デューティー値代入 } //左旋回 else if(c == 'a'){ prt_str("Left"); put_char(0x0a); put_char(0x0d); PD.DR.BIT.B15 = 1; //右モータドライブINA Hight PD.DR.BIT.B14 = 1; //左モータドライブINA Hight PD.DR.BIT.B13 = 0; //右モータドライブINB Low PD.DR.BIT.B12 = 0; //左モータドライブINB Low PWMDutyRatioSet_1(100,tgrc); //デューティー値代入 PWMDutyRatioSet_2(100,tgrc); //デューティー値代入 } //右旋回 else if(c == 'd'){ prt_str("Right"); put_char(0x0a); put_char(0x0d); PD.DR.BIT.B15 = 0; //右モータドライブINA Low PD.DR.BIT.B14 = 0; //左モータドライブINA Low PD.DR.BIT.B13 = 1; //右モータドライブINB Hight PD.DR.BIT.B12 = 1; //左モータドライブINB Hight PWMDutyRatioSet_1(100,tgrc); //デューティー値代入 PWMDutyRatioSet_2(100,tgrc); //デューティー値代入 } //停止 else if(c == 's'){ prt_str("Stop"); put_char(0x0a); put_char(0x0d); PWMDutyRatioSet_1(0,0); //デューティー値代入 PWMDutyRatioSet_2(0,0); //デューティー値代入 } } }