OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2965|回复: 6

急 求助关于延时的问题

[复制链接]

3

主题

9

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-26
在线时间
0 小时
发表于 2015-12-13 18:25:54 | 显示全部楼层 |阅读模式
5金钱
if(Receive_Mark==0xff)  
{
  if(STEP_NUM==0x00)     //第一步动作
  {
    uint8_t S_D= 0x00;
    for(S_D=0;S_D<10;S_D++)   //返回上位机的控制命令
     {
       USART_SendData(USART1 ,Control_Step_Now[S_D]);
       while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
     }
   M1_Position=(Control_Step_Now[0]<<8)+(Control_Step_Now[1]);   //电机1指令位置
   M2_Position=(Control_Step_Now[2]<<8)+(Control_Step_Now[3]);   //电机2指令位置
   M3_Position=(Control_Step_Now[4]<<8)+(Control_Step_Now[5]);   //电机3指令位置
   M4_Position=(Control_Step_Now[6]<<8)+(Control_Step_Now[7]);   //电机4指令位置
   M5_Position=(Control_Step_Now[8]<<8)+(Control_Step_Now[9]); //电机5指令位置
   }
 
if(STEP_NUM==0x01)   //第二步动作
  {
    uint8_t S_D= 0x0a;
    for(S_D=10;S_D<20;S_D++)   //返回上位机的控制命令
     {
       USART_SendData(USART1 ,Control_Step_Now[S_D]);
       while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
     }
   M1_Position=(Control_Step_Now[10]<<8)+(Control_Step_Now[11]);   //电机1指令位置
   M2_Position=(Control_Step_Now[12]<<8)+(Control_Step_Now[13]);   //电机2指令位置
   M3_Position=(Control_Step_Now[14]<<8)+(Control_Step_Now[15]);   //电机3指令位置
   M4_Position=(Control_Step_Now[16]<<8)+(Control_Step_Now[17]);   //电机4指令位置
   M5_Position=(Control_Step_Now[18]<<8)+(Control_Step_Now[19]); //电机5指令位置
   }
  if(STEP_NUM==0x02)   //第三步动作
  {
    uint8_t S_D= 0x14;
    for(S_D=20;S_D<30;S_D++)   //返回上位机的控制命令
     {
       USART_SendData(USART1 ,Control_Step_Now[S_D]);
       while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
     }
   M1_Position=(Control_Step_Now[20]<<8)+(Control_Step_Now[21]);   //电机1指令位置
   M2_Position=(Control_Step_Now[22]<<8)+(Control_Step_Now[23]);   //电机2指令位置
   M3_Position=(Control_Step_Now[24]<<8)+(Control_Step_Now[25]);   //电机3指令位置
   M4_Position=(Control_Step_Now[26]<<8)+(Control_Step_Now[27]);   //电机4指令位置
   M5_Position=(Control_Step_Now[28]<<8)+(Control_Step_Now[29]); //电机5指令位置
   }
  if(STEP_NUM==0x03)   //第四步动作
  {
    uint8_t S_D= 0x1e;
    for(S_D=30;S_D<40;S_D++)   //返回上位机的控制命令
     {
       USART_SendData(USART1 ,Control_Step_Now[S_D]);
       while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
     }
   M1_Position=(Control_Step_Now[30]<<8)+(Control_Step_Now[31]);   //电机1指令位置
   M2_Position=(Control_Step_Now[32]<<8)+(Control_Step_Now[33]);   //电机2指令位置
   M3_Position=(Control_Step_Now[34]<<8)+(Control_Step_Now[35]);   //电机3指令位置
   M4_Position=(Control_Step_Now[36]<<8)+(Control_Step_Now[37]);   //电机4指令位置
   M5_Position=(Control_Step_Now[38]<<8)+(Control_Step_Now[39]); //电机5指令位置
   }
  if(STEP_NUM==0x04)   //第五步动作
  {
    uint8_t S_D= 0x28;
    for(S_D=40;S_D<50;S_D++)   //返回上位机的控制命令
     {
       USART_SendData(USART1 ,Control_Step_Now[S_D]);
       while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
     }
   M1_Position=(Control_Step_Now[40]<<8)+(Control_Step_Now[41]);   //电机1指令位置
   M2_Position=(Control_Step_Now[42]<<8)+(Control_Step_Now[43]);   //电机2指令位置
   M3_Position=(Control_Step_Now[44]<<8)+(Control_Step_Now[45]);   //电机3指令位置
   M4_Position=(Control_Step_Now[46]<<8)+(Control_Step_Now[47]);   //电机4指令位置
   M5_Position=(Control_Step_Now[48]<<8)+(Control_Step_Now[49]); //电机5指令位置
   }
  if(STEP_NUM==0x05)   //第六步动作
  {
    uint8_t S_D= 0x32;
    for(S_D=50;S_D<60;S_D++)   //返回上位机的控制命令
     {
       USART_SendData(USART1 ,Control_Step_Now[S_D]);
       while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
     }
   M1_Position=(Control_Step_Now[50]<<8)+(Control_Step_Now[51]);   //电机1指令位置
   M2_Position=(Control_Step_Now[52]<<8)+(Control_Step_Now[53]);   //电机2指令位置
   M3_Position=(Control_Step_Now[54]<<8)+(Control_Step_Now[55]);   //电机3指令位置
   M4_Position=(Control_Step_Now[56]<<8)+(Control_Step_Now[57]);   //电机4指令位置
   M5_Position=(Control_Step_Now[58]<<8)+(Control_Step_Now[59]); //电机5指令位置
   }
  if(STEP_NUM==0x06)   //第七步动作
  {
    uint8_t S_D= 0x3c;
    for(S_D=60;S_D<70;S_D++)   //返回上位机的控制命令
     {
       USART_SendData(USART1 ,Control_Step_Now[S_D]);
       while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
     }
   M1_Position=(Control_Step_Now[60]<<8)+(Control_Step_Now[61]);   //电机1指令位置
   M2_Position=(Control_Step_Now[62]<<8)+(Control_Step_Now[63]);   //电机2指令位置
   M3_Position=(Control_Step_Now[64]<<8)+(Control_Step_Now[65]);   //电机3指令位置
   M4_Position=(Control_Step_Now[66]<<8)+(Control_Step_Now[67]);   //电机4指令位置
   M5_Position=(Control_Step_Now[68]<<8)+(Control_Step_Now[69]); //电机5指令位置
   }
  if(STEP_NUM==0x07)   //第八步动作
  {
    uint8_t S_D= 0x46;
    for(S_D=70;S_D<80;S_D++)   //返回上位机的控制命令
     {
       USART_SendData(USART1 ,Control_Step_Now[S_D]);
       while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
     }
   M1_Position=(Control_Step_Now[70]<<8)+(Control_Step_Now[71]);   //电机1指令位置
   M2_Position=(Control_Step_Now[72]<<8)+(Control_Step_Now[73]);   //电机2指令位置
   M3_Position=(Control_Step_Now[74]<<8)+(Control_Step_Now[75]);   //电机3指令位置
   M4_Position=(Control_Step_Now[76]<<8)+(Control_Step_Now[77]);   //电机4指令位置
   M5_Position=(Control_Step_Now[78]<<8)+(Control_Step_Now[79]); //电机5指令位置
   }
  if(STEP_NUM==0x08)   //第九步动作
  {
    uint8_t S_D= 0x50;
    for(S_D=80;S_D<90;S_D++)   //返回上位机的控制命令
     {
       USART_SendData(USART1 ,Control_Step_Now[S_D]);
       while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
     }
   M1_Position=(Control_Step_Now[80]<<8)+(Control_Step_Now[81]);   //电机1指令位置
   M2_Position=(Control_Step_Now[82]<<8)+(Control_Step_Now[83]);   //电机2指令位置
   M3_Position=(Control_Step_Now[84]<<8)+(Control_Step_Now[85]);   //电机3指令位置
   M4_Position=(Control_Step_Now[86]<<8)+(Control_Step_Now[87]);   //电机4指令位置
   M5_Position=(Control_Step_Now[88]<<8)+(Control_Step_Now[89]); //电机5指令位置
   }
  if(STEP_NUM==0x09)   //第十步动作
  {
    uint8_t S_D= 0x5a;
    for(S_D=90;S_D<100;S_D++)   //返回上位机的控制命令
     {
       USART_SendData(USART1 ,Control_Step_Now[S_D]);
       while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
     }
   M1_Position=(Control_Step_Now[90]<<8)+(Control_Step_Now[91]);   //电机1指令位置
   M2_Position=(Control_Step_Now[92]<<8)+(Control_Step_Now[93]);   //电机2指令位置
   M3_Position=(Control_Step_Now[94]<<8)+(Control_Step_Now[95]);   //电机3指令位置
   M4_Position=(Control_Step_Now[96]<<8)+(Control_Step_Now[97]);   //电机4指令位置
   M5_Position=(Control_Step_Now[98]<<8)+(Control_Step_Now[99]); //电机5指令位置
   }



}



if((STEPMOTOR2_Mark == 0X00)&&(STEPMOTOR1_Mark == 0X00))
{
/*步进电机一控制程序*/
/*匀速运动*/

if(M1_Position_N<M1_Position)
  {
   BUSY_Mark1=0xf0;
   TO1_Valu=1000-1;
   TIM_SetCompare1(TIM3,PTO1_Valu);
   GPIO_SetBits(GPIOB , GPIO_Pin_2);
   GPIO_SetBits(GPIOB , GPIO_Pin_3);
   M1_Position_N++;
  }
if(M1_Position_N>M1_Position)
  {
   BUSY_Mark1=0xf0;
   TO1_Valu=1000-1;
   TIM_SetCompare1(TIM3,PTO1_Valu);
   GPIO_ResetBits(GPIOB , GPIO_Pin_2);
   GPIO_SetBits(GPIOB , GPIO_Pin_3);
   M1_Position_N--;
  }
if(M1_Position_N==M1_Position)   //当前角度等于指令角度
  {
   BUSY_Mark1=0x00;
   TO1_Valu=0;
   TIM_SetCompare1(TIM3,PTO1_Valu);

  }
/*步进电机二控制程序*/
/*匀速运动*/  //当前角度小于指令角度
if(M2_Position_N<M2_Position)
  {
   BUSY_Mark2=0xf0;
   TO2_Valu=1000-1;
   TIM_SetCompare2(TIM3,PTO2_Valu);
   GPIO_SetBits(GPIOB , GPIO_Pin_4);
   GPIO_SetBits(GPIOB , GPIO_Pin_5);
   M2_Position_N++;
  }
if(M2_Position_N>M2_Position)   //当前角度大于指令角度
  {
   BUSY_Mark2=0xf0;
   TO2_Valu=1000-1;
   TIM_SetCompare2(TIM3,PTO2_Valu);
   GPIO_ResetBits(GPIOB , GPIO_Pin_4);
   GPIO_ResetBits(GPIOB , GPIO_Pin_5);
   M2_Position_N--;
  }
if(M2_Position_N==M2_Position)   //当前角度等于指令角度
  {
   BUSY_Mark2=0x00;
   TO2_Valu=0;
   TIM_SetCompare2(TIM3,PTO2_Valu);

  }
/*步进电机三控制程序*/
/*匀速运动*/   //当前角度小于指令角度
if(M3_Position_N<M3_Position)
  {
     BUSY_Mark3=0xf0;
PTO3_Valu=1000-1;
     TIM_SetCompare3(TIM3,PTO3_Valu);
GPIO_SetBits(GPIOB , GPIO_Pin_10);
     GPIO_ResetBits(GPIOB , GPIO_Pin_11);
M3_Position_N++;
  }
if(M3_Position_N>M3_Position) //当前角度大于指令角度
  {
    BUSY_Mark3=0xf0;
PTO3_Valu=1000-1;
    TIM_SetCompare3(TIM3,PTO3_Valu);
    GPIO_ResetBits(GPIOB , GPIO_Pin_10);
    GPIO_SetBits(GPIOB , GPIO_Pin_11);
M3_Position_N--;
  }
if(M3_Position_N==M3_Position) //当前角度等于指令角度
  {
   BUSY_Mark3=0x00;
   TO3_Valu=0;
   TIM_SetCompare3(TIM3,PTO3_Valu);

  }
}  

else
{
if((M4_Position+700)>WM3_Valu)  //舵机1正转
  {
   BUSY_Mark4=0xf0;

   WM3_Valu=M4_Position+700;
   TIM_SetCompare3(TIM4,PWM3_Valu);
 
  }

if((M4_Position+700)<WM3_Valu)  //舵机1反转
 {
  BUSY_Mark4=0xf0;
  PWM3_Valu=M4_Position+700;
  TIM_SetCompare3(TIM4,PWM3_Valu);
 
  }

if((M4_Position+700)==PWM3_Valu)  //舵机1停转
 {
  BUSY_Mark4=0x00;
STEPMOTOR1_Mark=0X00;
  TIM_SetCompare3(TIM4,PWM3_Valu);

 
 }
 Delay(1000000);

if((M5_Position+700)>PWM4_Valu) //舵机2正转
  {
   BUSY_Mark5=0xf0;
   PWM4_Valu=M5_Position+700;
   TIM_SetCompare4(TIM4,PWM4_Valu);
  }
if((M5_Position+700)<PWM4_Valu)
  {                  //舵机2反转
   BUSY_Mark5=0xf0;
   PWM4_Valu=M5_Position+700;
   TIM_SetCompare4(TIM4,PWM4_Valu);
  }

if((M5_Position+700)==PWM4_Valu)  //舵机2停转
  {
   BUSY_Mark5=0x00;
STEPMOTOR2_Mark=0X00;
   TIM_SetCompare4(TIM4,PWM4_Valu);
  }

}




if((BUSY_Mark1==0x00)&&(BUSY_Mark2==0x00)&&(BUSY_Mark3==0x00)&&(BUSY_Mark4==0x00)&&(BUSY_Mark5==0x00)) //指令动作执行完毕,发送完成标志
{

 STEP_NUM++;
 USART_SendData(USART1 , STEP_NUM);
 while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
 if(STEP_NUM==0x10)
 {
 USART_SendData(USART1 , READY_Mark);
 while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  Receive_Mark=0x00;
 }
我的想法是让舵机先于步进电机完成动作,并且延时一段时间,但是实际测试结果是只有一开始全都不动,延时一段时间之后舵机电机开始运动,但是后续延时全都无效,因为我把延时的时间弄的很夸张,所以可以看到延时根本没起作用,求高手指点一下    先行谢过了

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-12-11
在线时间
2 小时
发表于 2015-12-13 19:17:16 | 显示全部楼层
你的延时使用滴答的吗?我最近用滴答产生精确延时,发现并很不准。 
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-26
在线时间
0 小时
 楼主| 发表于 2015-12-13 19:18:37 | 显示全部楼层
回复【2楼】kai20151211:
---------------------------------
我就照搬以前单片机的延时方法做的,确实非常不准
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-12-11
在线时间
2 小时
发表于 2015-12-13 19:30:41 | 显示全部楼层
回复【3楼】暴风雪:
---------------------------------
51?还是32
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-26
在线时间
0 小时
 楼主| 发表于 2015-12-13 22:07:06 | 显示全部楼层
回复【4楼】kai20151211:
---------------------------------
这是32的
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-12-14 23:23:49 | 显示全部楼层
帮顶....
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-26
在线时间
0 小时
 楼主| 发表于 2015-12-15 09:07:37 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原子哥能指点一下嘛。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 07:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表