STM32F103C8T6控制步进电机:实现频率、占空比及脉冲个数的控制

STM32F1控制步进电机,实现频率,占空比,脉冲个数控制

  • 简介
  • 配置步骤
  • 配置PWM包括两个步骤,时钟and引脚
  • 配置计数器,共两步;包括时基以及优先级配置
  • 写中断函数,停止定时器和计数器,并清空标志位
  • 主要代码
  • main.c
  • pwm_output.c(部分)
  • 中断函数
  • pwm_output.h(部分)
  • 简介

  • 控制对象:安川步进电机

  • 控制器: STM32F103C8T6最小系统板

  • 功能:

     1、输出PWM波驱动步进电机,PWM可调频、占空比;
     2、在输出指定脉冲数目后进入中断,PWM停止输出。
    
  • 实现方式:

     采用主从定时器模式,tim1作为主定时器,tim2作为从定时器(计数器)。
    
  • 配置步骤

    1. 配置PWM(主定时器)
    2. 配置CNT(从定时器)
    3. 写中断(停止主、从定时器)

    配置PWM包括两个步骤,时钟and引脚

    1. 配置引脚:

    2. 配置PWM
      初始化时基(timebase)
      初始化时基

      初始化比较结构体
      初始化比较结构体

    3. 将TIM1定时器配置为主定时器并使能定时器配置为主定时器

    配置计数器,共两步;包括时基以及优先级配置

    1. 配置时基并将定时器TIM2作为从定时器
      需要使能定时器中断
    	TIM_SelectInputTrigger( CNT_TIMx, TIM_TS_ITR0);
    	TIM_SelectSlaveMode( CNT_TIMx, TIM_SlaveMode_External1);
    	//配置从定时器
    	TIM_ITConfig( CNT_TIMx, TIM_IT_Update, DISABLE);
    	//使能定时器中断
    
    1. 配置优先级

    写中断函数,停止定时器和计数器,并清空标志位

    主要代码

    main.c

    
    #include "stm32f10x.h"
    #include "pwm_output.h"
    
    //宏定义
    #define veloc_1 1
    #define DTime_1 1000 //ms
    #define veloc_2 1
    #define DTime_2 1000 //ms
    #define veloc_3 1
    #define DTime_3 1000 //ms
    #define veloc_4 1
    #define DTime_4 1000 //ms
    #define veloc_5 1
    #define DTime_5 1000 //ms
    #define veloc_6 1
    #define DTime_6 1000 //ms
    
    int main(void)
    {
      
    	SystemInit(); //ÅäÖÃϵͳʱÖÓΪ72M   
    	//划分位六个阶段,可输出不同频率、个数的PWM波
    	//每个阶段之间的延时时间也可分别设置
    	//占空比的设定在pwm_output.c文件,所以每个阶段的占空比恒定
    	//函数的参数分别为频率,脉冲个数以及延时时间
    	PWM_outset(veloc_1,100,DTime_1);
    	PWM_outset(veloc_2,100,DTime_2);
    	PWM_outset(veloc_3,100,DTime_3);
    	PWM_outset(veloc_4,100,DTime_4);
    	PWM_outset(veloc_5,100,DTime_5);
    	PWM_outset(veloc_6,100,DTime_6);
    
    }
    
    
    
    

    pwm_output.c(部分)

    1. 主要是进行初始化以及主从定时器配置
    #include "pwm_output.h"
    #include "misc.h"
    //配置PWM_out函数
    void TIM1_GPIO_Config(void) 
    {
      GPIO_InitTypeDef GPIO_InitStructure;
    
      RCC_APB2PeriphClockCmd(PWM_TIM_CLK, ENABLE);
      RCC_APB2PeriphClockCmd(PWM_TIM_GPIO_CLK, ENABLE);
    
      GPIO_InitStructure.GPIO_Pin =  PWM_TIM_PIN;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	
      GPIO_Init(PWM_TIM_GPIO_PORT, &GPIO_InitStructure);
    }
    void TIM1_Mode_Config(uint16_t TIM1_Prescaler, uint16_t TIM_Period, uint16_t CCR_A)
    {
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	TIM_OCInitTypeDef  TIM_OCInitStructure;
    	
     /* Time base configuration */
      TIM_TimeBaseStructure.TIM_Period = TIM_Period-1;
      TIM_TimeBaseStructure.TIM_Prescaler = TIM1_Prescaler-1;
      TIM_TimeBaseStructure.TIM_ClockDivision = 0;
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    	TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
      TIM_TimeBaseInit(PWM_TIMx, &TIM_TimeBaseStructure);
     
      /* PWM1 Mode configuration: Channel1 */
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
      TIM_OCInitStructure.TIM_Pulse = CCR_A;
      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
      TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
    
      TIM_OC1Init(PWM_TIMx, &TIM_OCInitStructure);
    	
    	TIM_SelectMasterSlaveMode( TIM1, TIM_MasterSlaveMode_Enable);
    	TIM_SelectOutputTrigger( TIM1, TIM_TRGOSource_Update);
      TIM_OC1PreloadConfig(PWM_TIMx, TIM_OCPreload_Enable);
    	
      TIM_ARRPreloadConfig(PWM_TIMx, ENABLE);
    
      /* TIM1 enable counter */
      TIM_Cmd(PWM_TIMx, ENABLE);
      TIM_CtrlPWMOutputs(PWM_TIMx, ENABLE);	
    }
    
    void TIM1_PWM_Init(uint16_t TIM1_Prescaler, uint16_t TIM_Period, uint16_t CCR_A)
    {
    	TIM1_GPIO_Config();
    	TIM1_Mode_Config(TIM1_Prescaler,TIM_Period,CCR_A);
    }
    //配置定时器
    void TIM3_GPIO_Config(u32 PulseNum_A)
    {
    	TIM_TimeBaseInitTypeDef	TIM_TimeBaseStructure;
    	NVIC_InitTypeDef	NVIC_InitStructure;
    	
    	RCC_APB1PeriphClockCmd( CNT_TIM_CLK, ENABLE);
    	
    	TIM_TimeBaseStructure.TIM_Period = PulseNum_A;
    	TIM_TimeBaseStructure.TIM_Prescaler = 1;
    	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    	TIM_TimeBaseInit( CNT_TIMx, &TIM_TimeBaseStructure);
    	
    	TIM_SelectInputTrigger( CNT_TIMx, TIM_TS_ITR0);
    	TIM_SelectSlaveMode( CNT_TIMx, TIM_SlaveMode_External1);
    	TIM_ITConfig( CNT_TIMx, TIM_IT_Update, DISABLE);
    	
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    	NVIC_InitStructure.NVIC_IRQChannel = CNT_TIM_IRQn;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_Init( &NVIC_InitStructure);
    	TIM_Cmd( TIM2, ENABLE);
    }
    
    //对应主函数
    void PWM_outset(uint16_t p_freq ,uint32_t p_nums,int d_time)
    {
    	//通过设定TIM2_PWM_Init后两个参数设置占空比
    	//第一个参数控制定时器周期
    	//第二个参数控制脉冲宽度
    	//两者做比值为占空比
    	TIM2_PWM_Init(p_freq,50000,25000); //TIM1 
    	TIM_Cmd( TIM1, ENABLE);
    	TIM_CtrlPWMOutputs( TIM1, ENABLE);
    	
    	TIM3_GPIO_Config(p_nums);
    	TIM_ClearITPendingBit( TIM2, TIM_IT_Update);
    	TIM_ITConfig( TIM2, TIM_IT_Update, ENABLE);
    	DelayNmS(d_time);
    }
    }
    
    
    

    中断函数

    void TIM2_IRQHandler(void)
    {
    	if (TIM_GetITStatus( TIM2, TIM_IT_Update) != RESET)
    	{
    		TIM_CtrlPWMOutputs( TIM1, DISABLE);
    		TIM_Cmd( TIM1, DISABLE);
    		TIM_Cmd( TIM2, DISABLE);
    		TIM_ITConfig( TIM2, TIM_IT_Update, DISABLE);
    		TIM_ClearITPendingBit( TIM2, TIM_IT_Update);
    	}
    }
    

    pwm_output.h(部分)

    1. 主要是一些宏定义
    #define PWM_TIMx                  TIM1
    #define PWM_TIM_CLK               RCC_APB2Periph_TIM1     
    #define PWM_TIM_GPIO_CLK          RCC_APB2Periph_GPIOA
    #define PWM_TIM_PIN               GPIO_Pin_8
    #define PWM_TIM_GPIO_PORT         GPIOA
    
    #define CNT_TIMx                  TIM2
    #define CNT_TIM_CLK               RCC_APB1Periph_TIM2
    #define CNT_TIM_GPIO_CLK          RCC_APB2Periph_GPIOA
    #define CNT_TIM_PIN               GPIO_Pin_6
    #define CNT_TIM_GPIO_PORT         GPIOA
    #define CNT_TIM_AF                GPIO_AF_TIM2
    #define CNT_TIM_IRQn              TIM2_IRQn
    #define CNT_TIM_Priority          3
    #define CNT_TIM_IRQHandler        TIM2_IRQHandler   
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32F103C8T6控制步进电机:实现频率、占空比及脉冲个数的控制

    发表评论