⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 space.c

📁 关于2407控制电机及数据通讯的源代码。
💻 C
📖 第 1 页 / 共 2 页
字号:
void distchuli(void)
{    
    distance[0]=distance[0]*256+distance[1];
}
   
void uartchuli(char * str)
{
    float pwm_zkb=0;
    if(str[0]=='l'&&str[1]=='e'&&str[2]=='g'&&str[4]>='1'&&str[4]<='4') 
    {
        if(str[6]!='j'||str[7]!='o'||str[8]!='i'||str[9]!='n'||str[10]!='t'||str[12]<'1'||str[12]>'4')
        {
            Tdata("error:joint"); return;
        }    
        else 
        {
           if((str[14]=='p')&&(str[15]=='w')&&(str[16]=='m')) 
           {
              pwm_zkb=atoff(str+18); 
              if(pwm_zkb==999){Tdata("error:数字不规范");return;}
              pwm_cmpr=(int)PREGIST*(1/(1+pwm_zkb));Tdata((char *)c_prompt);  
              if(str[12]=='1') {CMPR1=pwm_cmpr;Tfdata(1.0,1);}     /*对应PWM1,2*/ 
              if(str[12]=='2') {CMPR2=pwm_cmpr;Tfdata(3.0,1);}    /*对应PWM3,4*/
              if(str[12]=='3') {CMPR3=pwm_cmpr;Tfdata(5.0,1);}    /*对应PWM5,6*/
              if(str[12]=='4') {CMPR4=pwm_cmpr;Tfdata(7.0,1);}     /*对应PWM7,8*/
              Tdata("占空比" );Tfdata((float)pwm_zkb,2);Tdata(c_end);
           }
           else if((str[14]=='d')&&(str[15]=='i')&&(str[16]=='r'))
           {
              if(str[18]=='1')  
              {
                 if(str[12]=='1') {PBDATDIR=PBDATDIR|0x0010;}    /*对应dir1 IOPB4=1*/ 
                 if(str[12]=='2') {PBDATDIR=PBDATDIR|0x0020;}   /*对应dir2IOPB5=1*/
                 if(str[12]=='3') {PFDATDIR=PFDATDIR|0x0004;}    /*对应DIR3 IOPF2=1*/
                 if(str[12]=='4') {PFDATDIR=PFDATDIR|0x0008;}     /*对应DIR4 IOPF3=1*/
                 Tdata("设置方向正向成功");Tdata(c_end);
              }
              else if(str[18]=='0') 
              {
                 if(str[12]=='1') {PBDATDIR=PBDATDIR&0xFFEF;}    /*对应dir1 IOPB4=0*/ 
                 if(str[12]=='2') {PBDATDIR=PBDATDIR&0xFFDF;}   /*对应dir2IOPB5=0*/
                 if(str[12]=='3') {PFDATDIR=PFDATDIR&0xFFFB;}    /*对应DIR3 IOPF2=0*/
                 if(str[12]=='4') {PFDATDIR=PFDATDIR&0xFFF7;}     /*对应DIR4 IOPF3=0*/ 
                 Tdata("设置方向负向成功");Tdata(c_end); 
              } 
           }         
           else if((str[14]=='b')&&(str[15]=='r')&&(str[16]=='a'))
           {
              if(str[18]=='1')  
              {
                 if(str[12]=='1') {PEDATDIR=PEDATDIR|0x0008;}    /*对应brake1 IOPE3=1*/ 
                 if(str[12]=='2') {PEDATDIR=PEDATDIR|0x0010;}   /*对应BRAKE2 IOPE4=1*/
                 if(str[12]=='3') {PEDATDIR=PEDATDIR|0x0020;}    /*对应BRAKE3 IOPE5=1*/
                 if(str[12]=='4') {PEDATDIR=PEDATDIR|0x0040;}     /*对应BRAKE4 IOPE6=1*/
                 Tdata("设置刹车正输出成功");Tdata(c_end);
              }
              else if(str[18]=='0') 
              {
                 if(str[12]=='1') {PEDATDIR=PEDATDIR&0xFFF7;}    /*对应brake1 IOPE3=0*/ 
                 if(str[12]=='2') {PEDATDIR=PEDATDIR&0xFFEF;}   /*对应BRAKE2 IOPE4=0*/
                 if(str[12]=='3') {PEDATDIR=PEDATDIR&0xFFDF;}    /*对应BRAKE3 IOPE5=0*/
                 if(str[12]=='4') {PEDATDIR=PEDATDIR&0xFFBF;}     /*对应BRAKE4 IOPE6=0*/
                 Tdata("设置刹车负输出成功");Tdata(c_end);
              }    
           }
           else
           {
              Tdata("第三个参数错误");Tdata(c_end);return;
           }
        } 
    }
    else if(str[0]=='c'&&str[1]=='a'&&str[2]=='n'&&str[3]=='o'&&str[4]=='u'&&str[5]=='t') 
    {
        CANMBX3A=0x0201;  /*邮箱3信息初始化*/
        CANMBX3B=0x0403;
        CANMBX3C=0x0605;
        CANMBX3D=0x0807;  
        CANTCR=0x20;/*TRS3=1邮箱3请求发送*/  
        while(CANTCR&0x2000==0) continue; /*等待发送应答TA3=1则发送成功 */   
        CANTCR=0x2000;      /*清TA3\MIF3标志位*/ 
        Tdata("0102030405060708 发送成功");Tdata(c_end);              
    }
    else
    {
        Tdata("错误命令");Tdata(c_end);              
    
    } 
}
  
void varinit(void)
{
        FLAG=0;
        SAMPLE=0;
        motor_num=1;
        j=0;
        t=2000;
        m=0;
        n=1500; 
        b=50;
        c=0;
        d=0;
        e=0;
        f=0;
        g=0;
        CAP3_cnt=0;
        CAP6_cnt=0;     
        
        ledcount=0;
        uartflag=0;
        uartcount=0;
        period_us=50; 
        PREGIST=CLOCK*period_us/16;    
        CAN_FLAG=0;
        ultrasonicflag=0;    
        distance[0]=0;
        distance[1]=0; 
        distcount=0;
        distflag=0;
}

void delay(unsigned int t)
{
	unsigned int z;
        unsigned int ms_ctr;
        for(z=0;z<t;z++)
        {
        	ms_ctr=0x03E8;
                while ( ms_ctr )
	        {
	                ms_ctr--;
	        }
        }
}

void initPID(void)
{
        int j;
        for(j=0;j<2;j++)
        {
        	
                control[j].saturated=0;
                control[j].phase=1;
                control[j].move=1;
                control[j].dir=1; /*dir=1:正向即增计数QEP1或QEP3是先导序列*/
                control[j].count=0;
                control[j].overflow=0;
                control[j].MAX=38;
                control[j].MIN=-38;
                control[j].DUTYCYCLE=50;
                control[j].v=0;
                control[j].vlimit=100;
                control[j].e0=0;
                control[j].e1=0;
                control[j].de=0;
                control[j].OUT=0;
                control[j].mposition=0;
                control[j].position=0;
                control[j].pdist=44320; /*20000=10转*/
                control[j].even_cnt=0;    
        }
        for(j=2;j<4;j++)
        {
        	
                control[j].saturated=0;
                control[j].phase=1;
                control[j].move=1;
                control[j].dir=1; /*dir=1:正向即增计数QEP1或QEP3是先导序列*/
                control[j].count=0;
                control[j].overflow=0;
                control[j].MAX=50;
                control[j].MIN=-50;
                control[j].DUTYCYCLE=50;
                control[j].v=0;
                control[j].vlimit=100;
                control[j].e0=0;
                control[j].e1=0;
                control[j].de=0;
                control[j].OUT=0;
                control[j].mposition=0;
                control[j].position=0;
                control[j].pdist=44320; /*20000=10转*/
                control[j].even_cnt=0;    
        }        
}    

void caninit()
{
   MCRB=MCRB|0x0C0;  /*设置IOPC6IOPC7为CANRXCANTX*/
   CANIFR=0xFFFF;    /*清所有CAN 中断标志*/
   CANLAM1H=0x7000;   /*设置接收邮箱2或3的屏蔽寄存器,=1则相应的位不相符也能接受,目前设定12-2中最高位可以不相符*/
   CANLAM1L=0x0000;    /*0则id必须匹配*/
   CANMCR=0x1000;      /*ccr=1改变配置请求,数据按0-1-2-3-4-5-6-7-8顺序,数据域改变请求禁止*/
   while(CANGSR&0x0010==0)continue;  /*CCE=1即可配置波特率*/
   CANBCR2=0x0003;   /*系统时钟24M,CAN波特率500K*/
   CANBCR1=0x0033;
   CANMCR=CANMCR&0xEFFF;  /*ccr=0改变配置请求结束*/
   while(CANGSR&0x0010!=0)continue;  /*CCE=0改变配置波特率成功*/  
   CANMDER=0x040; /*不使能邮箱,邮箱2配置成接收,3发送*/   
   CANMCR=0x0102;      /*cDr=1数据域改变请求,自测模式,选择邮箱3*/ 
   CANMSGID2H=0x2000; /*设置邮箱2的控制字及ID,IDE=0标准标示符,AME=0禁止屏蔽,标准方式为MSGID2H[12-2]*/
   CANMSGID2L=0x0000;   /*AME=0禁止屏蔽即接收邮箱的标识符必须与被接收邮箱的标识符相符才能接收信息   */
   CANMSGCTRL2=0x08; /*数据长度DCL=8,RTR=0数据帧*/ 
   CANMBX2A=0x0000;  /*邮箱2信息初始化*/
   CANMBX2B=0x0000;
   CANMBX2C=0x0000;
   CANMBX2D=0x0000;
    
   CANMCR=0x0103; 
   CANMSGID3H=0x6000; /*设置邮箱3的控制字及ID,IDE=0标准标示符,AME=0禁止屏蔽,标准方式为MSGID2H[12-2]*/
   CANMSGID3L=0x0000;  
   CANMSGCTRL3=0x08; /*数据长度DCL=8,RTR=0数据帧*/ 
   CANMBX3A=0x0201;  /*邮箱3信息初始化*/
   CANMBX3B=0x0403;
   CANMBX3C=0x0605;
   CANMBX3D=0x0807;
   CANMCR=0x0480;/*DBO=1,ABO=1,STM=0*/
   CANMDER=0x4C; /*使能邮箱2,3,邮箱2配置成接收,3发送*/   
   CANIMR=0xF7FF;  /*中断MBX3不使能,*/
   CANIFR=0xFFFF; /*清全部中断标志*/  
}

void SYSINIT(void)
{
        asm("  SETC INTM  ");      /*关总中断*/
        asm("  CLRC SXM  ");       /*抑制符号扩展*/
        asm("  CLRC OVM  ");       /*累加器中结果正常溢出*/
        asm("  CLRC CNF  ");       /*B0区被配置为数据空间*/
        SCSR1=0x83FE;              /*时钟2倍频,CLKIN=12M,CLKOUT=30M*/
        WDCR=0x00E8;               /*不使能WDT*/
        IMR=0x0000;                /*屏蔽所有CPU中断*/
        IFR=0xFFFF;                /*清全部中断标志*/
        MCRA=0xC57B;               /*p116配置IOPA2-SONAR,IOPA7-PWM2,IOPB1-PWM4,IOPB3-PWM6,IOPB4-DIR1,IOPB5-DIR2*/
        MCRB=0xFEC3;               /*配置IOPC2,3-码盘,IOPC4,5-灯,IOPD0*/
        MCRC=0xF383;               /*配置IOPE2-PWM8,IOPE3-6:BRAKE1-4,IOPF2-DIR3,IOPF3-DIR4*/
        PADATDIR=0xFFFF;           /*设置IOPA输出高电平*/
        PBDATDIR=0xFFFF;           /*设置IOPB输出高电平,dir=1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -