STM32F103的PWM电机控制

60 篇文章 12 订阅

目录

选择TIM5CH2

1、GPIO配置输出

2、定时器配置

3、调用函数使用

初次易错点:


使用pwm输出是首先要看,那个引脚使用可以使用pwm输出。

高级控制和通用定时器通道引脚分布:

 高级定时器通用定时器
TIM1TIM8TIM2TIM5TIM3TIM4
CH1PA8/PE9PC6PA0/PA15PA0PA6/PC6/PB4PB6/PD12
CH1NPB13/PA7/PE8PA7    
CH2PA9/PE11PC7PA1/PB3PA1PA7/PC7/PB5PB7/PD13
CH2NPB14/PB0/PE10PB0    
CH3PA10/PE13PC8PA2/PB10PA2PB0/PC8PB8/PD14
CH3NPB15/PB1/PE12PB1    
CH4PA11/PE14PC9PA3/PB11PA3PB1/PC9PB9/PD15
ETRPA12/PE7PA0PA0/PA15 PD2PE0
BKINPB12/PA6/PE15PA6    

选择TIM5CH2

1、GPIO配置输出

static void TIM_GPIO_Config(void) 
{
  GPIO_InitTypeDef GPIO_InitStructure;

  // 输出比较通道1 GPIO 初始化
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

}

2、定时器配置

/************通用定时器TIM参数定义,只限TIM2、3、4、5************/
// 当使用不同的定时器的时候,对应的GPIO是不一样的,这点要注意
// 我们这里默认使用TIM5

#define            GENERAL_TIM                   TIM5
#define            GENERAL_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd
#define            GENERAL_TIM_CLK               RCC_APB1Periph_TIM5

// TIM5 输出比较通道2
#define            GENERAL_TIM_CH2_GPIO_CLK      RCC_APB2Periph_GPIOA
#define            GENERAL_TIM_CH2_PORT          GPIOA
#define            GENERAL_TIM_CH2_PIN           GPIO_Pin_1
////////////////////////////////////////



//5khz
#define            GENERAL_TIM_Period        (20-1)        //计数个数ARR
#define            GENERAL_TIM_Prescaler   (720-1)           //周期 分频数PSC
// 占空比配置
uint16_t CCR1_Val = 10;
static void TIM_Mode_Config(void)
{
      // 开启定时器时钟,即内部时钟CK_INT=72M
      GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);

      /*--------------------时基结构体初始化-------------------------*/
      /*--------------------定时器基本配置-------------------------*/
      // 配置周期,这里配置为XXK

      TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
      // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
      TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_Period;	
      // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
      TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_Prescaler;	
      // 时钟分频因子 ,配置死区时间时需要用到
      TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;		
      // 计数器计数模式,设置为向上计数
      TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;		
      // 重复计数器的值,没用到不用管
      TIM_TimeBaseStructure.TIM_RepetitionCounter=0;	
      // 初始化定时器
      TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);

      /*--------------------输出比较结构体初始化-------------------*/	
      /*--------------------PWM输出配置-------------------*/	

      TIM_OCInitTypeDef  TIM_OCInitStructure;
      // 配置为PWM模式1
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
      // 输出使能
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
      // 输出通道电平极性配置	
      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
      // 输出通道空闲电平极性配置
      TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;	
      // 输出比较通道 2
      TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
      TIM_OC2Init(GENERAL_TIM, &TIM_OCInitStructure);
      TIM_OC2PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);


      // 使能计数器
      TIM_Cmd(GENERAL_TIM, ENABLE);

      // 主输出使能,当使用的是通用定时器时,这句不需要
      //TIM_CtrlPWMOutputs(GENERAL_TIM, ENABLE);
     
        
}

3、调用函数使用

void PWM_Init(void)
{
	TIM_GPIO_Config();
	TIM_Mode_Config();
        //外面使用这个控制函数控制占空比
	//TIM_SetCompare2(GENERAL_TIM , 70);
}


void pwm_test(void)
{
  
        GPIO_ResetBits(MOTOR1EN_GPIO_PORT, MOTOR1EN_GPIO_PIN);
    	TIM_SetCompare2(GENERAL_TIM , 5);  
        Delay_s(4);
        GPIO_SetBits(MOTOR1EN_GPIO_PORT, MOTOR1EN_GPIO_PIN);         
        Delay_s(2);
        

        GPIO_ResetBits(MOTOR1EN_GPIO_PORT, MOTOR1EN_GPIO_PIN);
    	TIM_SetCompare2(GENERAL_TIM , 15);  
        Delay_s(4);
        GPIO_SetBits(MOTOR1EN_GPIO_PORT, MOTOR1EN_GPIO_PIN);         
        Delay_s(2);

}

初次易错点:

1,没有注意到相应的输出比较通道。使用的是ch2,但是函数调用的却是ch1的

TIM_SetCompare1/TIM_SetCompare2/TIM_SetCompare3/TIM_SetCompare4

TIM_OC1Init/TIM_OC2Init/TIM_OC3Init/TIM_OC4Init

TIM_OC1PreloadConfig/TIM_OC2PreloadConfig/TIM_OC3PreloadConfig/TIM_OC4PreloadConfig

2、pwm更改占空比

#define GENERAL_TIM_Period (20-1) //计数个数ARR

             // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断

#define GENERAL_TIM_Prescaler (720-1) //周期 分频数PSC

             // 驱动CNT计数器的时钟 = Fck_int/(psc+1)

TIM_Period:定时器周期,实际就是设定自动重载寄存器 ARR 的值, ARR 为要装载到实际自动重载寄存器(即影子寄存器) 的值, 可设置范围为 0 至 65535。

TIM_Pulse:比较输出脉冲宽度,实际设定比较寄存器 CCR 的值,决定脉冲宽度。可设置范围为 0 至 65535。

 

TIM_SetCompare1(TIMx,CCRx);设置pwm占空比

 

 

 

 

 

 

 

  • 34
    点赞
  • 233
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 要使用STM32F103控制电机转速,您可以使用STM32的PWM模块。下面是一些基本步骤: 1. 设置GPIO引脚,将其设置为PWM模式。 2. 初始化TIM定时器,并设置PWM模式以及占空比。 3. 将电机连接到GPIO引脚。 4. 在代码中编写控制逻辑,例如使用按键或其他传感器来控制PWM占空比,从而控制电机转速。 需要注意的是,不同电机的工作电压和额定电流不同,因此需要根据具体情况选择合适的电机驱动模块和电源模块,以保证电机的正常工作。同时,还需要注意PWM频率和占空比的设置,这些参数的不同也会影响电机的转速和运行效果。 ### 回答2: STM32F103系列是一款硬件配置强大、功能丰富的单片机,它具有多种接口和控制器,能够满足不同的应用场景需求。其中,PWM输出作为数字信号输出的一种方式,可以用来控制电机的转速。 首先,需要了解PWM的原理。PWM是脉冲宽度调制的缩写,它是一种利用短脉冲信号来模拟出稳定电压或电流的技术。在电机控制中,PWM信号的占空比(高电平时间与一个周期时间的比值)可以控制电机转速的快慢。例如,占空比50%的PWM信号,则电机实际上只有50%的时间在工作,因此转速也只有50%。 为了实现STM32F103PWM控制,需要配置硬件定时器的相关参数。例如,设置定时器计数器的时钟频率、周期、PWM占空比等。这些参数配置需要参考具体的电机规格和要求,不同规格的电机所需的PWM信号也有所不同。 常见的电机控制方案包括两种:基于模拟信号控制的模拟电机控制和基于数字信号控制的数字电机控制。对于基于数字信号的电机控制,可以使用STM32F103的定时器和PWM功能来实现。在具体的实现中,可以使用STM32CubeMX来配置相关的定时器和PWM,然后再通过编写代码来实现电机的转速控制。 在控制电机转速时,还需要注意到电机的负载情况、功率需求、保护等方面,从而实现全面的电机控制。 总之,STM32F103PWM功能可以应用在电机控制、灯光控制等多种场景中,通过合理配置和编码,可以实现精确的控制和应用。 ### 回答3: STM32F103是一种基于ARM Cortex-M3内核的微处理器,可用于开发各种应用程序,包括电机控制PWM(Pulse Width Modulation)控制是一种常见的电机控制方法,它可以通过控制电压的脉冲频率和占空比来调节电机的转速。 具体实现方法如下: 1. 确定电机的驱动方式:直流电机或交流电机。 2. 配置定时器和PWM通道:使用STM32的TIM定时器和PWM通道来控制电机转速。根据电机参数和要求设置定时器的时钟频率、分频系数和自动重装值等参数,然后在定时器的TIMx_CHy PWM输出比较匹配寄存器(CCR)中设置占空比,即可控制PWM波形的占空比。 3. 编写控制程序:通过编写控制程序来调节PWM占空比,从而控制电机转速。可以使用外部传感器或编码器来检测电机的状态和转速,并根据实时反馈信号来改变PWM占空比,从而实现电机转速的控制控制程序还可以加入保护措施,如过载保护、电机反转保护等,以确保电机的安全运行。 4. 调试与优化:在实际使用中,需要对控制程序进行调试与优化,以达到最佳的控制效果和电机运行效率。可以使用示波器和信号发生器等工具来进行调试,同时还可以通过软件和硬件优化来提高电机转速、减少功耗等。 总之,STM32F103可以通过PWM控制电机转速,其具体实现方法需要根据具体的电机参数和控制要求来确定,同时需要进行调试与优化,以达到最佳的控制效果和电机运行效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值