lqhm0927 发表于 2011-3-6 22:22:29

再发一个步进电机程序

这次将TIM3 OC1定义为翻转模式,IO口电平不用程序干预。但是CCR1的更新仍未有更好的方法。
void TIM3_IRQHandler(void)
{
   u16 temp;      
   static u8 j;
   static u16 x_step,counter;          

   if(TIM3->SR&=0x0002)       
   {
      TIM3->SR&=0xfffd;        //清中断标志

          *X_EN=0;//开X驱动器                    
          j++;                //J为中断次数计数器,每2次中断为一个周期
      if(j==2)
          {
             j=0;
             if(jstop==TRUE) //判断是否急停,为1减速停机
             {
                  xup_step=0;
                  xhigh_step=0;
                  x_exti_trigger=FALSE;
               }
               if(xup_step==0)                  //加速段结束
               {
                  if(xhigh_step==0)          //高速段结束
                  {
                           if(xdown_step!=0) //减速段结束
                           {                          
                              xdown_step--;       //降速段减一
                              counter=1000000/(START_FRE+(UPDOWN_FRE*xdown_step));//减速段,调整脉冲频率                             
                                  x_step++;          //总步数加一
                           }
                        }
                        else
                        {       
                           xhigh_step--;   //高速段减一                          
                           x_step++;           //总步数加一                              
                        }
               }
               else
               {
                  x_step++;           //总步数加一
                  counter=1000000/(START_FRE+(UPDOWN_FRE*x_step));//加速段,调整脉冲频率                     
                  xup_step--;           //升速段减一
               }               
               if(xup_step==0)   //判断是否结束,脉冲数是否已为0
               {
                  if(xhigh_step==0)          
                  {
                           if(xdown_step==0)
                           {                          
                        TIM3->CR1&=0xfffe;//关定时器和中断
                        TIM3->DIER&=0xfffd;
                        *X_EN=1; //关X驱动器
                        x_step=0;
                        TIM2->DIER|=0x0010;
                        if(x_exti_trigger==TRUE)//因主轴关闭不能产生线中断,因此
                        {                                               //用软件产生线中断,读取下一个步进值
                           x_exti_trigger=FALSE;
                           TIM2->EGR|=0x0010;       //软中断
                        }
                           }
                        }                  
               }
          }
          if((TIM3->CCR1+counter)>0xffff) //更新CCR寄存器值
          {
             temp=0xffff-TIM3->CCR1;
             TIM3->CCR1=counter-temp;
          }
          else
          {
             TIM3->CCR1+=counter;       
          }                                                               
   }
}

li0713 发表于 2011-3-11 08:34:39

先收藏

kevinvan 发表于 2011-3-11 14:16:17

mark

weiweisun 发表于 2011-12-9 22:29:36

回复【楼主位】lqhm0927
-----------------------------------------------------------------------

mark

haoye 发表于 2012-8-31 15:39:23

顶一下,刚刚开始学习。。。

ZYBing 发表于 2014-8-23 15:09:51

谢谢分享!

opiviqo 发表于 2014-8-23 15:22:13

先收藏!~~

ripple78 发表于 2014-11-25 17:06:11

收藏!~~
页: [1]
查看完整版本: 再发一个步进电机程序