#define SYS_CLOCK_24_576 #include <3048.h> //¥¥¥ƒvƒƒgƒ^ƒCƒv錾 void reset(void); void send_BYTE(unsigned char data); void send_WORD(unsigned int data); void PWM_L(unsigned int duty); void PWM_R(unsigned int duty); void AD_all(void); void GetPosition(void); void onIRLED(unsigned char index); unsigned int getADdata(unsigned char index); void onIRLED(unsigned char index); unsigned char GetDipSW(void); void Going(unsigned int GoingVelocity); //¥¥¥ƒOƒ[ƒoƒ‹•Ï”錾 unsigned char phase=0; //ó‘Ô”Ô†‹L‰¯ unsigned char debug_cnt=0; //debugƒJƒEƒ“ƒ^ unsigned int datas[20]; /* 0 AD0(right) 0-1024 1 AD1 0-1024 2 AD2 0-1024 3 AD3 0-1024 4 AD4 0-1024 5 AD5(left) —\”õ 0-65536 6 Position ’†‰›üˆÊ’u 0-2048 ’†‰›=1024 7 Differential ’†‰›üˆÊ’u”÷•ª 0-2048 8 Velocity –Ú•W‘¬“x 0-4056 9 Speed Œ»Ý‘¬“x 0-4056 10 PWM_R ‰E“d“®‹@ 0-4056 11 PWM_L ¶“d“®‹@ 0-4056 12 ‰E—Ö‰ñ“]” 0-65536 13 ¶—Ö‰ñ“]” 0-65536 14 15 Batt “d’r“dˆ³ */ unsigned int Position=1024; unsigned int PPosition=1024; unsigned int joint=1024; //’†SƒZƒ“ƒT’lŒë·•â®‰Šú’l unsigned int Differential=1024; unsigned int PWMgeta; //PWM‚̉º‘Ê unsigned int Velocity; //–Ú•W‘¬“x[mm/s] unsigned int Speed; //Œ»Ý‘¬“x[mm/s] unsigned long t=0; unsigned char DT=5,PG=3,DG=8; //¡”÷•ªŽžŠÔ(t%DT==0) ¡”ä—ágain ¡”÷•ªgain #define white 380 //¡ƒNƒƒXLine,ƒGƒ‰[,“¬’l #define gray 330 //¡ƒNƒ‰ƒ“ƒN #define CrankVelocity 1024 //¡ƒNƒ‰ƒ“ƒN’ʉߑ¬“x signed int ControlRod; unsigned int EncR; //ƒGƒ“ƒR[ƒ_’l‹L‰¯—p unsigned int EncL; unsigned int tSpeed; //‘¬“xŒŸoê—pŽžŠÔ•Ï” unsigned int EncRSpeed; //‘¬“xŒŸoê—pƒGƒ“ƒR[ƒ_’l‹L‰¯•Ï” unsigned int PWMoffset=0; //ƒ‚[ƒ^“Á«•â³’l //¥¥¥¥¥¥¥¥¥¥ //ƒƒCƒ“ void main(void){ reset(); if(GetDipSW()==0x01){ } while(1){ } } //¥¥¥¥¥¥¥¥¥¥ // IRQ Š„‚èž‚Ý //¥¥¥¥¥¥¥¥¥¥ // ITU4 Š„‚èž‚Ý(ƒRƒ“ƒyƒAƒ}ƒbƒ`/ƒCƒ“ƒvƒbƒgƒLƒƒƒvƒ`ƒƒA4) void int_imia4 (void){ t++; AD_all(); //¥¥¥ƒQƒCƒ“•ÏXŠm”F if(!P5.DR.BIT.B0){ Velocity=1024+(unsigned int)(GetDipSW()*128);//1024-3072 } if(!P5.DR.BIT.B1){ PG=GetDipSW(); } if(!P5.DR.BIT.B2){ DG=GetDipSW(); } if(!P5.DR.BIT.B3){ DT=GetDipSW(); } //¥yphasez‚ɉž‚¶‚½ˆ—‹y‚ÑphaseƒVƒtƒg switch(phase){ case 0: //¥¥¥‰Šú‰Á‘¬ if(Velocity<512){ Velocity++; } phase++; case 1: //¥¥¥’Êí‘–s //¥ƒNƒƒXLineŒŸ¸ if(datas[0]>white && datas[4]>white) phase++;//ƒNƒƒXLine“¬’l //¥’Êí‘–s§Œä‚é[‚¿‚ñ Going(Velocity); break; case 2: //¥¥¥ƒNƒƒXLineŒŸo PA.DR.BIT.B6=0; //ƒuƒŒ[ƒLON PA.DR.BIT.B7=0; EncR=ITU2.TCNT; //ƒGƒ“ƒR[ƒ_’l‚ð‹L‰¯ EncL=ITU3.TCNT; //ƒGƒ“ƒR[ƒ_’l‚ð‹L‰¯ tSpeed=0; EncRSpeed=ITU2.TCNT; phase++; case 3: //¥¥¥ƒNƒƒXLine’ʉߑ҂¿ if(ITU2.TCNT-EncR>=6 && ITU3.TCNT-EncL>=6){ phase++; }else{ tSpeed++; if(ITU2.TCNT == EncRSpeed){ if(tSpeed>10){ // 200[mm/s]¨10[mm]‚É10/200[s]=50[ms] //50ms‘Ò‚Á‚Ä‚àƒGƒ“ƒR[ƒ_‚ªƒJƒEƒ“ƒg‚³‚ê‚Ä‚È‚¢Žž PA.DR.BIT.B6=1; //ƒuƒŒ[ƒLoff PA.DR.BIT.B7=1; PWM_R(CrankVelocity); PWM_L(CrankVelocity); tSpeed=0; } }else{ //ƒGƒ“ƒR[ƒ_‚ªƒJƒEƒ“ƒg‚³‚ê‚Ä‚½Žž tSpeed=0; EncRSpeed=ITU2.TCNT; } } break; case 4: //¥¥¥ƒNƒƒXLine’ʉßbŒ¸‘¬ if(datas[0]>white && datas[4]>white){ //ƒR[ƒXƒAƒEƒg‚Å‚µ‚½ phase=99; }else{ //ƒNƒƒXLine‚Å‚µ‚½ tSpeed=0; EncRSpeed=ITU2.TCNT; phase++; } break; case 5: //¥¥¥Œ¸‘¬(ƒuƒŒ[ƒLon)b’ᑬ‘–s(ƒuƒŒ[ƒL0ff) tSpeed++; if(ITU2.TCNT == EncRSpeed){ if(tSpeed>5){ //25ms‘Ò‚Á‚Ä‚àƒGƒ“ƒR[ƒ_‚ªƒJƒEƒ“ƒg‚³‚ê‚Ä‚È‚¢Žž PA.DR.BIT.B6=1; //ƒuƒŒ[ƒLoff PA.DR.BIT.B7=1; tSpeed=0; phase++; } }else{ //ƒGƒ“ƒR[ƒ_‚ªƒJƒEƒ“ƒg‚³‚ê‚Ä‚½Žž tSpeed=0; EncRSpeed=ITU2.TCNT; } Going(0); //‘–s§Œä‚é[‚¿‚ñ break; case 6: //¥¥¥’ᑬ‘–s§Œä Going(CrankVelocity); //‘–s§Œä‚é[‚¿‚ñ //¥ƒNƒ‰ƒ“ƒNŒŸo if(datas[0]>gray){ //‰E PA.DR.BIT.B6=0; //‰EƒuƒŒ[ƒL PWM_L(CrankVelocity); // EncL=ITU3.TCNT; //¶ƒGƒ“ƒR[ƒ_’l‚ð‹L‰¯ phase+=1; } if(datas[4]>gray){ //¶ phase+=3; PA.DR.BIT.B7=0; //¶ƒuƒŒ[ƒL PWM_R(CrankVelocity); // EncR=ITU2.TCNT; //‰EƒGƒ“ƒR[ƒ_’l‚ð‹L‰¯ } break; //¥¥¥ƒNƒ‰ƒ“ƒNŒŸob90“x‰Eù‰ñ‰“ª case 7: //¥¥¥‰EƒNƒ‰ƒ“ƒNŒŸob90“x‰Eù‰ñ‰“ª phase++; case 8: //¥¥¥90“x‰Eù‰ñb’†‰›•œ‹A if( ITU3.TCNT-EncL>7 && datas[2]>datas[0]+30 && datas[2]>datas[1]+30 && datas[2]>datas[3]+30 && datas[2]>datas[4]+30 ){ phase=1;//’Êí‘–s }else if( ITU3.TCNT-EncL>9 && datas[4]>white && datas[2]>white ){ PA.DR.BIT.B7=0; //¶ƒuƒŒ[ƒL PA.DR.BIT.B6=1; //‰EƒuƒŒ[ƒL‰ðœ PWM_R(CrankVelocity); // phase=11; } break; case 9: //¥¥¥¶ƒNƒ‰ƒ“ƒNŒŸob90“x¶ù‰ñ‰“ª phase++; case 10: //¥¥¥90“x¶ù‰ñb’†‰›•œ‹A if( ITU2.TCNT-EncR>7 && datas[2]>datas[0]+30 && datas[2]>datas[1]+30 && datas[2]>datas[3]+30 && datas[2]>datas[4]+30 ){ phase=1;//’Êí‘–s }else if( ITU2.TCNT-EncR>9 && datas[1]>white && datas[2]>white ){ PA.DR.BIT.B6=0; //‰EƒuƒŒ[ƒL PA.DR.BIT.B7=1; //¶ƒuƒŒ[ƒL‰ðœ PWM_L(CrankVelocity); // phase++; } break; case 11: //¥¥¥’†‰›•œ‹A if( datas[2]>datas[0]+30 && datas[2]>datas[1]+30 && datas[2]>datas[3]+30 && datas[2]>datas[4]+30 ){ PA.DR.BIT.B6=1; //‰EƒuƒŒ[ƒL‰ðœ PA.DR.BIT.B7=1; //¶ƒuƒŒ[ƒL‰ðœ phase=1;//’Êí‘–s } break; case 99: //¥¥¥’âŽ~ƒR[ƒhŒŸo PA.DR.BIT.B6=0; PA.DR.BIT.B7=0; while(1); break; } P4.DR.BYTE++; //¡¡ƒeƒXƒg—p datas[5]++; //¡¡ƒeƒXƒg—p //¥“à•”ƒf[ƒ^‚‚ê—¬‚µ datas[6] =Position; datas[7] =Differential; datas[8] =Velocity; datas[9] =Speed; datas[10]=ITU0.GRB; datas[11]=ITU1.GRB; datas[12]=ITU2.TCNT; datas[13]=ITU3.TCNT; if (debug_cnt<=15){ send_WORD(datas[debug_cnt]); debug_cnt++; }else{ debug_cnt=0; while(!SCI1.SSR.BIT.TDRE); SCI1.TDR=0x0D; //‰üsƒR[ƒh SCI1.SSR.BIT.TDRE=0; } } //¥¥¥ƒNƒ‰ƒ“ƒN’†‚ÌŽp¨§Œä void Going(unsigned int GoingVelocity){ if(t%DT==0){ //”÷•ªŽžŠÔ GetPosition(); Differential=1024+Position-PPosition; //‰E‰E‰E‰E‰E‰E‰E‰E‰E‰E‰EPWM•ÏX ControlRod= ((signed int)(Position-1024) +(signed int)(Differential-1024)*(signed int)DG )*(signed int)PG; if(ControlRod > 0){ //‰Á‘¬ ControlRod = ControlRod/2 + (signed int)GoingVelocity; }else{ //Œ¸‘¬ ControlRod = ControlRod + (signed int)GoingVelocity; } if(ControlRod<=0){ //‰ºŒÀ PA.DR.BIT.B6=0; //‰EƒuƒŒ[ƒLÝ’è ControlRod=1; }else{PA.DR.BIT.B6=1;} //‰EƒuƒŒ[ƒL‰ðœ if(ControlRod>=4056){ //ãŒÀ ControlRod=4055; } PWM_R((unsigned int)ControlRod); //¶¶¶¶¶¶¶¶¶¶¶PWM•ÏX ControlRod= ((signed int)(Position-1024) +(signed int)(Differential-1024)*(signed int)DG )*(signed int)PG; if(ControlRod > 0){ //‰Á‘¬ ControlRod = -ControlRod/2 + (signed int)GoingVelocity; }else{ //Œ¸‘¬ ControlRod = -ControlRod + (signed int)GoingVelocity; } if(ControlRod<=0){ PA.DR.BIT.B7=0; //¶ƒuƒŒ[ƒL ControlRod=1; }else{PA.DR.BIT.B7=1;} //¶ƒuƒŒ[ƒL‰ðœ if(ControlRod>=4056) ControlRod=4055; //ãŒÀ PWM_L((unsigned int)ControlRod); } } //¥¥¥PWMduty•ÏX(‰E:FDIIOC) void PWM_R(unsigned int duty){ ITU0.GRB=duty; } //¥¥¥PWMduty•ÏX(¶:FDIIOB) void PWM_L(unsigned int duty){ ITU1.GRB=duty; } //¥¥¥¥¥¥¥¥¥¥ //RS232 ‘—M void send_BYTE(unsigned char data){ while (!SCI1.SSR.BIT.TDRE); SCI1.TDR=data & 0xF0; //ãˆÊ4bit SCI1.SSR.BIT.TDRE=0; while (!SCI1.SSR.BIT.TDRE); SCI1.TDR=(data<<4) & 0xF0; //‰ºˆÊ4bit SCI1.SSR.BIT.TDRE=0; } void send_WORD(unsigned int data){ while (!SCI1.SSR.BIT.TDRE); SCI1.TDR=(char)((data>>12)&0x000F)+0x30; //ÅãˆÊ4bit SCI1.SSR.BIT.TDRE=0; while (!SCI1.SSR.BIT.TDRE); SCI1.TDR=(char)((data>>8)&0x000F)+0x30; // SCI1.SSR.BIT.TDRE=0; while (!SCI1.SSR.BIT.TDRE); SCI1.TDR=(char)((data>>4)&0x000F)+0x30; // SCI1.SSR.BIT.TDRE=0; while (!SCI1.SSR.BIT.TDRE); SCI1.TDR=(char)((data)&0x000F)+0x30; //ʼnºˆÊ4bit SCI1.SSR.BIT.TDRE=0; } //¥¥¥¥¥¥¥¥¥¥ //ADŠÖŒW void AD_all(void){ //AD•ÏŠ· volatile static unsigned char j; volatile unsigned char i; for (i=0;i<=4;i++){ AD.ADCSR.BIT.CH=i; //AD‚̃`ƒƒƒ“ƒlƒ‹ onIRLED(i); //LED on AD.ADCSR.BIT.ADST=1; //‚¾‚Ý[‚Ö‚ñ‚©‚ñ while(!AD.ADCSR.BIT.ADF); //‚¾‚Ý[‚Ö‚ñ‚©‚ñ AD.ADCSR.BIT.ADF=0; //‚¾‚Ý[‚Ö‚ñ‚©‚ñ for (j=0;j<255;j++) asm("nop"); AD.ADCSR.BIT.ADST=1; while(!AD.ADCSR.BIT.ADF); PB.DR.BYTE = 0x80; //LED‘Soff AD.ADCSR.BIT.ADF=0; datas[i]=getADdata(i)>>6; } //¥¥¥ƒoƒbƒeƒŠ[‚Ì“dˆ³ AD.ADCSR.BIT.CH=7; AD.ADCSR.BIT.ADST=1; while(!AD.ADCSR.BIT.ADF); AD.ADCSR.BIT.ADF=0; datas[15]=getADdata(7)>>6; } unsigned int getADdata(unsigned char index){ if(index == 0) return AD.ADDRA; if(index == 1) return AD.ADDRB; if(index == 2) return AD.ADDRC; if(index == 3) return AD.ADDRD; if(index == 4) return AD.ADDRA; if(index == 5) return AD.ADDRB; if(index == 6) return AD.ADDRC; if(index == 7) return AD.ADDRD; return 0; } void onIRLED(unsigned char index){ if(index == 0) PB.DR.BIT.B0=1; if(index == 1) PB.DR.BIT.B1=1; if(index == 2) PB.DR.BIT.B2=1; if(index == 3) PB.DR.BIT.B3=1; if(index == 4) PB.DR.BIT.B4=1; if(index == 5) PB.DR.BIT.B5=1; } //¥¥¥¥¥¥¥¥¥¥ //ƒ}ƒCƒRƒ“ƒ{[ƒhãDIPSW’lŽæ“¾ unsigned char GetDipSW(){ return P6.DR.BYTE & 0x0F; } //¥¥¥¥¥¥¥¥¥¥ //ƒZƒ“ƒT‚Ì’lydatas[]z‚©‚çyPositionz‚Ƀ‰ƒCƒ“ˆÊ’u‚𓾂é void GetPosition(void){ //unsigned char best1,best2; //0„¢ ¶‰ß‚¬0„Ÿ„Ÿ„Ÿ„Ÿ1024„Ÿ„Ÿ„Ÿ2048‰E‚·‚¬ //1„¨„¢ //2„¢„¥„¢ ¶ŒŸ’mŠí 4 3 2 1 0 ‰EŒŸ’mŠí //3„¨„£„¥ƒg[ƒiƒƒ“ƒg //4„Ÿ„Ÿ„£ /* if(datas[ 0]>datas[ 1]) best1=0; else best1=1; if(datas[ 2]>datas[ 3]) best2=2; else best2=3; if(datas[best1]>datas[best2]); else best1=best2; if(datas[best1]>datas[ 4]); else best1=4; if(best1==0 || best1==1) Position=2048;return; if(best1==3 || best1==4) Position=2048;return; Position=1024+datas[3]-datas[1]; */ PPosition=Position; if(datas[1]>datas[2]){ if(datas[1]>datas[3]){ //‰EƒZƒ“ƒT‚ªÅ‘å‚ÌŽž if(joint==1024-45) joint=Position+datas[0]-datas[2]+Differential-1024; Position=joint+datas[2]-datas[0]; } }else{ if(datas[2]>datas[3]){ //’†‰›ƒZƒ“ƒT‚ªÅ‘å‚Ì‚Æ‚« joint=1024-45; Position=joint+datas[3]-datas[1]; }else{ //¶ƒZƒ“ƒT‚ªÅ‘å‚Ì‚Æ‚« if(joint==1024-45) joint=Position+datas[2]-datas[4]+Differential-1024; Position=joint+datas[4]-datas[2]; } } } //¥¥¥¥¥¥¥¥¥¥ //ŠeŽí‰Šú‰» void reset(void){ unsigned int i; //¥IO‰Šú‰» P4.DDR=0xFF; P4.DR.BYTE=0x00; //P6.DDR=0x00; //‚Å‚Ó‚§‚é‚Æ //P6.DR.BYTE=0x00; //‚Å‚Ó‚§‚é‚Æ //P5.DDR=0x00; //‚Å‚Ó‚§‚é‚Æ //P5.DR.BYTE=0x00; //‚Å‚Ó‚§‚é‚Æ P5.PCR.BYTE=0x07; //ƒvƒ‹ƒAƒbƒv PA.DDR=0xFC; PA.DR.BYTE=0xE0; PB.DDR=0xFF; PB.DR.BYTE=0x00; //¥PWM‰Šú‰» ITU.TMDR.BIT.PWM0=1;//¥‰E ITU0.TCR.BIT.CCLR=1; //GRA‚ƃ}ƒbƒ`‚ŃNƒŠƒA ITU0.GRA=4096; //¡PWMÅ‘å’l ITU0.GRB=1; ITU.TSTR.BIT.STR0=1; ITU.TMDR.BIT.PWM1=1;//¥¶ ITU1.TCR.BIT.CCLR=1; //GRA‚ƃ}ƒbƒ`‚ŃNƒŠƒA ITU1.GRA=4096; //¡PWMÅ‘å’l ITU1.GRB=1; ITU.TSTR.BIT.STR1=1; //¥ƒGƒ“ƒR[ƒ_‰Šú‰» ITU2.TCR.BIT.TPSC=4; //TCLKA‚ðƒJƒEƒ“ƒg//¥‰E ITU2.TCR.BIT.CKEG=0; //—§‚¿ãƒGƒbƒaƒJƒEƒ“ƒg ITU.TSTR.BIT.STR2=1; //ƒJƒEƒ“ƒgƒXƒ^[ƒg ITU3.TCR.BIT.TPSC=5; //TCLKB‚ðƒJƒEƒ“ƒg//¥¶ ITU3.TCR.BIT.CKEG=0; //—§‚¿ãƒGƒbƒaƒJƒEƒ“ƒg ITU.TSTR.BIT.STR3=1; //ƒJƒEƒ“ƒgƒXƒ^[ƒg PB.DR.BIT.B7=1; //—¼ƒGƒ“ƒR[ƒ_“®ì‹–‰Â //¥ITU4ƒCƒ“ƒ^[ƒoƒ‹ƒ^ƒCƒ}‰Šú‰» ITU4.GRA=15360; //¡ŽüŠú ITU4.TCR.BIT.CCLR=1; //GRA‚ƃ}ƒbƒ`‚ŃNƒŠƒA ITU4.TCR.BIT.TPSC=3; //ƒvƒŠƒXƒP[ƒ‰ 0=CK,1=CK/2,2=CK/4,3=CK/8 ITU4.TIER.BIT.IMIEA=1; //GRAƒ}ƒbƒ`‚ÅŠ„‚èž‚Ý”­¶ ITU.TSTR.BIT.STR4=1; //ƒJƒEƒ“ƒgƒXƒ^[ƒg //¥AD‰Šú‰» AD.ADCSR.BIT.SCAN=0; //’Pˆêƒ‚[ƒh AD.ADCSR.BIT.CKS=0; //‚¶‚Á‚­‚è•ÏŠ· // AD.ADCSR.BIT.CH=; //ƒ`ƒƒƒ“ƒlƒ‹‘I‘ð // AD.ADCSR.ADST=1; //•ÏŠ·ŠJŽn // while(AD.ADCSR.ADF); //•ÏŠ·Š®—¹‘Ò‚¿ // AD.ADCSR.ADDRA //¥SCI1‰Šú‰» SCI1.SCR.BIT.TE=0; // SCI1.SCR.BIT.RE=0; // SCI1.SMR.BIT.CKS=0; SCI1.BRR=18; //¡18=38400bps 38=19200bps for (i=0;i<=40000;i++); SCI1.SCR.BIT.TE=1; //‘—M‹–‰Â EI; }