第五届飞思卡尔电磁车程序速度25.docx
- 文档编号:6209813
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:11
- 大小:16.35KB
第五届飞思卡尔电磁车程序速度25.docx
《第五届飞思卡尔电磁车程序速度25.docx》由会员分享,可在线阅读,更多相关《第五届飞思卡尔电磁车程序速度25.docx(11页珍藏版)》请在冰豆网上搜索。
第五届飞思卡尔电磁车程序速度25
#include
#include"derivative.h"
#include"printp.h"
#definese1max(int*)(0x0800)
#definese3max(int*)(0x0802)
#definese5max(int*)(0x0804)
#definese7max(int*)(0x0806)
#definespoint294
#defineH110
#defineH210
#include"function.h"
voidinit(void);
intPWM_MIN=8100,PWM_MID=8800,PWM_MAX=9500;
intsdata1[spoint],sdata3[spoint],sdata5[spoint],sdata7[spoint];
inty[spoint];
intSE1,SE3,SE5,SE7;
intoffset1,offset3,offset5,offset7,lastoffset1,lastoffset3,lastoffset5,lastoffset7;
intSE1MAX,SE3MAX,SE5MAX,SE7MAX;
intservo_pwm,lastservo_pwm;
longintsum1,sum3,sum5,sum7;
intspeed,prespeed,presetspeed,distance,bendspeed=50;
intprint_flag=0,counter=0,startflag=0,stopflag=0,startdelay,startdelaycount;
intk1=24,k3=24,k5=24,k7=24;//校正系数
intstateSE7[3],stateSE5[3],stateSE1[3],stateSE3[3],diff1,diff3,diff7,diff5;
voidmain(void)
{
intn;
init();
PWMDTY01=PWM_MID;//舵机PWM波脉宽范围
ATD0CTL5=0x30;//启动AD
PITCE_PCE0=1;//启动PIT0
PITCE_PCE1=1;//启动PIT1
PITCE_PCE2=1;//启动PIT2
PITCE_PCE3=1;//启动PIT3
EnableInterrupts;
for(;;)
{
if(print_flag==1)
{
n++;
if(n==10)
{
n=0;
printp("%d",PWMDTY01);
printp("\n\n");
printp("1=%d3=%d5=%d7=%d",offset1,offset3,offset5,offset7);
/*for(n=0;n { printp("%d",sdata1[n]); }*/ printp("SE1=%d%d%d%d",SE1,SE3,SE5,SE7); //printp("diff1=%d%d%d%d",diff1,diff3,diff5,diff7); //printp("\n"); printp("SEMAX=%d%d%d%d",SE1MAX,SE3MAX,SE5MAX,SE7MAX); printp("speed=%d",speed); //printp("k1=%dk3=%dk5=%dk7=%d",k1,k3,k5,k7); //printp("\n\n"); //printp("%d",servo_pwm); //printp("\n\n"); printp("\n\n"); print_flag=0; } } } } #pragmaCODE_SEG__NEAR_SEGNON_BANKED voidinterrupt12IOC4interrupt(void) { inti,j; TFLG1_C4F=1; TIE_C4I=0; //prespeed=presetspeed; startflag++;//按第一下,显示舵机的方向,按第二下,延时2S启动 for(i=0;i<500;i++) for(j=0;j<0x0d53;j++); TFLG1_C4F=1; TIE_C4I=1; } voidinterrupt13IOC5interrupt(void) { inti,j; TFLG1_C5F=1; TIE_C5I=0; if(PTJ_PTJ7==0) { bendspeed+=3; } else presetspeed+=3; if(PTT_PTT2==0) { presetspeed=70; } for(i=0;i<500;i++) for(j=0;j<0x0d53;j++); TFLG1_C5F=1; TIE_C5I=1; } voidinterrupt22ADinterrupt(void) { sdata1[counter]=ATD0DR0; sdata3[counter]=ATD0DR1; sdata5[counter]=ATD0DR2; sdata7[counter]=ATD0DR3; counter++; } voidinterrupt69PIT3interrupt(void) { _asm(MOVB#$08,PITTF); speed=PACNT; PACNT=0; if(startflag==2) { if(startdelay==0) { startdelaycount++; if(startdelaycount>=100) { startdelay=1; } } if(startdelay==1) { adjust_speed(); } } } voidinterrupt68PIT2interrupt(void) { _asm(MOVB#$04,PITTF); if(PORTA_PA0==0) { stopflag++; PITCE_PCE2=0; } } voidinterrupt67PTI1interrupt(void) { //***为下一个循环作准备**** _asm(MOVB#$02,PITTF); counter=0; sum1=0; sum3=0; sum5=0; sum7=0; PITCE_PCE0=1; ATD0CTL2_ASCIE=1; ATD0CTL5=0x30; print_flag=1; } voidinterrupt66PIT0interrupt(void)//采样时间为2ms { inti,temp; PITCE_PCE0=0;//关闭PIT ATD0CTL2_ASCIE=0;//关闭AD EnableInterrupts;//允许PIT2,3中断该程序 //***滤波**** filter(sdata1); filter(sdata3); filter(sdata5); filter(sdata7); //***求峰峰值*** for(i=0;i { sum1+=sdata1[i]; sum3+=sdata3[i]; sum5+=sdata5[i]; sum7+=sdata7[i]; } SE1=(int)(sum1>>12); SE3=(int)(sum3>>12); SE5=(int)(sum5>>12); SE7=(int)(sum7>>12); //***找出相应的最大值*** if(PTT_PTT3==0) { if(SE1>SE1MAX) { SE1MAX=SE1; } if(SE3>SE3MAX) { SE3MAX=SE3; } if(SE5>SE5MAX) { SE5MAX=SE5; } if(SE7>SE7MAX) { SE7MAX=SE7; } save2flash(SE1MAX,SE3MAX,SE5MAX,SE7MAX); } SE1MAX=*se1max; SE3MAX=*se3max; SE5MAX=*se5max; SE7MAX=*se7max; if(SE1==0) SE1=1; if(SE3==0) SE3=1; if(SE5==0) SE5=1; if(SE7==0) SE7=1; //***求偏移***** offset1=(int)sqrt(100*(unsignedlongint)((SE1MAX)*H1*H1/SE1-H2*H2))*24/k1; offset3=(int)sqrt(100*(unsignedlongint)((SE3MAX)*H1*H1/SE3-H2*H2))*24/k3; offset5=(int)sqrt(100*(unsignedlongint)((SE5MAX)*H2*H2/SE5-H2*H2))*24/k5; offset7=(int)sqrt(100*(unsignedlongint)((SE7MAX)*H2*H2/SE7-H2*H2))*24/k7; if(offset1>450) offset1=450; if(offset3>450) offset3=450; if(offset5>450) offset5=450; if(offset7>450) offset7=450; //***求servo_pwm*** stateSE1[0]=SE1; stateSE3[0]=SE3; stateSE7[0]=SE7; stateSE5[0]=SE5; diff1=stateSE1[0]-stateSE1[2]; diff3=stateSE3[0]-stateSE3[2]; diff7=stateSE7[0]-stateSE7[2]; diff5=stateSE5[0]-stateSE5[2]; for(i=1;i>=0;i--) { stateSE1[i+1]=stateSE1[i]; stateSE3[i+1]=stateSE3[i]; stateSE5[i+1]=stateSE5[i]; stateSE7[i+1]=stateSE7[i]; } if(offset5+offset7>400) { if((offset7+offset3)>(offset5+offset1)) { servo_pwm=((offset7+offset5-80)+((offset7-lastoffset7)-(offset5-lastoffset5)))*((PWM_MAX-PWM_MID)/200); } else { servo_pwm=((-offset7-offset5+80)+((offset7-lastoffset7)-(offset5-lastoffset5)))*((PWM_MAX-PWM_MID)/200); } if(servo_pwm+PWM_MID>PWM_MAX) servo_pwm=PWM_MAX-PWM_MID; if(servo_pwm+PWM_MID servo_pwm=PWM_MIN-PWM_MID; if(abs(servo_pwm-lastservo_pwm)>=PWM_MAX-PWM_MID+100) servo_pwm=lastservo_pwm; } elseif((offset5+offset7)>280)//四个电感处在同侧 { servo_pwm=((offset7-offset5)+((offset7-lastoffset7)-(offset5-lastoffset5)))*((PWM_MAX-PWM_MID)/100); } else { servo_pwm=((offset7-offset5)*3/2+(offset1-offset5+offset7-offset3)*4+((offset7-lastoffset7)-(offset5-lastoffset5))*2)*((PWM_MAX-PWM_MID)/350)+((diff3-diff7)+(diff5-diff1))*5; } //***求相应的PWMDTY01*** if(servo_pwm+PWM_MID>PWM_MAX) { servo_pwm=PWM_MAX-PWM_MID; PWMDTY01=PWM_MAX; } elseif(servo_pwm+PWM_MID { servo_pwm=PWM_MIN-PWM_MID; PWMDTY01=PWM_MIN; } else PWMDTY01=PWM_MID+servo_pwm; lastservo_pwm=servo_pwm; lastoffset7=offset7; lastoffset5=offset5; prespeed=presetspeed-abs(PWMDTY01-PWM_MID)/((PWM_MAX-PWM_MID)/(presetspeed-bendspeed)); //***显示控制*** if(startflag==0) { if(PTJ_PTJ7==0) display_speed(bendspeed); else display_speed(presetspeed); } else display_position(); //***停车控制*** if(SCI0SR1_RDRF==1) { temp=SCI0DRL; PWMDTY01=PWM_MID; PWMDTY23=0; PWMDTY67=0; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五 届飞思 卡尔 电磁 车程 速度 25