huangxiaolpbany 发表于 2017-9-5 14:48:20

求助:步进电机使用加减速时电机旋转角度大于设置数值

使用场合:步进电机带动旋转部件,另外旋转带有一个编码器,用以检测实际旋转位置
配置:雷赛步进驱动+57步进电机+减速机(减速比1156:225)+齿轮传动(减速机齿轮25,旋转体齿轮90)/编码器齿轮16
按照旋转部件最大速度30rpm,1s加速时间。减速其实速度为0,每10ms更新一次脉冲频率,得出的计算表格如附件。
计算想法:
1、按照旋转的加速度计算每增加10ms,旋转部件旋转到多少圈(0.5*a*t*t),然后按传动比计算电机旋转旋转多少圈,然后按照电机3200脉冲一圈,计算需要多少个脉冲
   比如:旋转部件30rpm=0.5rps,a=v/t=0.5r/s2
            200ms时,旋转部件应旋转圈数:0.5*0.5*0.2*0.2=0.01r,按传动比计算电机旋转0.185r,按3200脉冲一圈计算,电机需运行592(计算591.87)个脉冲
   由此加速出加减速的脉冲数量和对应OCR1A值
   uint pulsetotal=
   {
   1,6,13,24,37,53,73,95,120,148,
   179,213,250,290,333,379,428,479,534,592,
   653,716,783,852,925,1000,1079,1160,1244,1332,
   1422,1515,1611,1711,1813,1918,2026,2137,2251,2367,
   2487,2610,2736,2865,2996,3131,3269,3409,3553,3699,
   3849,4001,4156,4315,4476,4640,4807,4978,5151,5327,
   5506,5688,5873,6061,6252,6445,6642,6842,7045,7250,
   7459,7671,7885,8103,8323,8547,8773,9002,9235,9470,
   9708,9949,10194,10441,10691,10944,11200,11459,11721,11985,
   12253,12524,12798,13074,13354,13637,13922,14211,14502,14797
   };
   uint ocr1a=
   {
   12456,4151,2490,1779,1383,1131,957,829,732,655,
   592,541,497,460,429,401,376,355,336,318,
   303,289,276,264,253,243,234,225,218,210,
   203,197,191,185,180,174,170,165,161,157,
   153,149,146,142,139,136,133,130,127,125,
   122,120,118,115,113,111,109,107,105,104,
   102,100,99,97,96,94,93,91,90,89,
   87,86,85,84,83,81,80,79,78,77,
   76,75,74,74,73,72,71,70,69,69,
   68,67,66,66,65,64,64,63,62,62
   };
   

2、按以上计算结果,加速到最大速度,电机需要脉冲为14797(计算14796.8)个脉冲

3、如果实际要求旋转脉冲超过14797*2时,则加速到最大速度,然后减速

4、如果脉冲少于14797*2时,则判断需要加速到哪个速度等级(共100级)。
   比如脉冲数量为1284,则电机加速运行592脉冲,减速运行592脉冲,匀速运行100脉冲

    3-4步代码如下
      rotpulnum为总脉冲数,accpulse为加速脉冲,conpulse为匀速脉冲,decpulse为减速脉冲,step_max标记为加速到哪一级,step为当前加减速等级:
      //Get Step
      pulnum=rotpulnum;
      pulnumtemp=rotpulnum;
      pulnumtemp>>=1;
      for(i=0;i<100;i++)
      {
         if(pulnumtemp>=pulsetotal)
         {
            step_max=i;
         }
      }
      
      //Get pulse1,pulse2
      accpulse=pulsetotal;
      decpulse=accpulse;
      conpulse=pulnum-accpulse-decpulse;
      
      //Set original
      pulsecounter=0;
      step=0;

5、开启TIMER1的匹配中断,按步进电机实际运行脉冲数进行累积,并判断下一步如何运行
   思路为:
   加速时:如果总脉冲数小于加速脉冲,则为加速;如果超过,则转为匀速
               如果脉冲数达到下一级速度的脉冲值,则速度增加
   匀速时:如果没有达到减速脉冲值,不操作,达到后转为减速
   减速时:如果剩余脉冲小于减速脉冲,则为减速速;
               如果剩余脉冲数达到下一级速度的脉冲值,则速度降低
   停止:   剩余脉冲数为0,则停止
   
   void Tim1CompA(void)
   {
      //Step Counter
      pulsecounter++;
      pulseremain=pulnum-pulsecounter;
   
      //acc-mode
      if(pulsecounter<=accpulse)
      {
         if((pulsecounter==pulsetotal)&&(step<step_max))
             {
                step++;
               OCR1A=ocr1a;
             }
      }
      //con speed mode
      else if((pulsecounter>accpulse)&&(pulsecounter<(pulnum-decpulse)))
      {
      
      }
      //dec speed mode
      else if((pulseremain<=decpulse)&&(pulseremain!=0))
      {
         if((pulseremain==pulsetotal)&&(step<=step_max))
         {
            step--;
             OCR1A=ocr1a;               
         }
      }
      //stop
      else if(pulseremain==0)
      {
         TCCR1A=0x00;
         TCCR1B=0x00;
         TCCR1C=0x00;
         OCR1A=0x00;
         TIMSK&=~BIT(4);
      }

   }
   
6、问题
   测试运行32000脉冲,电机应旋转10圈。实测会达到10圈多一点,多次循环运行可以看出来
   专门将脉冲计数器pulsecounter的最终值显示出来看了一下,确实达到32000。

   故求助!






活到老学到老 发表于 2017-9-5 15:22:34

那不是计数器有问题吗

huangxiaolpbany 发表于 2017-9-6 08:38:25

计数器记录数值和要求数值一致的

huangxiaolpbany 发表于 2018-5-23 17:25:15

自己挖自己的坟。
今天尝试了一下,把每一个速度上的脉冲数设置为偶数,不出现奇数,解决了问题。不知道为什么
页: [1]
查看完整版本: 求助:步进电机使用加减速时电机旋转角度大于设置数值