文档介绍:#include""#include""#include""#include<>#include""#include".h"#include""#include<>_Configuration(void);voidGPIO_Configuration(void);voidNVIC_Configuration(void);voidTIM_Configuration(void);voidUSART_Configuration(void);intfputc(intch,FILE*f);intfgetc(FILE*f);floatMx=,My=;//起点floatNx=,Ny=;//终点floatX1,Y1;floatX2,Y2;floatX3,Y3;//三种方法走后的坐标floatk;//斜率floatb;//y=kx+bfloatX,Y;//实际运行的坐标floatDelta1,Delta2,Delta3,Delta4;//三种方法的误差,4为不走最后一步的误差floatDelta;//实际误差//floatDeltaMax;//最大误差charway;//选择的走法inta;//TIM6中断次数intnum=0;//总步数inttx=1,ty=1;//用来判断中断是否发生intnumx,numy;//计XY的步数intcounter=0;//计数值floattime;//时间floatnxd,nyd;//开始减速坐标floatnx,ny;//nx=Nx-;floatfenmu;//公式中分母//intfrex[20]={2,10,30,60,100,150,220,300,390,500};//intfrey[20]={2,10,30,60,100,150,220,300,390,500};intfrex[20]={1098,2931,7585,18242,37754,62245,81757,92414,97068,98901};intfrey[20]={1098,2931,7585,18242,37754,62245,81757,92414,97068,98901};intprex[20]={0};intprey[20]={0};intmain(void){ inti,j;intnpwm=10;//加减速每段脉冲数 //算出预分频值 for(i=0;i<10;i++) { prex[i]=72000000/(frex[i]*200); prey[i]=72000000/(frey[i]*200);}//配置,_Configuration();GPIO_Configuration(); USART_Configuration(); TIM_Configuration(); NVIC_Configuration();Delay_Init(); TIM_Cmd(TIM2,ENABLE);//catchXY TIM_Cmd(TIM6,ENABLE);//计时// TIM_SetCounter(TIM6,0); //开始运行{ //计算相关量X=Mx;Y=My; k=(Ny-My)/(Nx-Mx); b=My-k*Mx; //y=kx+bnxd=Nx-90*;nyd=Ny-90*;nx=Nx-;ny=Ny-; fenmu=sqrt(k*k+1); for(i=1;i<10;i++) //加速阶段,分10段 { while(j<npwm) { X1=X+;Y1=Y;X2=X;Y2=Y+;X3=X+;Y3=Y+; Delta1=fabs(k*X1-Y1+b)/fenmu; Delta2=fabs(k*X2-Y2+b)/fenmu; Delta3=fabs(k*X3-Y3+b)/fenmu; //三种走法的误差//选择最小误差走法if(Delta1<Delta2){way=1;Delta=Delta1;}else{way=2;Delta=Delta2;}if(Delta3<Delta){way=3;Delta=Delta3;}switch(way) //实际走法,while()为等待中断发生(中断失能),以确保一步一脉冲{case1:X=X+; TIM_Cmd(TIM3,ENABLE);while(tx);tx=1;break;case2:Y=Y+; TIM_Cmd(TIM4,ENABLE);while(ty);ty