slamugv小车使用说明--4.电机pwm调速

电机pwm调速
1.使用hal库控制电机调速
PWM概述:
PWM俗称脉冲调制 脉冲宽度调制模式可以生成一个信号,该信号频率由 TIMx_ARR 寄存器值决定,其占空比则由 TIMx_CCRx 寄存器值决定。

1.电机pwm cube配置教程
首先确认pwm使用的定时器是哪个用的是哪个通道
我们在程序按照底盘控制引脚说明配置stm32cubemx
1.打开stm32cubemx软件,pwm是通过定时器控制
slamugv小车使用说明--4.电机pwm调速_第1张图片
根据slamugv引脚分配,TIM5 CH3 使能为PWM CH3
slamugv小车使用说明--4.电机pwm调速_第2张图片
预分频和时钟计数这个东西,下面在讨论,我们随便设置吧
然后代码生成
3. 寄存器讲解
通用定时器框图
slamugv小车使用说明--4.电机pwm调速_第3张图片
计数器寄存器(TIMx_CNT):
预分频寄存器(TIMx_PSC):
自动重装载寄存器(TIMx_ARR):

  1. 关键代码解读
    //PWM初始化
void PWM_GPIO_init(void)
{
  GPIO_InitTypeDef GPIO_Initure;
  __HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
	__HAL_RCC_GPIOE_CLK_ENABLE();           //开启GPIOE时钟
	__HAL_RCC_TIM5_CLK_ENABLE();			//使能定时器3
	__HAL_RCC_TIM9_CLK_ENABLE();			//使能定时器9
	
  GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3; //
  GPIO_Initure.Mode=GPIO_MODE_AF_PP;  //复用推挽输出
  GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
  GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
  GPIO_Initure.Alternate = GPIO_AF2_TIM3 ; //定时器复用
	HAL_GPIO_Init(GPIOA,&GPIO_Initure);
	

 
	GPIO_Initure.Pin=GPIO_PIN_5|GPIO_PIN_6; //
  GPIO_Initure.Mode=GPIO_MODE_AF_PP;  //复用推挽输出
  GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
  GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
	GPIO_Initure.Alternate = GPIO_AF3_TIM9 ; //定时器复用
	HAL_GPIO_Init(GPIOE,&GPIO_Initure);
	

}
//通用定时器5,9中断初始化
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器5,9(定时器3挂在APB1上,时钟为HCLK/2)
void Bsp_motor_pwm_init(u16 arr,u16 psc) 
{   
	  PWM_GPIO_init();
	  TIM_HandleTypeDef TIM5_Handler;      	//定时器3句柄 
	  TIM_HandleTypeDef TIM9_Handler;      	//定时器9句柄 
	  TIM_OC_InitTypeDef  TIM5_CH1Handler ;
	  TIM_OC_InitTypeDef  TIM9_CH1Handler ;
	  TIM_MasterConfigTypeDef sMasterConfig;
	
    TIM5_Handler.Instance=TIM5;          	//定时器5
    TIM5_Handler.Init.Prescaler=psc;       //定时器分频
    TIM5_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
    TIM5_Handler.Init.Period=arr;          //自动重装载值
    TIM5_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;

    HAL_TIM_PWM_Init(&TIM5_Handler);       //初始化PWM
    
    TIM5_CH1Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
    TIM5_CH1Handler.Pulse=arr/2;            //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
    TIM5_CH1Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低 
    HAL_TIM_PWM_ConfigChannel(&TIM5_Handler,&TIM5_CH1Handler,TIM_CHANNEL_3);//配置TIM5通道3
		HAL_TIM_PWM_ConfigChannel(&TIM5_Handler,&TIM5_CH1Handler,TIM_CHANNEL_4);//配置TIM5通道4
		sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
		sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
		HAL_TIMEx_MasterConfigSynchronization(&TIM5_Handler, &sMasterConfig); 
	
    HAL_TIM_PWM_Start(&TIM5_Handler,TIM_CHANNEL_3);//开启PWM通道3
	   HAL_TIM_PWM_Start(&TIM5_Handler,TIM_CHANNEL_4);//开启PWM通道4
	
	   TIM9_Handler.Instance=TIM9;          	//定时器9
    TIM9_Handler.Init.Prescaler=psc;       //定时器分频
    TIM9_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
    TIM9_Handler.Init.Period=arr;          //自动重装载值
    TIM9_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&TIM9_Handler);       //初始化PWM
    
    TIM9_CH1Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
    TIM9_CH1Handler.Pulse=arr/2;            //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
    TIM9_CH1Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低 
    HAL_TIM_PWM_ConfigChannel(&TIM9_Handler,&TIM9_CH1Handler,TIM_CHANNEL_1);
//配置TIM9通道1
HAL_TIM_PWM_ConfigChannel(&TIM9_Handler,&TIM9_CH1Handler,TIM_CHANNEL_2);
//配置TIM9通道2
	
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&TIM9_Handler, &sMasterConfig); 
	
HAL_TIM_PWM_Start(&TIM9_Handler,TIM_CHANNEL_1);//开启PWM通道1
HAL_TIM_PWM_Start(&TIM9_Handler,TIM_CHANNEL_2);//开启PWM通道1
}
Bsp_motor_pwm_init(500-1,84-1) ; //电机PWM端口使能并设置预分频系数和自动重装载系数
/**********
调节pwm

输入:占空比的大小
**********/

void TIM_SetTIM5Compare3(u32 compare1)
{
	TIM5->CCR3=compare1; 
}
void TIM_SetTIM5Compare4(u32 compare2)
{
	TIM5->CCR4=compare2; 
}
void TIM_SetTIM9Compare1(u32 compare3)
{
	TIM9->CCR1=compare3; 
}
void TIM_SetTIM9Compare2(u32 compare4)
{
	TIM9->CCR2=compare4; 
}
这里方便代码的使用,对pwm调用的函数进行了小小的封装
/**********
对电机pwm输出函数进行封装
ID: a 电机序号
功能:b 用来控制电机的运动速度
**********/

void MotorPwm(int a, int b)
{
  if ( a == 1)
  {
   TIM_SetTIM5Compare3(b);
  }
  if ( a == 2)
  {
   TIM_SetTIM5Compare4(b);
  }
  if ( a == 3)
  {
   TIM_SetTIM9Compare1(b);
  }
  if ( a == 4)
  {
   TIM_SetTIM9Compare2(b);
  }
}

你可能感兴趣的:(slamugv)