搜索
bottom↓
回复: 2

步进电机程序

[复制链接]

出0入0汤圆

发表于 2011-3-4 22:12:27 | 显示全部楼层 |阅读模式
请帮忙看下自己写的一部分步进程序,已实验过能工作。
请问这样改变CCR1的值行吗,有更好的方法吗
void TIM3_IRQHandler(void)
{
   u16 temp;
   static u16 x_step,counter;

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

               *X_EN=0;//开X驱动器       
                if(xup_step==0)                  //加速段结束
                {
                   if(xhigh_step==0)          //高速段结束
                   {
                          if(xdown_step==0) //减速段结束
                          {
                             TIM3->CR1&=0xfffe;//关定时器和中断
                             TIM3->DIER&=0xfffd;
                             *X_EN=1; //关X驱动器
                             *X_CLK=1;
                                x_step=0;
                          }
                          else
                          {
                             counter=1000000/(START_FRE+(UPDOWN_FRE*xdown_step));//减速段,调整脉冲频率
                             if((TIM3->CCR1+counter)>0xffff)
                             {
                                 temp=0xffff-TIM3->CCR1;
                                 TIM3->CCR1=counter-temp;
                              }
                             else
                             {
                                 TIM3->CCR1+=counter;       
                             }                                                          
                            *X_CLK=~*X_CLK;    //步进脉冲改变状态
                         if(*X_CLK)
                         {
                            x_step++;          //步数加一
                            xdown_step--;
                         }                             
                          }
                   }
                   else
                   {
                      if((TIM3->CCR1+counter)>0xffff) //高速段,调整脉冲频率
                          {
                             temp=0xffff-TIM3->CCR1;
                             TIM3->CCR1=counter-temp;
                          }
                          else
                          {
                             TIM3->CCR1+=counter;       
                          }                                 
                          *X_CLK=~*X_CLK;    //步进脉冲改变状态
                      if(*X_CLK)
                      {
                         x_step++;           //步数加一
                         xhigh_step--;
                      }                          
                   }
                }
                else
            {
                   counter=1000000/(START_FRE+(UPDOWN_FRE*x_step));//加速段,调整脉冲频率
                   if((TIM3->CCR1+counter)>0xffff)
                   {
                          temp=0xffff-TIM3->CCR1;
                          TIM3->CCR1=counter-temp;
                   }
                   else
                   {
                      TIM3->CCR1+=counter;       
                   }          
                   *X_CLK=~*X_CLK;   //步进脉冲改变状态
                   if(*X_CLK)
                   {
                      x_step++;           //步数加一
                      xup_step--;
                   }
                }                    
   }
}
/**************************TIM3配置*********************************/
void TIM3_Configuration(void)
{
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;                           //基本结构体变量定义   
   TIM_OCInitTypeDef  TIM_OCInitStructure;                     //输出结构体变量定义
      
   TIM_DeInit(TIM3);

   TIM_TimeBaseStructure.TIM_Prescaler = 35;                                   //TIM基本初始化
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseStructure.TIM_Period =65535;
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

   TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
     
   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;                     //TIM输出通道初始化
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;            
   TIM_OCInitStructure.TIM_Pulse =65535;
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      
  
   TIM_OC1Init(TIM3,&TIM_OCInitStructure);
   TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);                    //开定时器中断
   
   TIM_Cmd(TIM3,ENABLE);
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2011-3-5 08:01:39 | 显示全部楼层
STM32 基本定时器

/*******************************************************************************
* Function Name  : TIM2_IRQHandler
* Description    : This function handles TIM2 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void TIM2_IRQHandler(void)
{                  
         /* 方法1:
         // Clear TIM2 update interrupt
         TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

         TIM_SetAutoreload(TIM2, Motor2Tcnt1Val);           //TIM2->ARR = 1000 ;        // T1Tcnt1Val 1000
         
         Motor2DriveInTimer();         //Motor-Driver       
         */

         static u16 capture = 0;

         //----------------TIM_IT_CC1---------------------------------------------
         if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)   //1ms
                 {
            // Clear TIM2 Capture Compare1 interrupt pending bit
            TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);                                                               
                Motor1DriveInTimer();         //Motor-Driver
                capture = TIM_GetCapture1(TIM2);
        TIM_SetCompare1(TIM2, capture + Motor1Tcnt1Val);
                }

         //----------------TIM_IT_CC2---------------------------------------------
          else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
          {
            // Clear TIM2 Capture Compare2 interrupt pending bit
            TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
                Motor2DriveInTimer();         //Motor-Driver
                capture = TIM_GetCapture2(TIM2);
        TIM_SetCompare2(TIM2, capture + Motor2Tcnt1Val);
          }

        //----------------TIM_IT_CC3---------------------------------------------
          else if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
          {
            // Clear TIM2 Capture Compare3 interrupt pending bit
            TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
                Motor3DriveInTimer();         //Motor-Driver
            capture = TIM_GetCapture3(TIM2);
        TIM_SetCompare3(TIM2, capture + Motor3Tcnt1Val);
          }

        //----------------TIM_IT_CC4---------------------------------------------
          else
          {
            // Clear TIM2 Capture Compare4 interrupt pending bit
            TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
                Motor4DriveInTimer();         //Motor-Driver
                capture = TIM_GetCapture4(TIM2);
        TIM_SetCompare4(TIM2, capture + Motor4Tcnt1Val);
          }
//-------------------------------------------------------------------------------            
}

出0入0汤圆

 楼主| 发表于 2011-3-6 22:17:56 | 显示全部楼层
对不起没看懂
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 01:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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