STM32
直播中

h1654155275.5748

7年用户 877经验值
私信 关注
[问答]

步进电机的编程思路及步骤

步进电机的编程思路及步骤

回帖(1)

李兆峰

2021-12-22 10:56:18
编程思路及步骤

以输出一路pwm为例:


  • 初始化gpio(以下两个io口控制驱动器的使能端和方向端):


void STEP_MOTO_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
          
        /*开启GPIOB和GPIOC的外设时钟*/
        RCC_APB2PeriphClockCmd(Moto_RCC1 | Moto_RCC2, ENABLE);
               
        /*选择要控制的GPIOB引脚*/                                                                                                                          
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;       


        /*设置引脚模式为通用推挽输出*/
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   


        /*设置引脚速率为50MHz */   
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


        /*调用库函数,初始化GPIOB*/
          GPIO_Init(Moto_Port1, &GPIO_InitStructure);                  


        /* 高电平        */
        GPIO_SetBits(Moto_Port1, GPIO_Pin_12 | GPIO_Pin_13);
}
2.初始化定时器以及输出pwm的io口PB9:
void TIM4_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);        //使能定时器4时钟

   //初始化TIM4
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
        TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
       
        //PWMB PB9
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);        //使能定时器4时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

   //设置该引脚为复用输出功能,输出TIM4 CH4的PWM脉冲波形        GPIOB.9
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //TIM4_CH4
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
       
        //初始化TIM4 Channel4 PWM模式         
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OCInitStructure.TIM_Pulse = 0;
        TIM_OC4Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC2
        TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR2上的预装载寄存器
        TIM_Cmd(TIM4, ENABLE);  //使能TIM4
}

  • 最后就是通过调节频率来控制步进电机的速度了:
/*具体控制电机的功能使用*/


#include "moto.h"
#include "step_moto.h"


#define  Updown_Moto_Left_UP()       {GPIO_SetBits(Moto_Port1, Updown_Moto_Left_DIR); GPIO_ResetBits(Moto_Port1, Updown_Moto_Left_ENA);}
#define  Updown_Moto_Left_DOWM()     {GPIO_ResetBits(Moto_Port1, Updown_Moto_Left_DIR); GPIO_ResetBits(Moto_Port1, Updown_Moto_Left_ENA);}
#define  Updown_Moto_Left_STOP()     {GPIO_SetBits(Moto_Port1, Updown_Moto_Left_ENA);}


#define  Updown_Moto_Right_UP()       {GPIO_SetBits(Moto_Port1, Updown_Moto_Right_DIR); GPIO_ResetBits(Moto_Port1, Updown_Moto_Right_ENA);}
#define  Updown_Moto_Right_DOWM()     {GPIO_ResetBits(Moto_Port1, Updown_Moto_Right_DIR); GPIO_ResetBits(Moto_Port1, Updown_Moto_Right_ENA);}
#define  Updown_Moto_Rightt_STOP()     {GPIO_SetBits(Moto_Port1, Updown_Moto_Right_ENA);}


#define  Moto_PWM_SET_Updown_Moto_LEFT()     {TIM_SetCompare4(TIM4,5000);}
#define  Moto_PWM_SET_Updown_Moto_RIGHT()    {TIM_SetCompare2(TIM2, 5000);}
#define  Moto_PWM_REMOVE()    {TIM_SetCompare4(TIM4, 0);TIM_SetCompare2(TIM2, 0);TIM_SetCompare3(TIM2, 0);TIM_SetCompare4(TIM2, 0);}


/*左右同步电机的运动*/
void Updown_Moto_UP(void)
{
  Updown_Moto_Left_UP();
        Updown_Moto_Right_UP();
        Moto_PWM_SET_Updown_Moto_LEFT();
        Moto_PWM_SET_Updown_Moto_RIGHT();
}


void Updown_Moto_DOWN(void)
{
  Updown_Moto_Left_DOWM();
        Updown_Moto_Right_DOWM();
        Moto_PWM_SET_Updown_Moto_LEFT();
        Moto_PWM_SET_Updown_Moto_RIGHT();
}


void Updown_Moto_STOP(void)
{
  Updown_Moto_Left_STOP();
        Updown_Moto_Rightt_STOP();
        Moto_PWM_REMOVE();
}
通过调节在下一个更新事件装入活动的自动重装载寄存器周期的值来设置步进电机的转速:
void pwm_init(void)
{
        delay_init();


        STEP_MOTO_GPIO_Init();
        TIM2_PWM_Init(15000,0);//不分频。PWM频率为7200000000/15000=4800hz    //一秒转6圈
        TIM4_PWM_Init(5625,0);//不分频。PWM频率为7200000000/5625=12800hz   //一秒转16圈


}
int main(void)
{               
     pwm_init();                               


    while(1)
         {
                 //Updown_Moto_UP();//丝杆往上
                 Updown_Moto_DOWN();//丝杆往下
                 //Updown_Moto_STOP();//丝杆停止
         }         
     return 0;
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分