OpenEdv-开源电子网

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

STM32F10x控制步进电机程序,有一点疑问请教。附件有完整代码

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2015-10-23
在线时间
2 小时
发表于 2016-4-5 15:53:54 | 显示全部楼层 |阅读模式
10金钱
完整代码请下载附件。

问题描述:
      在stm32f10x_it.c中有这样一段程序(如下TIM1的中断服务函数),意思就是根据各通道比较值发生中断,然后在中断服务函数里调用电机驱动程序。如:MotorXDriveInTimer();
[mw_shl_code=c,true]void TIM1_CC_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);

    //100us
    //GPIO_WriteBit(GPIOC, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6)));
    //LED_FLASH(1000);   
      
    capture = TIM_GetCapture1(TIM1);
    TIM_SetCompare1(TIM1, capture + TIM1CCR1_Val);
  }
  else if (TIM_GetITStatus(TIM1, TIM_IT_CC2) != RESET)
  {
    TIM_ClearITPendingBit(TIM1, TIM_IT_CC2);

    /* Pin PC.07 toggling with frequency = 109.8 Hz */
    //GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7)));
      
    capture = TIM_GetCapture2(TIM1);
    TIM_SetCompare2(TIM1, capture + TIM1CCR2_Val);
  }
  else if (TIM_GetITStatus(TIM1, TIM_IT_CC3) != RESET)
  {
    TIM_ClearITPendingBit(TIM1, TIM_IT_CC3);

    //X-------------------------------------------------
      
      MotorXDriveInTimer();   //IN 10us/140us
      //LED_FLASH(1);
      
    capture = TIM_GetCapture3(TIM1);
    TIM_SetCompare3(TIM1, capture + TIM1CCR3_Val);
  }
  else
  {
    TIM_ClearITPendingBit(TIM1, TIM_IT_CC4);

    //Y-------------------------------------------------
      MotorYDriveInTimer();
      
    capture = TIM_GetCapture4(TIM1);
    TIM_SetCompare4(TIM1, capture + TIM1CCR4_Val);
  }
}[/mw_shl_code]

在MotorXDriveInTimer(); 中有三个函数,如下。
[mw_shl_code=c,true]void MotorXDriveInTimer(void)
{
    Motor1PointerControl();
    Motor1DynamicPostionGap();
    Motor1PostionControlSpeed();
}[/mw_shl_code]

在第一个函数Motor1PointerControl();中有一个用TIM2的四个通道输出PWM波的定义,不知道这四个通道是干嘛的?求指教。程序如下:
[mw_shl_code=c,true]static void Motor1PointerControl(void)        //100us*32 == 3.2ms     LOOP in Time0
{
        static u16 iStop = 0;

        //----------------------------------------------------------------------DmxFinedataUser
    if ((Motor1_postion_Current == Motor1_postion_user)&&(!MotorXSpeedPos))//&&(DmxFinedataUser==CounterFinedataCurrent))
    {
        Motor1_user_postion_gap    = 0;
        Motor1_dynamic_postion_gap = 0;

        LineFlag = 2;//YES;         //1 ¼óËù  0 ¼õËù  2 ÔèËù (í£Ö1)

        //StopFlag = 1;        
        
        //------------------------------------------------------------      
        if (iStop > 100) //655us/2*500
        {
            TIM2->CCR1 =          (SinData[MotorPositionPointer])>>2;
            TIM2->CCR2 = (CyclePWM-SinData[MotorPositionPointer])>>2;
            TIM2->CCR3 =          (CosData[MotorPositionPointer])>>2;
            TIM2->CCR4 = (CyclePWM-CosData[MotorPositionPointer])>>2;
            //LED_FLASH(1);
        }
        else
        {
            iStop++;
        }
        //----------------STOP AND AUTO TURN BACK---------------------
                        //Motor1_StopAutoBACK();
        //------------------------------------------------------------
    }
    else   //---(Motor1_postion_Current != Motor1_postion_user)---
    {
        //Motor1_Arrive_Flag = 0;   //μç»úí£Ö1 óû§é趨λÖÃÎ′μ½′ï ±ê¼Ç
                //------------------------------------------------------------
      iStop = 0;  
      //StopFlag = 0;  
        
          TIM2->CCR1 =          SinData[MotorPositionPointer];
      TIM2->CCR2 = CyclePWM-SinData[MotorPositionPointer];
      TIM2->CCR3 =          CosData[MotorPositionPointer];
      TIM2->CCR4 = CyclePWM-CosData[MotorPositionPointer];


                //---------Õy·′×a¿ØÖÆ-----------------------------------------
        if (Motor1_dir == 1)            //óû§óû¿ØÖÆ·½Ïò ÎaÕyÏòê±  
            Motor1_dir_Current     = 1;
        else                           //óû§óû¿ØÖÆ·½Ïò Îa·′Ïòê±
            Motor1_dir_Current     = 0;
                //------------------------------------------------------------
        
      if (Motor1_dir_Current == YES)   //¿ØÖÆ2½½øμç»ú ÕyÏòDy×a
      {
          //2»¼óÔòí£Ö1×a¶ˉ Ëø¶¨×′ì¬
           
            MotorPositionPointer += 8;
            CounterMotorXStepPostionCurrent += 1;

          //--------------------------------------------------
         
                  if (MotorPositionPointer >= 512)  MotorPositionPointer = 0;
     }
     else                //¿ØÖÆ2½½øμç»ú ·′ÏòDy×a
     {                          
       
            MotorPositionPointer -= 8;
            CounterMotorXStepPostionCurrent -= 1;
          //--------------------------------------------------
          if (MotorPositionPointer <= 0)  MotorPositionPointer = 512;
     }
  }

//---------------------------------------------------------------------------------------------------------------
        Motor1_postion_Current = CounterMotorXStepPostionCurrent;
    //μ±&#199;°×′ì&#172;&#213;ì2a  2¢′&#230;è&#235;×′ì&#172;&#188;&#196;′&#230;&#198;÷ ′&#230;è&#235;μ±&#199;°×′ì&#172;            
//---------------------------------------------------------------------------------------------------------------
}[/mw_shl_code]

代码较多,附件会上传完整工程文件,本人是学生,在自学STM32控制三轴步进电机,现在很迷惑,纠结了很久了,还望大神指点一下。
具体问题我再描述一下:
1. 我没看到有引脚复用的定义,请问控制步进电机的脉冲输出在哪里?应该是TIM1输出脉冲控制电机吧,但是输出到哪里了呢?
2. TIM2的四个通道输出PWM波是干嘛的?为什么要四个通道输出?


这个程序也是在本论坛里下载的,但是我看的不是太懂,可能大神们觉得简单,但是作为新人学起来还是有点吃力,虚心求教,望大神指教!
感谢原子哥的open平台!

正确版-HY-MOTOR-Basic-1.00.zip

7.17 MB, 下载次数: 579

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

使用道具 举报

5

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2015-12-26
在线时间
54 小时
发表于 2016-4-5 16:02:11 | 显示全部楼层
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2015-10-23
在线时间
2 小时
 楼主| 发表于 2016-4-5 16:29:20 | 显示全部楼层
zhangyimj007 发表于 2016-4-5 16:02
输出当然是到IO口了

肯定是IO口了。。
我的迷惑是,究竟控制电机的脉冲是由TIM1还是TIM2产生?
如果是TIM1,在代码里TIM1通道3对应的引脚是PA10,PA10是用来串口通信的。
TIM2是产生四路PWM波,如果是TIM2的脉冲驱动电机,四个通道怎么驱动电机的?
回复

使用道具 举报

29

主题

492

帖子

0

精华

高级会员

Rank: 4

积分
811
金钱
811
注册时间
2016-4-7
在线时间
123 小时
发表于 2016-4-7 17:13:24 | 显示全部楼层
先确定方向,给步进驱动DIR给高或者低电平,使能ON,对速度有要求吗?没有就随便选个定时器好了,在中断里翻转CLK电平,给步进驱动器提供CLK,给CLK脉冲,步进就转了,先转起来,后面的速度你再调整么
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-11 14:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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